mousePressEvent неправильно привязывается?

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


person Pieter    schedule 09.11.2010    source источник
comment
Как ты привязываешься? Вы вручную создаете соединение с помощью connect()? Или вы позволяете Qt делать это самому в MOC?   -  person g19fanatic    schedule 09.11.2010
comment
Я не делаю привязку сама. Я просто удостоверяюсь, что есть функция mousePressEvent, которая должна выполняться при щелчке элемента.   -  person Pieter    schedule 09.11.2010
comment
относительно обновления 2: event->ignore() в основном говорит о том, что вы хотите, чтобы событие не заканчивалось в этом обработчике, а, возможно, распространялось (sp?) на другой обработчик (если он есть). Не уверен, почему это работает, поскольку я не вижу ваш код, поскольку ссылка у меня не работает.   -  person g19fanatic    schedule 10.11.2010
comment
Это работает? pieterdedecker.be/tmp/QtChess2.zip   -  person Pieter    schedule 10.11.2010


Ответы (1)


Когда вы делаете this->x_id, вы получаете позицию x RECT, а не щелчок мышью. Вы должны сделать event->::pos() взятое из события. Документы находятся здесь.

person g19fanatic    schedule 09.11.2010
comment
Я знаю, но x_id и y_id определяются пользователем. 1-я плитка во 2-м ряду имеет x_id 0 и y_id 1 и так далее. (Я только что заметил, что неправильно использую X и Y; я исправлю это позже.) - person Pieter; 09.11.2010
comment
Я обновил свой код и вопрос. Я надеюсь, что это проясняет некоторую путаницу в том, что я сделал с x_id и y_id. - person Pieter; 09.11.2010
comment
Вы полностью уверены, что правильно устанавливаете x_id (row_id) и y_id (col_id) при инициализации объектов? Можно ли увидеть больше кода (в основном относящегося к инициализации вашего объекта BoardTile - person g19fanatic; 09.11.2010
comment
Что касается этого ответа, относительно легко использовать эту функцию event::pos(), чтобы увидеть, какой прямоугольник вы щелкнули. Создайте список, вектор или w/e контейнер, который вы хотели бы из всех прямоугольников. Когда один из них щелкнут, получите местоположение щелчка мышью и прокрутите свои прямоугольники, проверяя, находится ли щелчок в верхнем левом и нижнем правом углу x, y каждого прямоугольника. Один цикл решает эту проблему (не видя ничего другого о том, как он реализован в банкомате, потому что я не вижу источник) - person g19fanatic; 10.11.2010
comment
Ручное определение того, какой прямоугольник был нажат, звучит как нечто, полностью противоречащее цели событий Qt. Вот странная часть: mouseReleaseEvent работает правильно. Есть предположения, почему это работает так, как ожидалось, а mousePressEvent нет? - person Pieter; 11.11.2010
comment
ваша ссылка мертва кстати. - person dhein; 02.05.2016