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 са персонализирани. Първата плочка на втория ред има 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 контейнер, който искате от всички rects. Когато се щракне върху едно, вземете местоположението на щракването на мишката и преминете през вашите правоъгълници, като проверите дали щракването е в горния ляв и долния десен x,y на всеки правоъгълник. Един цикъл решава този проблем (без да виждам нищо друго за това как е внедрен atm, защото не мога да видя източника) - person g19fanatic; 10.11.2010
comment
Ръчното определяне върху кой правоъгълник е щракнато звучи някак си напълно отхвърля целта на събитията на Qt. Ето странната част: mouseReleaseEvent работи правилно. Някакви предположения защо това работи според очакванията, а mousePressEvent не? - person Pieter; 11.11.2010
comment
връзката ти е мъртъв bw. - person dhein; 02.05.2016