Чтобы ознакомиться с графическим представлением 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
нет?