自定义信号和槽
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()<<"槽函数";
}
子类注意事项
如果不打钩,会找不到槽函数