Qt5信号和槽

自定义信号和槽

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()<<"槽函数";
}

子类注意事项

 

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

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值