Чтобы ознакомиться с графическим представлением 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
нет?
connect()
? Или вы позволяете Qt делать это самому в MOC? - person g19fanatic   schedule 09.11.2010mousePressEvent
, которая должна выполняться при щелчке элемента. - person Pieter   schedule 09.11.2010event->ignore()
в основном говорит о том, что вы хотите, чтобы событие не заканчивалось в этом обработчике, а, возможно, распространялось (sp?) на другой обработчик (если он есть). Не уверен, почему это работает, поскольку я не вижу ваш код, поскольку ссылка у меня не работает. - person g19fanatic   schedule 10.11.2010