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();
}

2 行目の最初のタイルをクリックすると、次のメッセージが表示されます。

クリックされたタイル (1, 0)

次に、他のタイルをクリックすると、まったく同じメッセージが表示されます。メッセージの内容は、最初にクリックしたタイルによって異なります。どうしてこれなの?mousePressEventを間違ってバインドしましたか?

完全なコード http://www.box.net/shared/4m6nrvuxa4 (アップデート 1)

更新 2event->ignore(); : afterを付けるmesg.exec()と正常に動作することに気付きました。私はそれが解決策ではないことを知っています(おそらくあらゆる種類の奇妙な動作につながるため)が、なぜそれがうまくいくのか知りたい. これは、実装で犯した可能性のある間違いについて何か重要なことを明らかにしていますか?

更新 3mousePressEvent : に変更してみるべきだと誰かに言われましたmouseReleaseEvent。奇妙なことに、それは機能します。私の知る限り、2 つのイベントの唯一の違いは、最初のイベントはマウス ボタンを押したときにトリガーされ、後者はそのボタンを離したときにトリガーされることです。では、なぜmouseReleaseEvent望ましい動作をトリガーし、トリガーmousePressEventしないのでしょうか?

4

1 に答える 1

3

やっているときthis->x_idは、マウスのクリックではなく、RECT の x 位置を取得しています。event->::pos()イベントから取得する必要があります。ドキュメントはこちらです。

于 2010-11-09T18:00:49.207 に答える