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-&gt;ignore(); 放在 mesg.exec() 之后,它可以正常工作。我知道这不是一个解决方案(因为它可能会导致各种奇怪的行为),但我确实想知道为什么它会起作用。这是否揭示了我在实施过程中可能犯的任何错误的关键信息?

更新 3:有人告诉我应该尝试将 mousePressEvent 更改为 mouseReleaseEvent。奇怪的是,这行得通。据我所知,这两个事件之间的唯一区别是第一个事件在您按下鼠标按钮时触发,而后者在您释放该按钮时触发。那么为什么mouseReleaseEvent 会触发所需的行为而mousePressEvent 不会呢?

【问题讨论】:

你是如何绑定的?您是否使用connect() 手动创建连接?还是你允许 Qt 在 MOC 中做它自己? 我自己不做绑定。我只是确保在单击元素时必须执行 mousePressEvent 函数。 关于更新 2:event-&gt;ignore() 基本上是说您希望事件不在此处理程序处结束,而是可能传播(sp?)到另一个处理程序(如果存在)。不知道为什么这是有效的,因为我无法看到您的代码,因为链接对我不起作用。 这行得通吗? pieterdedecker.be/tmp/QtChess2.zip 【参考方案1】:

当你在做this-&gt;x_id 时,你得到的是 RECT 的 x 位置,而不是你的鼠标点击。您必须从事件中获取event-&gt;::pos()。文档是here。

【讨论】:

我知道,但是 x_idy_id 自定义。第二行的第一个图块有x_id 0 和y_id 1,依此类推。 (我刚刚注意到我错误地使用了 X 和 Y;我稍后会更正。) 我更新了我的代码和问题。我希望这能消除我对x_idy_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事件怎么办?

pr里如何绑定视频和音频

QWidget::mousePressEvent() 同时在两个小部件上

在 QTableWidgetItem 中设置 mousePressEvent 处理程序

事件(QEvent*)与 mousePressEvent(QMouseEvent *)冲突?