4-Qt6控制台项目信号与槽
? ?從庫本身來說,qt的信號與槽退出后倍受業(yè)界贊許,它是Qt重要的特性。信號和槽是Qt特有的信息傳輸機(jī)制,是Qt程序設(shè)計(jì)的重要基礎(chǔ),可以讓互不干擾的對象建立一種聯(lián)系。不僅GUI界面項(xiàng)目可以用控制臺(tái)項(xiàng)目也可以使用。
? ?Qt為了方便事件的處理,引入了信號(Signal) 的概念,封裝了一些事件操作的標(biāo)準(zhǔn)預(yù)處理,使得用戶不必去處理底層事件,只需要處理信號即可,同時(shí)qt將信號概念更加廣泛化,可以發(fā)送自定義信號。
信號與槽(Slot) 其實(shí)都是函數(shù)。
“三步使用法”:emit函數(shù)發(fā)射信號,slot函數(shù)實(shí)現(xiàn)功能,connect函數(shù)綁定連接起來。
當(dāng)事件被觸發(fā)時(shí)將發(fā)送一個(gè)信號,與之連接的槽函數(shù)則可以接收到并做出響應(yīng)。
“相當(dāng)于將軍發(fā)出吹哨信號,士兵聽到開始拿槍沖鋒”。
信號發(fā)出是沒有目的的,類似廣播。如果有對象對這個(gè)信號感興趣,它就會(huì)使用
連接(connect) 函數(shù),意思是將想要處理的信號和自己的一個(gè)函數(shù)(槽)綁定來進(jìn)行處理。也就是說,當(dāng)信號發(fā)出時(shí),被連接的槽函數(shù)會(huì)自動(dòng)被回調(diào)。
槽的本質(zhì)是類的成員函數(shù),它的參數(shù)可以是任意類型,和普通C++成員函數(shù)幾乎沒有
區(qū)別,唯一的區(qū)別是:槽可以與信號連接(可理解為綁定)在一起,每當(dāng)和槽連接的信號被發(fā)出時(shí),就會(huì)調(diào)用這個(gè)槽。
?1、信號
信號使用注意:
1、必須包含頭文件<QObject>和元對象宏?Q_OBJECT
2、signals 關(guān)鍵字指出進(jìn)入了信號聲明區(qū),隨后即可聲明自己的信號函數(shù)。也可以帶任何形式的參數(shù)。
3、使用時(shí)emit發(fā)射即可;
2、槽函數(shù)
? ? ? ?slots關(guān)鍵字指出進(jìn)入了槽函數(shù)聲明區(qū),隨后即可聲明自己的槽函數(shù)。
#ifndef TEST_H #define TEST_H#include <QObject> #include <QDebug> class test : public QObject {Q_OBJECT public:explicit test(QObject *parent = nullptr);signals:void close();public slots:void dostuff(); };#endif // TEST_H #include "test.h"test::test(QObject *parent) : QObject(parent) {}void test::dostuff() {qInfo() << "Doing stuff!";emit close(); }3、connect函數(shù)
connect歸屬于QObject,五個(gè)形參,一般只用四個(gè),第五個(gè)默認(rèn)。
簡單理解為:誰發(fā)送,發(fā)送的什么信號,誰接收,接受后槽函數(shù)怎么處理
QObject::connect(&tests,&test::close,&a,&QCoreApplication::quit);
以下案例,使用第五個(gè)形參——類型type
?這里tests發(fā)送,發(fā)送的是關(guān)閉信號,a接受,調(diào)用a預(yù)定義的槽函數(shù),類型QueuedConnection。
1、當(dāng)默認(rèn)的話AutoConnection會(huì)被視為DirectConnection,槽函數(shù)運(yùn)行在發(fā)送者內(nèi)也就test內(nèi),會(huì)導(dǎo)致Exit mark:無法或者說沒機(jī)會(huì)打印輸出;
2、當(dāng)被指定為QueuedConnection,槽函數(shù)運(yùn)行在接收者內(nèi),也就a內(nèi)。所以Exit mark:正常輸出。
#include <QCoreApplication> #include "test.h" int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);test tests;QObject::connect(&tests,&test::close,&a,&QCoreApplication::quit,Qt::QueuedConnection);tests.dostuff();int mark=a.exec();qInfo() << "Exit mark:" << mark;return mark;//return a.exec(); }最后:
Qt的事件和信號與槽是不同的!!!。
1、信號由具體對象發(fā)出,然后會(huì)馬上交給由connect()函數(shù)連接的槽進(jìn)行處理。
2、事件,Qt使用一個(gè)事件隊(duì)列對所有發(fā)出的事件進(jìn)行維護(hù);當(dāng)新的事件產(chǎn)生時(shí),會(huì)被追加到事件隊(duì)列的尾部;前一個(gè)事件完成后,取出后面的事件接著進(jìn)行處理。
過程:事件派發(fā)?notify-> 事件過濾eventFilter->事件分發(fā)event->事件處理
信號與槽的效率是非常高的,但是同真正的回調(diào)函數(shù)比較起來,由于增加了靈活性,因此在速度上還是有所損失,當(dāng)然這種損失相對來說是比較小的,通過在一臺(tái) i586-133 的機(jī)器上測試是 10 微秒(運(yùn)行 Linux),可見這種機(jī)制所提供的簡潔性、靈活性還是值得的。?
總結(jié)
以上是生活随笔為你收集整理的4-Qt6控制台项目信号与槽的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 3-Qt6命令行输出显示
- 下一篇: 5-Qt6 QObjec对象拷贝