2010-09-05 28 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