2013-02-22 2 views
0

Qt에서 프로그램을 작성했지만 제대로 작동하지만 푸시 버튼을 클릭해도 작동하지 않습니다. 클래스 선언 바로 뒤에 Q_OBJECT를 사용하면 컴파일 오류가 발생합니다.Qt : 신호와 슬롯 및 Q_OBJECT

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

    class Communicate : public QWidget 
    { 
    // Q_OBJECT 

     public: 
     Communicate(QWidget *parent = 0); 

     private slots: 
     void OnPlus(); 
     void OnMinus(); 

     private: 
     QLabel *label; 

    }; 

    Communicate::Communicate(QWidget *parent) 
     : QWidget(parent) 
    { 
     QPushButton *plus = new QPushButton("+", this); 
     plus->setGeometry(50, 40, 75, 30); 

     QPushButton *minus = new QPushButton("-", this); 
     minus->setGeometry(50, 100, 75, 30); 

     label = new QLabel("0", this); 
     label->setGeometry(190, 80, 20, 30); 

     connect(plus, SIGNAL(clicked()), this, SLOT(OnPlus())); 
     connect(minus, SIGNAL(clicked()), this, SLOT(OnMinus())); 
    } 

    void Communicate::OnPlus() 
    { 
     int val = label->text().toInt(); 
     val++; 
     label->setText(QString::number(val)); 
    } 

    void Communicate::OnMinus() 
    { 
     int val = label->text().toInt(); 
     val--; 
     label->setText(QString::number(val)); 
    } 

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

     Communicate window; 

     window.setWindowTitle("Communicate"); 
     window.show(); 

     return app.exec(); 
    } 

답변

0

사용 O_QBJECT 매크로 당신이 얻을 오류를 해결하려면 다음 중 하나를 수행 할 수 있습니다 :

1) 자신의 .H 파일에는 QWidget/QObject를 파생 클래스를 선언하고 여기에

내 코드입니다 자신의 .cpp 파일에 정의하십시오. 또한 당신이 대신 레이아웃을 사용하려면 :

2) (

LE)의 사용법 #include "xxxx.moc"같은 것을 추가 당신이 가지고있는 통화 당에서 클래스 정의 후 MOC에 의해 생성 된 .moc 파일을 포함 setGeometry를 사용하여 위젯을 창에 배치하십시오. here

+0

seperate .h 및 .cpp 파일을 사용할 때 제대로 실행되는 것으로 나타났습니다. 실제로 자습서 코드가 시스템에서 실행됩니다. , 그것은 별도의 파일을 만들려고했다. 나는 나 자신을 위해 수정했고 왜 이런 일이 일어나는지 알고 싶다. 왜 우리는 main.cpp에 모든 것을 쓸 수 없다 ?? 나는 또한 두 번째 방법을 이해하지 못한다. 무엇인가? – shivshnkr

+0

moc는 신호 및 슬롯과 같은 QObject 파생 클래스 기능에 대한 C++ 코드를 생성하는 Qt 도구입니다. 어쨌든 권장되는 방법은 첫 번째 방법이며 위젯을 부모 위치에 수동으로 설정하는 대신 레이아웃 사용에 대한 조언을 무시하지 마십시오. – Zlatomir

+0

main.cpp에 모든 것을 쓸 수없는 이유는 무엇입니까 ?? – shivshnkr

1

moc를 통해 Q_OBJECT 매크로가 들어있는 파일을 실행하고 나머지 응용 프로그램과 함께 출력을 컴파일하고 링크해야합니다. 빌드 시스템에 따라 자동으로 (qmake) 또는 한 줄 정도 추가 (cmake)