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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

QT入门语法——signal,slot

發(fā)布時(shí)間:2025/3/16 c/c++ 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 QT入门语法——signal,slot 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
、 Qt 5 Alpha 已經(jīng)發(fā)布。我們會(huì)在后面的文章中看到 Qt 5 的新變化。今天,我們先來看一下 Qt 5 帶來的一個(gè)最主要的變化:signal/slot 機(jī)制的改變。

Qt 5 之前的語法

在 Qt 5 之前,我們需要使用下面的語句來鏈接 signal 和 slot:



12connect(sender, SIGNAL(valueChanged(QString, QString)),????????receiver, SLOT(updateValue(QString)));

Qt 實(shí)際上利用SIGNAL和SLOT這兩個(gè)宏,把其后的函數(shù)名轉(zhuǎn)換成一個(gè)字符串。隨后,moc 將會(huì)掃描全部文件,將所有的 signal 和 slot 提取出來做成一個(gè)映射表。QObject::connect()函數(shù)則會(huì)從這個(gè)映射表里面找到該字符串,從 signal 的名字就可以找到 slot 的名字,因此也就知道了在 signal?emit 的時(shí)候,該去調(diào)用哪一個(gè) slot 函數(shù)。

Qt 5 之前的 signal/slot 語法的問題

從上面的解釋可以看出,Qt 5 之前版本提供的這種語法其實(shí)有一些問題:

  • 沒有編譯期檢查:因?yàn)楹瘮?shù)名被處理成字符串,所有的檢查都是在運(yùn)行時(shí)完成的。這就是為什么有時(shí)會(huì)發(fā)生編譯通過了,但 slot 并沒有被調(diào)用。此時(shí),你就應(yīng)該去檢查 console 的輸出,看看有沒有什么 warning 說明 connect 并沒有成功。
  • 因?yàn)樘幚淼氖亲址?#xff0c;所以 slot 中的類型名字必須用 signal 的完全一致,而且在頭文件中的和實(shí)際 connect 語句中的也必須一致。也就是說,如果你使用了 typedef 或者 namespace,connect 就可能不成功(在 Qt 5 之前的版本中,我們當(dāng)然也可以使用 namespace,但是必須保證頭文件中的和 connect 語句中的文本完全一致)。

新語法:使用函數(shù)指針

在 Qt5 提供了一套新的語法。之前的語法依然可以使用,但是現(xiàn)在,我們有了更好的選擇:





1 2

connect(sender,&Sender::valueChanged, ????????receiver,&Receiver::updateValue);



這個(gè)看起來和之前的版本很類似,因此很容易遷移到新的語法。下面我們看看新語法有什么好處:

編譯器檢查

如果把 signal 或者 slot 名字編寫錯(cuò)誤,或者 slot 的參數(shù)同 signal 不一致,你會(huì)在編譯期就獲得一個(gè)錯(cuò)誤。這肯定會(huì)在重構(gòu)、或者修改 signal 或 slot 的名字時(shí)節(jié)省很多時(shí)間。

另一個(gè)影響是,Qt 可以利用static_cast返回更友好的錯(cuò)誤信息。例如,如果我們少了Q_OBJECT宏,則會(huì)有:

123456789#include <QtCore/QtCore>class Goo : public QObject {????Goo() {????????connect(this, &Goo::someSignal, this, &QObject::deleteLater);????}signals:????void someSignal();};

其錯(cuò)誤信息是:

1 2 3 4 5 qobject.h:Inmemberfunction‘void QObject::qt_check_for_QOBJECT_macro(const T&) const [with T = Goo]’: qobject.h:535:9:??instantiatedfrom‘static typename QtPrivate::QEnableIf::ArgumentCount) >= (int)(QtPrivate::FunctionPointer::ArgumentCount)), void*>::Type QObject::connect(const typename QtPrivate::FunctionPointer::Object*, Func1, const typename QtPrivate::FunctionPointer::Object*, Func2, Qt::ConnectionType) [with Func1 = void (Goo::*)(), Func2 = void (QObject::*)(), typename QtPrivate::QEnableIf::ArgumentCount) >= (int)(QtPrivate::FunctionPointer::ArgumentCount)), void*>::Type = void*, typename QtPrivate::FunctionPointer::Object = Goo, typename QtPrivate::FunctionPointer::Object = QObject]’ main.cc:4:68:??instantiatedfromhere qobject.h:353:5:error:voidvaluenotignoredasitoughttobe make:***[main.o]Error1

參數(shù)的自動(dòng)類型轉(zhuǎn)換

現(xiàn)在,我們不僅可以更好地使用 typedef 或 namespace,而且可以利用隱式類型轉(zhuǎn)換。在下面的例子中,我們的 signal 有一個(gè)QString參數(shù),而 slot 需要的是QVariant。在新語法中,QString將被自動(dòng)轉(zhuǎn)換成QVariant:



123456789101112class Test : public QObject{????Q_OBJECTpublic:????Test() {????????connect(this, &Test::someSignal, this, &Test::someSlot);????}signals:????void someSignal(const QString &);public:????void someSlot(const QVariant &);};

連接到任意函數(shù)

