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消息机制有相似地方


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


  • 在看嵌入式中断回调机制,是不是也有相通的地方。不过中断涉及到操作系统调度,会抢占一些操作。
相关文章
|
1月前
|
编译器
(9)Qt中信号与槽重载的解决方案
本文介绍了在Qt中处理信号与槽重载问题的三种解决方案:使用函数指针、Qt提供的QOverload类和Qt4的宏方式。
114 3
|
1月前
(8)Qt中的自定义信号
本文介绍了如何在Qt框架中创建和使用自定义信号,并通过一个父子窗口切换的示例来展示自定义信号的实现和应用。
81 3
(8)Qt中的自定义信号
|
22天前
|
C++
003 Qt_信号和槽-上
本文介绍了Qt中的信号与槽机制,包括信号和槽的概念、本质及连接方法,并演示了如何自定义槽函数。信号是事件的体现,槽是对信号的响应函数。通过信号与槽,可以将独立的控件关联起来,实现复杂的交互逻辑。文中还详细展示了如何在Qt项目中定义和使用槽函数,通过实例代码和图形化界面操作,帮助读者更好地理解和应用这一机制。
33 1
003 Qt_信号和槽-上
|
3月前
|
程序员 C++
【Qt】信号与槽(下)
【Qt】信号与槽(下)
|
3月前
|
Linux C++
【Qt】信号与槽(上)
【Qt】信号与槽(上)
【Qt】信号与槽(上)
|
3月前
【qt】有点意思的信号与槽
【qt】有点意思的信号与槽
19 0
|
3月前
【qt】QTcpSocket相关的信号
【qt】QTcpSocket相关的信号
20 0
|
4月前
|
调度
【浅入浅出】Qt多线程机制解析:提升程序响应性与并发处理能力
在学习QT线程的时候我们首先要知道的是QT的主线程,也叫GUI线程,意如其名,也就是我们程序的最主要的一个线程,主要负责初始化界面并监听事件循环,并根据事件处理做出界面上的反馈。但是当我们只限于在一个主线程上书写逻辑时碰到了需要一直等待的事件该怎么办?它的加载必定会带着主界面的卡顿,这时候我们就要去使用多线程。
158 6
|
5月前
|
C++
Qt信号和槽
Qt信号和槽