2016-07-21 8 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 객체 컴파일러를 통해 관리됩니다. 기본적으로 moc는 효과적으로 신호와 슬롯 메커니즘을 구현하기 위해 Q_OBJECT 매크로를 포함하는 각 클래스에 대해 추가 C++ 코드를 생성합니다. 추가 코드는 원래 클래스 선언에 링크됩니다.

여기서 문제는 클래스가 main.cpp에서 선언되었다는 것입니다. 이는 moc가 코드와 어떻게 작동하는지와 충돌합니다. 클래스를 별도의 헤더로 선언해야합니다.

More about the moc

편집 : 하이드는 대안이 CPP는 Moc에 의해 생성 된 파일에 포함하는 것입니다 지적로; more details

+2

필요하지 않습니다. .h 파일이 필요 없습니다. 질문 아래의 링크를 참조하십시오 (그리고 답을 자유롭게 업데이트하십시오). – hyde

2

여러분의 cpp 소스 파일에 #include"main.moc" 줄을 추가하기 만하면됩니다.