0

为了熟悉 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:有人告诉我应该尝试更改mousePressEventmouseReleaseEvent. 奇怪的是,这行得通。据我所知,这两个事件之间的唯一区别是第一个事件在您按下鼠标按钮时触发,而后者在您释放该按钮时触发。那么为什么会mouseReleaseEvent触发所需的行为而mousePressEvent不会呢?

4

1 回答 1

3

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

于 2010-11-09T18:00:49.207 回答