为了使自己熟悉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
没有触发? 最佳答案
当您执行this->x_id
时,您将获得RECT的x位置,而不是鼠标单击。您必须从事件中摘录。该文档是here。