qt5-信号和槽_#include

自定义信号和槽

win.h

#ifndef WIN_H
#define WIN_H

#include <QWidget>
#include <QDebug>
#include <QPushButton>

class Win : public QWidget
{
Q_OBJECT

public:
Win(QWidget *parent = nullptr);
~Win();

signals: //信号标记
void sigFunc(void);//自定义信号函数,只需声明,不能写定义
public slots: //槽标记
void slotFunc(void); //自定义槽函数
//槽函数也可以当做普通的成员函数,直接调用

};
#endif // WIN_H


win.cpp

#include "win.h"

Win::Win(QWidget *parent)
: QWidget(parent)
{

connect(this,SIGNAL(sigFunc()),this,SLOT(slotFunc()));//信号连接槽函数
emit sigFunc(); //发射信号
}

Win::~Win()
{
}

void Win::slotFunc()
{
qDebug()<<"自定义槽函数";
}



但是信号却没有函数体定义,另外,信号的返回类型都是 void,不要指望能从信号返回什么有用信息

槽可以有参数,但槽的参数不能有缺省值

槽也能够声明为虚函数

信号与槽函数的连接 

#include <QApplication>
#include <QPushButton>
#include <QWidget>
#include <QLabel>

int main(int argc,char **argv)
{
QApplication app(argc,argv);
QWidget win;
win.resize(400,200);
QPushButton button("按钮",&win);
button.move(10,10);
QLabel label("标签",&win);
label.move(10,100);
win.show();

//实现点击按钮关闭标签
QObject::connect(&button,SIGNAL(clicked(void)),&label,SLOT(close(void)));//信号连接槽函数

return app.exec();
}
/*
QObject::connect(
const QObject *sender, //信号发送对象,可以是QObject的所有子类
const char *signal, //信号函数
const QObject *receiver, //信号接受对象,可以是QObject的所有子类
const char *method, //槽函数
Qt::ConnectionType type = Qt::AutoConnection) //连接类型--枚举类型
参数5:Qt::AutoConnection 根据signal和slot所处的线程自动决定--默认
Qt::DirectConnection 是直接连接。相当于直接调用slot函数
*/

/*
SIGNAL(信号函数(参数表)) //将信号函数转换为const char*
SLOT(槽函数(参数表)) //将槽函数转换为const char*
*/


一个信号可以同时连接多个槽函数

多个信号可以同时连接到同一个槽函数 

两个信号函数可以直接连接

QObject::connect(A1,SIGNAL(sigfunc1(int)),A2,SIGNAL(sigfunc2(int)));

当A1发送信号时,所连接的A2对象的信号也将被发送


断开连接

bool b=disconnect(button,SIGNAL(clicked(void)),this,SLOT(f(void))); //断开连接
//如果连接成功断开,则返回 true;否则返回 false
//当所涉及的任何一个对象被销毁时,信号槽连接被移除
//0 可以用作通配符,分别表示“任意信号”、“任何接收对象”或“接收对象中的任何槽”,sender发送者永远不会是0




qt5格式

使用SIGNAL和SLOT是qt4格式


win.h

#ifndef WIN_H
#define WIN_H

#include <QWidget>
#include <QPushButton>
#include <QDebug>

class win : public QWidget
{
Q_OBJECT

public:
win(QWidget *parent = nullptr);
~win();

QPushButton* button;

public slots:
void slotFunc(void);



};
#endif // WIN_H



win.cpp

#include "win.h"

win::win(QWidget *parent)
: QWidget(parent)
{

this->resize(400,300);

button=new QPushButton("确定",this);
QObject::connect(button, &QPushButton::clicked,this, &win::slotFunc);

}

win::~win()
{
}

void win::slotFunc()
{
qDebug()<<"槽函数";
}



子类注意事项

qt5-信号和槽_自定义_02

如果不打钩,会找不到槽函数