mousePressEvent 没有正确绑定?
Posted
技术标签:
【中文标题】mousePressEvent 没有正确绑定?【英文标题】:mousePressEvent not binding correctly? 【发布时间】: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?)到另一个处理程序(如果存在)。不知道为什么这是有效的,因为我无法看到您的代码,因为链接对我不起作用。
这行得通吗? pieterdedecker.be/tmp/QtChess2.zip
【参考方案1】:
当你在做this->x_id
时,你得到的是 RECT 的 x 位置,而不是你的鼠标点击。您必须从事件中获取event->::pos()
。文档是here。
【讨论】:
我知道,但是x_id
和 y_id
自定义。第二行的第一个图块有x_id
0 和y_id
1,依此类推。 (我刚刚注意到我错误地使用了 X 和 Y;我稍后会更正。)
我更新了我的代码和问题。我希望这能消除我对x_id
和y_id
所做的一些困惑。
您是否完全确定在初始化对象时正确设置了 x_id (row_id) 和 y_id (col_id)?是否有可能看到更多代码(主要与BoardTile
对象的初始化有关
关于这个答案,使用这个event::pos()
函数来查看你点击了哪个矩形相对容易。为所有矩形创建一个列表、向量或 w/e 容器。单击时,获取单击的鼠标位置,然后循环遍历矩形,检查单击是否在每个矩形的左上角和右下角 x,y 内。一个循环解决了这个问题(没有看到关于它如何实现 atm 的任何其他内容,因为我看不到源代码)
手动确定点击了哪个矩形听起来有点违背 Qt 事件的目的。这是奇怪的部分:mouseReleaseEvent
确实可以正常工作。关于为什么会按预期工作而 mousePressEvent
没有的任何猜测?以上是关于mousePressEvent 没有正确绑定?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 QPushButtons 上使用 mousePressEvent
100分求助,Qt继承自QGraphicsItem的控件响应不了mousePressEvent事件怎么办?
QWidget::mousePressEvent() 同时在两个小部件上