如果想要在QT类中自定义信号槽, 需要满足一些条件, 并且有些事项也需要注意:
1,要编写新的类并且让其继承Qt的某些标准类
2,这个新的子类必须从QObject类或者是QObject子类进行派生
3,在定义类的头文件中加入 Q_OBJECT 宏
自定义信号
1信号是类的成员函数 返回值必须是 void 类型
2信号的名字可以根据实际情况进行指定,参数可以随意指定, 信号也支持重载
3,信号需要使用 signals 关键字进行声明, 使用方法类似于public等关键字
信号函数只需要声明, 不需要定义(没有函数体实现),在程序中发射自定义信号: 发送信号的本质就是调用信号函数,习惯性在信号函数前加关键字: emit, 但是可以省略不写 emit只是显示的声明一下信号要被发射了, 没有特殊含义
#ifndef TEST1_H
#define TEST1_H
#include <QObject>
class Test1 : public QObject
{
Q_OBJECT
public:
explicit Test1(QObject *parent = nullptr);
signals:
public slots:
void SayLove();
};
#endif // TEST1_H
#ifndef TESTSLOTS_H
#define TESTSLOTS_H
#include <QObject>
class TestSlots : public QObject
{
Q_OBJECT
public:
explicit TestSlots(QObject *parent = nullptr);
signals:
void SayHello();
public slots:
// void SayToo();
};
#endif // TESTSLOTS_H
#include "test1.h"
#include<QDebug>
Test1::Test1(QObject *parent)
: QObject{parent}
{
}
void Test1::SayLove()
{
qDebug()<<"I Love you";
}
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
//start是QPushButton 用connect 连接 发送者 接受者
connect(ui->start,&QPushButton::clicked,this,&MainWindow::emitsignal);
test1=new Test1(this);
testslots=new TestSlots(this);
connect(testslots,&TestSlots::SayHello,test1,&Test1::SayLove);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::emitsignal()
{
emit testslots->SayHello();
}
运行结果如下: