简体   繁体   English

C ++ Qt信号和插槽未触发

[英]C++ Qt signal and slot not firing

I am having difficulty in my Qt program with connecting button signals to my slots. 将按钮信号连接到插槽时,我在Qt程序中遇到困难。 My code is: 我的代码是:

Main.cpp 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 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 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();
}

The program outputs the following: 程序输出以下内容:

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

The code seems right, no compiler warnings. 该代码似乎正确,没有编译器警告。 Just this output at runtime. 只是在运行时输出。 But it looks like I hooked the signals and slots up correctly. 但是看起来我正确连接了信号和插槽。

Add Q_OBJECT to your class, like this: Q_OBJECT添加到您的课程中,如下所示:

class MainWidget : public QWidget
{
    Q_OBJECT

You also have to run moc to generate some helper code. 您还必须运行moc来生成一些帮助程序代码。 qmake does that automatically for your, but if you compile this yourself, you need to run moc. qmake会自动为您执行此操作,但是如果您自己进行编译,则需要运行moc。

When I started with Qt, I had this problem a lot. 当我开始使用Qt时,我经常遇到这个问题。 As I see it your slots are defined wrong. 如我所见,您的广告位定义错误。 If you look at the signature for the signal ( Qt Clicked Signal Docs ), you will see that the argument list is ( bool clicked = false) . 如果查看信号的签名( Qt Clicked Signal Docs ),您会看到参数列表为( bool clicked = false)

The way Qt's signal & slots connect work at run time, is that it will only connect the signal and slot if they have the exact same signatures. Qt的信号和插槽在运行时连接工作的方式是,仅当信号和插槽具有完全相同的签名时,它才会连接信号和插槽。 If they don't match exactly, no connection. 如果它们不完全匹配,则没有连接。

so in MainWidget.h 所以在MainWidget.h中

 public slots:
        void bAdvice_clicked(bool);

In MainWidget.cpp 在MainWidget.cpp中

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

Things will start working for you. 一切都会为您服务。

Edited: 编辑:

Compiled your code and all the slots were correctly called. 编译代码,所有插槽均被正确调用。 It was just the Q_OBJECT macro that was missing. 只是缺少Q_OBJECT宏。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM