2016-07-21 7 views
3

Я написал небольшую программу с собственным классом в main.cpp. Здесь код:Q_OBJECT или нет Q_OBJECT

#include <QApplication> 
#include <QPushButton> 
#include <QLabel> 

class MyWidget : public QWidget { 
    //Q_OBJECT 
public: 
    MyWidget(QWidget* parent = 0); 
    QLabel* label; 
    QString string; 

signals: 
public slots: 
    void setTextLabel(); 

}; 

void MyWidget::setTextLabel() { 
    label->setText("Test"); 
} 


MyWidget::MyWidget(QWidget* parent) 
    : QWidget(parent) { 

} 

int main(int argc, char** argv) { 
    QApplication app(argc, argv); 

    MyWidget widget; 
    widget.show(); 

    return app.exec(); 
} 

похоже работа, но не «полностью». Мой слот не работает. Полагаю, я должен поставить Q_OBJECT. НО, делая это, у меня есть список ошибок, например:

undefined reference to `vtable for MyWidget' 
........................................ 
collect2: error: ld returned 1 exit status 
make: *** [mywidget] Error 1 

Я могу это сделать? Где проблема?

+0

Можете ли вы объяснить, что вы подразумеваете под словом «Мой слот не работает»? В приведенном выше примере слот 'MyWidget :: setTextLabel' фактически не используется. Также обратите внимание, что ваш конструктор 'MyWidget' не инициализирует элемент' label', который вызывает неопределенное поведение. –

+0

Смотрите это: http://stackoverflow.com/questions/34928933/why-is-important-to-include-moc-file-at-end-of-a-qt-source-code-file – hyde

ответ

4

Сигналы и слоты в Qt управляются через компилятор moc: meta object. В основном, moc генерирует дополнительный код C++ для каждого класса, содержащего макрос Q_OBJECT, чтобы эффективно реализовать механизмы сигналов и слотов. Дополнительный код затем связан с первоначальным объявлением класса.

Проблема в том, что ваш класс объявлен в main.cpp: это конфликтует с тем, как moc работает с вашим кодом. Вы должны объявить свой класс в отдельном заголовке.

More about the moc

Edit:, как Хайд отметил, альтернатива для включения в CPP этот файл генерируется МОС; more details

+2

Не нужно, вы не нужен файл .h. См. Ссылку под вопрос (и не стесняйтесь обновлять свой ответ). – hyde

2

просто добавьте строку #include"main.moc" в исходный файл cpp должно быть достаточно.