本以为自己对Qt的信号与槽的机制掌握的还不错,经过这几天我写的bug,还是发现我只是一小菜鸟。
现在总结一下这几天写的bug是因为什么引起的。下面我先举一个bug,注意,一下代码存在bug,千万不要复制。
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QDebug>
#include "signal_one.h"
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
Signal_one *mySignal_one;
void myslot(int num);
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
mySignal_one=new Signal_one(this); connect(mySignal_one,&Signal_one::sendSignalToWidget,this,&Widget::myslot);
}
Widget::~Widget()
{
delete ui;
}
void Widget::myslot(int num)
{
qDebug() << num;
}
下面是我自定义的类,继承与QObject
signal_one.h
#ifndef SIGNAL_ONE_H
#define SIGNAL_ONE_H
#include <QObject>
#include <QDebug>
class Signal_one : public QObject
{
Q_OBJECT
public:
explicit Signal_one(QObject *parent = nullptr);
signals:
void sendSignalToWidget(int);
public slots:
};
#endif // SIGNAL_ONE_H
signal_one.cpp
#include "signal_one.h"
Signal_one::Signal_one(QObject *parent) : QObject(parent)
{
emit sendSignalToWidget(7);
}
bug描述:sendSignalToWidget(7)没有把7发射出去,没有执行相应的槽函数。
产生原因:因为把发射信号写在了构造函数里面,当构造一个Signal_one类的对象的时候就发射信号了,但是connect是在发射信号后才执行,可能就是这个原因,导致信号没发射出去。后来,把发射信号写到一个函数里面,先connect,再发射信号,这样就正常接收到信号。
下面是正确的代码:
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QDebug>
#include "signal_one.h"
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
Signal_one *mySignal_one;
void myslot(int num);
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
mySignal_one=new Signal_one(this);
connect(mySignal_one,&Signal_one::sendSignalToWidget,this,&Widget::myslot);
mySignal_one->sendSignal();
}
Widget::~Widget()
{
delete ui;
}
void Widget::myslot(int num)
{
qDebug() << num;
}
signal_one.h
#ifndef SIGNAL_ONE_H
#define SIGNAL_ONE_H
#include <QObject>
#include <QDebug>
#include "signal_two.h"
class Signal_one : public QObject
{
Q_OBJECT
public:
explicit Signal_one(QObject *parent = nullptr);
void sendSignal();
signals:
void sendSignalToWidget(int);
public slots:
};
#endif // SIGNAL_ONE_H
signal_one.cpp
#include "signal_one.h"
Signal_one::Signal_one(QObject *parent) : QObject(parent)
{
}
void Signal_one::lv()
{
emit sendSignalToWidget(7);
}