Проблем при свързването на сигнал на QPushButton към слота на QGraphicsView

Имам проблем със свързването на сигнал в QPushButton към слот в моя QGraphicsView.

Заглавката на моя бутон за натискане:

class Button : public QPushButton {

    Q_OBJECT

    public://public constructors / destructors

        Button(Game_state * game_state, QWidget *parent = 0);
        ~Button();

    protected://signals / slots etc QT 
        void mousePressEvent(QMouseEvent * event);//

    signals:
        void updated() { std::cout << "HELLO FROM THE UPDATED METHOD" << std::endl;}

    protected:
        Game_state * game_state;//this is the global gamestate method
        char * action_name;//this is the application name that is responsible for setting the game_state so the game controller knows what to delete / update

};

Имате нужда от макроса Q_Object, за да компилираме това със слотове, но когато компилирам, продължавам да получавам препратка към vtable, която не е намерена, както следва:

Undefined symbols for architecture x86_64:
  "vtable for Button", referenced from:
      Button::~Button()in buttons.o
      Button::~Button()in buttons.o
      Button::~Button()in buttons.o
      Button::Button(Game_state*, QWidget*)in buttons.o
      Button::Button(Game_state*, QWidget*)in buttons.o

Когато извадя макроса, мога да го компилирам добре, но продължавам да получавам тази грешка, когато стартирам:

Object::connect: No such signal QPushButton::updated() in implementation/game_controller.cpp:11

Моят game_controller разширява QGRaphicsView и ето моят код, където се опитвам да свържа бутона:

this->button = new Button(game_state);
this->proxy = new QGraphicsProxyWidget();
this->proxy = this->scene->addWidget(this->button);

connect(this->button, SIGNAL(updated()), this, SLOT(update()));

Всяка помощ ще бъде високо оценена


person JonMorehouse    schedule 30.11.2012    source източник
comment
Спъвал съм се в това. Определено се нуждаете от Q_OBJECT, за да работят сигналът/слотовете. След като го върнахте, стартирахте ли отново qmake? Всъщност make clean, qmake и make просто от параноя. Не поставих това като отговор, защото съм само 93% сигурен, но мисля, че това ще го оправи.   -  person Mark Stevens    schedule 01.12.2012
comment
@MarkStevens току-що опита това и все още получава липсващата vtable грешка, както преди   -  person JonMorehouse    schedule 01.12.2012
comment
Добре, втората най-честа причина да получите това в Qt (и по-скоро това, което всъщност казва съобщението) е, че виртуален метод е дефиниран, но не е внедрен. Вашият mousePressEvent() има ли реализация? Какво ще кажете за вашите конструктори/деструктори?   -  person Mark Stevens    schedule 01.12.2012
comment
Да, всички те са изпълнени перфектно. Когато извадих qobject, функционалността за щракване работеше (но слотът беше в самия бутон). Току-що прочетох някъде другаде, че трябва да използвам qwidget, който инстанцира самия бутон   -  person JonMorehouse    schedule 01.12.2012
comment
Съжалявам, наистина реших, че мога да ви помогна с това. Ето един човек, който имаше точно същия проблем - може би едно от тези предложения ще свърши работа за вас: stackoverflow.com/questions/9370264/   -  person Mark Stevens    schedule 01.12.2012
comment
Това обикновено се причинява от проблем с .o файловете, които не се генерират/заменят правилно. Като допълнителна проверка отидете във вашата изходна директория (където завършват .o файловете) и изтрийте всичко, което е там ръчно, след което изградете отново.   -  person Arnold Spence    schedule 01.12.2012
comment
@ArnoldSpence Всички мои .o файлове са изтрити и все още не работи   -  person JonMorehouse    schedule 01.12.2012
comment
Е, тогава нека опитаме да видим .cpp кода :)   -  person Arnold Spence    schedule 01.12.2012
comment
Защо имате тяло в декларацията на сигнала?   -  person Daniel Castro    schedule 01.12.2012


Отговори (1)


Запазете Q_OBJECT, имате нужда от него за moc

Не пишете тялото на вашия сигнал, moc генерира код за всички сигнали.

Не обработвайте mousePressedEvent, обработвайте сигнала clicked (), който е наличен на QAbstractButton и всички негови дъщерни класове

person cppguy    schedule 01.12.2012