为了熟悉 Qt 的图形 View ,我在 Qt 中实现了一个简单的棋盘。目前没有棋子。
我使用矩形来表示每个图 block ,所以我创建了 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();
}
当我单击第二行的第一个图 block 时,我收到以下消息:
Clicked tile (1, 0)
然后,当我单击任何其他图 block 时,我会收到完全相同的消息。消息的内容取决于我先点击哪个图 block 。为什么是这样?我是否错误地绑定(bind)了 mousePressEvent
?
完整代码 http://www.box.net/shared/4m6nrvuxa4 (更新 1)
更新 2:我注意到如果我将 event->ignore();
放在 mesg.exec()
之后,它工作正常.我知道这不是解决方案(因为它可能会导致各种奇怪的行为),但我确实想知道为什么它会起作用。这是否揭示了关于我在实现过程中可能犯的任何错误的任何重要信息?
更新 3:有人告诉我应该尝试将 mousePressEvent
更改为 mouseReleaseEvent
。奇怪的是,这行得通。据我所知,这两个事件之间的唯一区别是第一个事件在您按下鼠标按钮时触发,而后者在您释放该按钮时触发。那么为什么 mouseReleaseEvent
会触发所需的行为而 mousePressEvent
不会呢?
最佳答案
当您执行 this->x_id
时,您将获得 RECT 的 x 位置,而不是鼠标单击。您必须执行从事件中获取的 event->::pos()
。文档是 here .
关于c++ - mousePressEvent 绑定(bind)不正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4136787/