我在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
代码似乎没错,没有编译器警告。只是在运行时输出。但看起来我正确地挂上了信号和插槽。
答案 0 :(得分:14)
将Q_OBJECT
添加到您的课程中,如下所示:
class MainWidget : public QWidget { Q_OBJECT
您还必须运行moc以生成一些帮助程序代码。 qmake会为您自动执行此操作,但如果您自己编译,则需要运行moc。
答案 1 :(得分:3)
当我开始使用Qt时,我遇到了很多问题。我认为你的插槽定义错了。如果你查看信号的签名(Qt Clicked Signal Docs),你会看到参数列表是(bool clicked = false)
。
Qt信号的方式&amp;插槽在运行时连接工作,如果它们具有完全相同的签名,它将仅连接信号和插槽。如果它们不完全匹配,则没有连接。
所以在MainWidget.h中
public slots:
void bAdvice_clicked(bool);
在MainWidget.cpp中
connect(bAdvice, SIGNAL(clicked(bool)), this, SLOT(bAdvice_clicked(bool)));
事情将开始为你工作。
答案 2 :(得分:2)
编辑:
编译代码并正确调用所有插槽。 只是缺少了Q_OBJECT宏。