【发布时间】:2010-11-09 17:47:49
【问题描述】:
为了熟悉 Qt 的图形视图,我在 Qt 中实现了一个简单的棋盘。目前还没有棋子。
我使用矩形来表示每个图块,因此我创建了 BoardTile 类(继承自 QGraphicsRectItem),以便我可以定义 mousePressEvent。
这是我与鼠标点击相关的一小段测试代码:
void BoardTile::mousePressEvent(QGraphicsSceneMouseEvent *event) {
QMessageBox mesg;
std::stringstream mesgText;
mesgText << "Clicked tile (" << this->row_id << ", " << this->col_id << ").";
mesg.setText(QString::fromStdString(mesgText.str()));
mesg.exec();
}
当我单击第二行的第一个图块时,我收到以下消息:
点击的图块 (1, 0)
然后,当我单击任何其他图块时,我会收到完全相同的消息。消息的内容取决于我首先单击的哪个图块。为什么是这样?我是否错误地绑定了mousePressEvent?
完整代码 http://www.box.net/shared/4m6nrvuxa4 (更新 1)
更新 2:我注意到如果我将 event->ignore(); 放在 mesg.exec() 之后,它可以正常工作。我知道这不是一个解决方案(因为它可能会导致各种奇怪的行为),但我确实想知道为什么它会起作用。这是否揭示了我在实施过程中可能犯的任何错误的关键信息?
更新 3:有人告诉我应该尝试将 mousePressEvent 更改为 mouseReleaseEvent。奇怪的是,这行得通。据我所知,这两个事件之间的唯一区别是第一个事件在您按下鼠标按钮时触发,而后者在您释放该按钮时触发。那么为什么mouseReleaseEvent 会触发所需的行为而mousePressEvent 不会呢?
【问题讨论】:
-
你是如何绑定的?您是否使用
connect()手动创建连接?还是你允许 Qt 在 MOC 中做它自己? -
我自己不做绑定。我只是确保在单击元素时必须执行
mousePressEvent函数。 -
关于更新 2:
event->ignore()基本上是说您希望事件不在此处理程序处结束,而是可能传播(sp?)到另一个处理程序(如果存在)。不知道为什么这是有效的,因为我无法看到您的代码,因为链接对我不起作用。
标签: c++ events qt qgraphicsview