日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

4-Qt6控制台项目信号与槽

發(fā)布時(shí)間:2025/3/19 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 4-Qt6控制台项目信号与槽 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

? ?從庫本身來說,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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。