Проблема с подключением сигнала 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