2010-09-05 51 views
7

我在Qt程序中連接按鈕信號到我的插槽時遇到困難。我的代碼是:C++ Qt信號和插槽沒有觸發

Main.cpp的

#include <QtGui/QApplication> 
#include "MainWidget.h" 

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

    MainWidget mainWidget; 
    mainWidget.show(); 

    return app.exec(); 
} 

MainWidget.h

#ifndef MAINWIDGET_H 
#define MAINWIDGET_H 

#include <QWidget> 

class MainWidget : public QWidget 
{ 
public: 
    MainWidget(); 

public slots: 
    void bAdvice_clicked(); 
    void bWeather_clicked(); 
    void bNextMeeting_clicked(); 
    void bQuit_clicked(); 
}; 

#endif // MAINWIDGET_H 

MainWidget.cpp

#include "MainWidget.h" 
#include <QMessageBox> 
#include <QPushButton> 
#include <QTextEdit> 
#include <QVBoxLayout> 

MainWidget::MainWidget() 
{ 
    QLayout *layout = new QVBoxLayout(); 
    this->setLayout(layout); 

    QTextEdit *message = new QTextEdit(); 
    layout->addWidget(message); 

    QPushButton *bAdvice = new QPushButton("Advice"); 
    connect(bAdvice, SIGNAL(clicked()), this, SLOT(bAdvice_clicked())); 
    layout->addWidget(bAdvice); 

    QPushButton *bWeather = new QPushButton("Weather"); 
    connect(bWeather, SIGNAL(clicked()), this, SLOT(bWeather_clicked())); 
    layout->addWidget(bWeather); 

    QPushButton *bNextMeeting = new QPushButton("Next Meeting"); 
    connect(bNextMeeting, SIGNAL(clicked()), this, SLOT(bNextMeeting_clicked())); 
    layout->addWidget(bNextMeeting); 

    QPushButton *bQuit = new QPushButton("Quit"); 
    connect(bQuit, SIGNAL(clicked()), this, SLOT(bQuit_clicked())); 
    layout->addWidget(bQuit); 
} 

void MainWidget::bAdvice_clicked() 
{ 
} 

void MainWidget::bWeather_clicked() 
{ 
} 

void MainWidget::bNextMeeting_clicked() 
{ 
    QMessageBox::information(this, "Next Meeting", "Today", QMessageBox::Ok); 
} 

void MainWidget::bQuit_clicked() 
{ 
    this->close(); 
} 

該程序輸出如下:

Starting C:\Users\Sameer\Documents\PartAQuestion2\debug\PartAQuestion2.exe... 
Object::connect: No such slot QWidget::bAdvice_clicked() in MainWidget.cpp:16 
Object::connect: No such slot QWidget::bWeather_clicked() in MainWidget.cpp:20 
Object::connect: No such slot QWidget::bNextMeeting_clicked() in MainWidget.cpp:24 
Object::connect: No such slot QWidget::bQuit_clicked() in MainWidget.cpp:28 

C:\Users\Sameer\Documents\PartAQuestion2\debug\PartAQuestion2.exe exited with code 0 

代碼似乎沒錯,沒有編譯器警告。運行時只是這個輸出。但它看起來像我正確地掛鉤信號和插槽。

回答

13

添加Q_OBJECT到您的類,像這樣:

class MainWidget : public QWidget 
{ 
    Q_OBJECT 

你還必須運行建設部產生一些輔助代碼。 qmake自動爲你做,但如果你自己編譯這個,你需要運行moc。

+0

感謝您的快速響應。但是,請你更具體一些,因爲我對此很新穎。 我改變了我的代碼,在打開花括號後立即添加Q_OBJECT。還是一樣的結果。 我正在使用Qt Creator IDE。 – c0d3L0g1c 2010-09-05 11:37:32

+0

添加Q_OBJECT後會發生什麼?你如何編譯你的代碼? – 2010-09-05 11:40:27

+0

我改變了我的代碼,在打開花括號後立即添加Q_OBJECT。還是一樣的結果。我正在使用Qt Creator IDE。 – c0d3L0g1c 2010-09-05 11:42:27

2

編輯:

編譯代碼和所有的插槽被正確調用。 這只是錯過了Q_OBJECT宏。

+0

我已經授予Uli Schlachter的積分,因爲他確實指出了我的正確方向。感謝大家的貢獻! – c0d3L0g1c 2010-09-05 12:42:13

3

當我開始使用Qt時,我遇到了很多問題。正如我所看到的,您的插槽定義錯誤。如果你看一下信號(Qt Clicked Signal Docs)的簽名,你會看到參數列表(bool clicked = false)

Qt的信號&插槽在運行時連接的工作方式是,它只能連接信號和槽如果他們有相同的簽名。如果他們不完全匹配,沒有任何聯繫。

所以MainWidget.h

public slots: 
     void bAdvice_clicked(bool); 

在MainWidget.cpp

connect(bAdvice, SIGNAL(clicked(bool)), this, SLOT(bAdvice_clicked(bool))); 

事情將開始爲你工作。

+0

但我得到** ** QPushButton **沒有布爾類型參數 – Tracy 2011-05-01 16:23:24