За да се запозная с графичния изглед на 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