QT信号与槽机制

简介: QT信号与槽机制

信号与槽是一种高级接口,称为对象之间的通信,它是QT的核心特性(有点类似MFC的消息机制)。


信号


当QPushButton,在鼠标单击后发射clicked()时,某个信号指示客户或所有者发送其内部状态发生变化,信号将被一个对象发射。


  • 信号只声明不实现。

signals:
    void showDlg(); /*返回类型都是void*/


  • 信号可以通过关键字emit来发射


emit showDlg();


槽函数


插槽函数可以像普通的C ++成员函数一样,可以被正常调用,也可以与信号关联。当关联的信号被发射时,这个插槽函数就会被调用。


槽函数也存在权限:


  • public slots:任何对象都可将将信号与之相连接。


  • protected slots:当前类及其子类可以将信号与之相连接。


  • private slots:只有类自己可以将信号与之相连接。


信号与槽函数的连接


static QMetaObject::Connection connect(const QObject *sender,\
 const char *signal,const QObject *receiver, \
 const char *member, Qt::ConnectionType = Qt::AutoConnection);


  • 发件人:信号发射者对象


  • 信号:信号


  • 接收器:信号接收者


  • 成员:槽函数


  • ConnectionType:连接类型。默认自动连接


一个信号连接一个槽


一个信号要和槽函数成功相连,他们的参数必须具有相同的顺序和相同的类型,或者允许信号的参数比槽函数多,槽会自动忽略掉多余的参数而进行调用


QObject::connect(btn, SIGNAL(clicked(bool)), this, \
SLOT(btnAddClicked()));


一个信号可以连接多个槽


使用QObject :: connect将一个信号连接到多个槽时,当信号发射时,将按声明联系时的顺序顺序调用


connect(A,SIGNAL(recvFinshed(const QList<QByteArray> &)), B , \
SLOT(onRecvFinsed(const QList<QByteArray> &)));
connect(A,SIGNAL(recvFinshed(const QList<QByteArray> &)), C ,\
SLOT(onRecvFinsed(const QList<QByteArray> &)));


多个信号连接同一个槽函数


当多个信号连接到同一个槽上时,每个信号的发送,都会调用这个槽。


connect(A,SIGNAL(recvFinshed(const QList<QByteArray> &)), C ,\
SLOT(onRecvFinsed(const QList<QByteArray> &)));
connect(B,SIGNAL(recvFinshed(const QList<QByteArray> &)), C , \
SLOT(onRecvFinsed(const QList<QByteArray> &)));


一个信号可以和另外一个信号连接


当发射第一个信号时,也会把第二个信号发送出去


//两个信号相连
connect(&a,SIGNAL(valueChanged(QString)),&b,\
SIGNAL(valueChanged(QString))); 
//再建立b与c的连接
connect(&b,SIGNAL(valueChanged(QString)),&c,\
SLOT(setValue(QString))); 
//下面的操作同时发送了信号a.valueChanged与b.valueChanged
a.setValue("this is A");
//从而信号b.valueChanged被槽c.setValue所接收


连接可以被除去


去除B与C之间的连接


disconnect(B,SIGNAL(recvFinshed(const QList<QByteArray> &)), C ,\
SLOT(onRecvFinsed(const QList<QByteArray> &)));


自定义信号


所有继承QObject或者它的子类都可以包含信号与槽,所以我们自定义的类一定要继承QObject(或者其子类)。所有包含信号与槽的类都必须声明Q_OBJECT宏

以下是简单的结构,代码细节暂时忽略。


......
class classname : public QObject
{ 
    Q_OBJECT  //必须包含
public:    
    classname ()
public slots:    
    void slotfunction();
signals:    
    void signalxxx();
}
......


总结


  • 信号与槽机制本身就是一种通信机制


  • 和MFC消息机制有相似地方


  • 槽函数本质上是一种回调函数。不过信号与槽可以一对多或者多对一,降低了对象的耦合度


  • 在看嵌入式中断回调机制,是不是也有相通的地方。不过中断涉及到操作系统调度,会抢占一些操作。
相关文章
|
22天前
【Qt 学习笔记】按钮实现helloworld | 信号与槽概述
【Qt 学习笔记】按钮实现helloworld | 信号与槽概述
23 0
|
2月前
|
存储 安全 编译器
【Qt 底层机制之信号和槽 】深入探究Qt信号和槽背后的原理
【Qt 底层机制之信号和槽 】深入探究Qt信号和槽背后的原理
149 4
|
3月前
|
编译器 C++ 开发者
QT基础【7-跨进程发送信号】
QT基础【7-跨进程发送信号】
|
3月前
|
开发者
QT基础【6-跨界面发送信号】
QT基础【6-跨界面发送信号】
|
2月前
|
存储 API C++
【Qt 信号槽】深入探索 Qt 信号和槽机制中的引用传递“ (“A Deep Dive into Reference Passing in Qt Signal and Slot Mechanism“)
【Qt 信号槽】深入探索 Qt 信号和槽机制中的引用传递“ (“A Deep Dive into Reference Passing in Qt Signal and Slot Mechanism“)
50 0
|
2月前
|
数据可视化 图形学 开发者
【Qt 底层机制之图形渲染引擎】深入理解 Qt 的 渲染机制:从基础渲染到高级图形
【Qt 底层机制之图形渲染引擎】深入理解 Qt 的 渲染机制:从基础渲染到高级图形
160 4
|
22天前
|
安全 编译器 开发者
【Qt 学习笔记】Qt信号和槽的其他说明及Lambda表达式
【Qt 学习笔记】Qt信号和槽的其他说明及Lambda表达式
34 0
|
4天前
|
编译器 API
【Qt】- 信号和槽函数
【Qt】- 信号和槽函数
|
2月前
|
Java 程序员 测试技术
【Qt底层之内存管理机制】Qt 对象 父子关系、运行时机制与高效编程技巧
【Qt底层之内存管理机制】Qt 对象 父子关系、运行时机制与高效编程技巧
123 2
|
2月前
|
开发框架 算法 Linux
【知识点回顾 】Qt信号槽与Linux信号处理 的处理机制 深入探讨
【知识点回顾 】Qt信号槽与Linux信号处理 的处理机制 深入探讨
38 0

推荐镜像

更多