如果你留心上面的例子,就會(huì)發(fā)現(xiàn),我們的 signal 被連接到了一個(gè) public 函數(shù),但這個(gè)函數(shù)并不是 slot。Qt 的新語法通過函數(shù)指針直接調(diào)用函數(shù),而不需要 moc 的特殊處理(但是 signal 依然需要)。

更進(jìn)一步,我們可以將 signal 連接到任意函數(shù):





1 2 3 4 5 6

staticvoidsomeFunction(){ ????qDebug()<<“pressed”; } // … somewhere else QObject::connect(button,&QPushButton::clicked,someFunction);



這樣處理,就可以讓你很方便的同 boost 或者 tr1::bind 這樣的第三方庫協(xié)作。

C++11 lambda 表達(dá)式

至此之前,我們所有的示例都是基于 C++98. 標(biāo)準(zhǔn)的。但是,如果你的編譯器支持 c++11,我相信你一看到“函數(shù)指針”這幾個(gè)字,就一定會(huì)想到 C++11 的新特性:Lambda 表達(dá)式。現(xiàn)在,Lambda 表達(dá)式至少被 MSVC 2010,GCC 4.5,clang 3.1 這幾個(gè)編譯器支持。不過對于后面兩個(gè)編譯器,你需要在編譯時(shí)加上?-std=c++0x?參數(shù)。

現(xiàn)在我們可以用 Lambda 表達(dá)式重寫了:







1 2 3 4 5 6 7 8 9 10 11

voidMyWindow::saveDocumentAs(){ ????QFileDialog *dlg=newQFileDialog(); ????dlg->open(); ????QObject::connect(dlg,&QDialog::finished,[=](intresult){ ????????if(result){ ????????????QFilefile(dlg->selectedFiles().first()); ????????????// … save document here … ????????} ????????dlg->deleteLater(); ????}); }



這種語法允許我們更方便地編寫異步代碼。

總結(jié)

以上是生活随笔為你收集整理的QT入门语法——signal,slot的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 黄色aaaa | 国产盗摄精品 | 91国内在线 | 日韩久久精品电影 | 日韩欧美一区二区三区视频 | 天天碰天天碰 | 亚洲精品国产精华液 | 韩国主播青草55部完整 | 一区二区国产精品视频 | 国产a级片| 国产又粗又黄又爽又硬 | 精品人妻一区二区三区在线视频 | 动漫同人高h啪啪爽文 | 亚洲热影院 | 九色国产在线 | 亚洲理论在线观看 | 中文字幕av久久爽 | 日韩三级一区二区 | 香蕉视频ap | 免费黄色小网站 | 国产让女高潮的av毛片 | 91夫妻视频 | 在线成人免费视频 | 亚洲国产精品久久AV | 福利在线观看 | 丰满多毛的大隂户视频 | 久久久性色精品国产免费观看 | 亚洲成a人片77777精品 | 九九热av| 国产高清一区在线观看 | 伊人网在线免费观看 | 在线视频亚洲欧美 | 最新视频在线观看 | 黄色三级国产 | 国产精品久久久久免费 | 黄色片美女 | 真人一毛片 | 日韩中文字幕第一页 | 五月天精品在线 | 免费操片| 日韩久久影视 | 性生活视频软件 | 中文字幕无码乱人伦 | 中文在线字幕av | 加勒比成人av | 激情婷婷在线 | 美女mm131爽爽爽免费动视频 | 99re视频在线播放 | 中文字幕一区二区人妻视频 | 日本熟妇乱子伦xxxx | 日韩最新在线 | 夜夜嗨av一区二区 | 97中文字幕 | 日日做夜夜爽毛片麻豆 | 亚洲xxxxxx| 黄色在线免费观看视频 | 久久97人妻无码一区二区三区 | 天堂а√在线中文在线新版 | xxxxwww一片| 377p粉嫩大胆色噜噜噜 | 欧美久久久久久久久中文字幕 | 国产另类专区 | 亚洲色图丝袜 | 性欧美大战久久久久久久久 | 无码人妻丰满熟妇区五十路百度 | 亚洲精品中文字幕成人片 | 乱亲女h秽乱长久久久 | 伊人网在线视频 | 久久白浆| 欧美一级视频免费 | 欧美国产成人精品一区二区三区 | 日本内谢少妇xxxxx少交 | 97黄色片 | 久久高清免费 | 国产精品xxx在线观看 | 成人高清在线 | 日本wwwwww| 蜜桃精品噜噜噜成人av | 国产在线精品一区 | 亚洲国产精品无码久久久久高潮 | 插女生下面 | 经典三级久久 | 伊人黄色 | 99资源在线 | 色老汉av一区二区三区 | 欧美xxxx18 | 波多野结衣之潜藏淫欲 | 亚洲天堂女人 | 黑人一区二区三区四区五区 | 超碰在 | av片在线观看免费 | 精品国产一区二区三区在线观看 | 六月综合网 | 国产成人在线播放视频 | 懂色av一区 | 亚洲天堂av网 | 真性中出 | 欧美性猛交ⅹxx乱大交 | 小说肉肉视频 |