c++ - mousePressEvent 绑定(bind)不正确?

标签 c++ events qt qgraphicsview

为了熟悉 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/

相关文章:

c++ - 错误 LNK2019 - 抽象类中的虚拟析构函数

python - Qt Designer 或关联的 Qt 工具是否具有针对 xml 格式的 *.ui 文件的全局查找和替换功能?

c++ - 从 C++ 设置 GridView 模型属性而不设置上下文

qt - (Qt) 工具栏中的两行小部件

c++ - 如果某个字符与数组中的前一个字符相同,则跳过该字符

c++ - std::alignas 如何优化程序的性能?

c++ - 这是关于 C++ 中的 <concept> 库的 BUG 吗?

java - 如何隐藏(取消)隐藏 SWT TableItem?

java - 未使用removeEventListener从任何组件中删除ZK事件监听器

events - 如何在 SDL 中检查或检测窗口是否最小化或未激活?