1. 程式人生 > >Qt5 中的 signal/slot 新語法

Qt5 中的 signal/slot 新語法

Qt 5 之前的語法

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

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

Qt 實際上利用SIGNALSLOT這兩個巨集,把其後的函式名轉換成一個字串。隨後,moc 將會掃描全部檔案,將所有的 signal 和 slot 提取出來做成一個對映表。QObject::connect()函式則會從這個對映表裡面找到該字串,從 signal 的名字就可以找到 slot 的名字,因此也就知道了在 signal emit 的時候,該去呼叫哪一個 slot 函式。

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

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

  • 沒有編譯期檢查:因為函式名被處理成字串,所有的檢查都是在執行時完成的。這就是為什麼有時會發生編譯通過了,但 slot 並沒有被呼叫。此時,你就應該去檢查 console 的輸出,看看有沒有什麼 warning 說明 connect 並沒有成功。
  • 因為處理的是字串,所以 slot 中的型別名字必須用 signal 的完全一致,而且在標頭檔案中的和實際 connect 語句中的也必須一致。也就是說,如果你使用了 typedef 或者 namespace,connect 就可能不成功(在 Qt 5 之前的版本中,我們當然也可以使用 namespace,但是必須保證標頭檔案中的和 connect 語句中的文字完全一致)。

新語法:使用函式指標

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

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

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

編譯器檢查

如果把 signal 或者 slot 名字編寫錯誤,或者 slot 的引數同 signal 不一致,你會在編譯期就獲得一個錯誤。這肯定會在重構、或者修改 signal 或 slot 的名字時節省很多時間。

另一個影響是,Qt 可以利用static_cast返回更友好的錯誤資訊。例如,如果我們少了Q_OBJECT巨集,則會有:

123456789#include <QtCore/QtCore>classGoo:publicQObject{Goo(){connect(this,&Goo::someSignal,this,&QObject::deleteLater);}signals:voidsomeSignal();};

其錯誤資訊是:

1 2 3 4 5 qobject.h:In

相關推薦

Qt5 signal/slot 語法

Qt 5 之前的語法 在 Qt 5 之前,我們需要使用下面的語句來連結 signal 和 slot: 12connect(sender,SIGNAL(valueChanged(QString,QString)),receiver,SLOT(updateValue(QString)));

Qt5 的訊號/槽 connect語法

Qt 5 之前的語法在 Qt 5 之前,我們需要使用下面的語句來連結 signal 和 slot:connect(sender, SIGNAL(valueChanged(QString, QString)), receiver, SLOT(updateValu

QT 關鍵字講解(emit,signal,slot

Qt中的類庫有接近一半是從基類QObject上繼承下來,訊號與反應槽(signals/slot)機制就是用來在QObject類或其子類間通訊的方法。作為一種通用的處理機制,訊號與反應槽非常靈活,可以攜帶任意數量的引數,引數的型別也由使用者自定。同時其本身也是型別安全的,任何一個從QObject或

.NET那些所謂的語法之三:系統預定義委託與Lambda表示式

開篇:在上一篇中,我們瞭解了匿名類、匿名方法與擴充套件方法等所謂的新語法,這一篇我們繼續征程,看看系統預定義委託(Action/Func/Predicate)和超愛的Lambda表示式。為了方便碼農們,.Net基類庫針對實際開發中最常用的情形提供了幾個預定義好的委託,這些委託可以直接使用,無需再重頭定義一個自

.NET那些所謂的語法之二:匿名類、匿名方法與擴充套件方法

開篇:在上一篇中,我們瞭解了自動屬性、隱式型別、自動初始化器等所謂的新語法,這一篇我們繼續征程,看看匿名類、匿名方法以及常用的擴充套件方法。雖然,都是很常見的東西,但是未必我們都明白其中蘊含的奧妙。所以,跟著本篇的步伐,繼續來圍觀。 /* 新語法索引 */ 一、匿名類:[ C# 3.0/.NET 3.

.NET那些所謂的語法之一:自動屬性、隱式型別、命名引數與自動初始化器

開篇:在日常的.NET開發學習中,我們往往會接觸到一些較新的語法,它們相對以前的老語法相比,做了很多的改進,簡化了很多繁雜的程式碼格式,也大大減少了我們這些菜鳥碼農的程式碼量。但是,在開心歡樂之餘,我們也不禁地對編譯器內部到底為我們做了哪些事兒而感到好奇?於是,我們就藉助反編譯神器,去看看編譯器到底做了啥事!

.NET那些所謂的語法之四:標準查詢運算子與LINQ

開篇:在上一篇中,我們瞭解了預定義委託與Lambda表示式等所謂的新語法,這一篇我們繼續征程,看看標準查詢運算子和LINQ。標準查詢運算子是定義在System.Linq.Enumerable類中的50多個為IEnumerable<T>準備的擴充套件方法,而LINQ則是一種類似於SQL風格的查詢表示

QtSignalSlot引數問題

Referenced by: 應注意的問題 訊號與槽機制是比較靈活的,但有些侷限性我們必須瞭解,這樣在實際的使用過程中做到有的放矢,避免產生一些錯誤。下面就介紹一下這方面的情況。 1 .訊號與槽的效率是非常高的,但是同真正的回撥函式比較起來,由於增加了靈活性,

Qt5 訊號與槽的寫法

Qt4中最常用的訊號槽寫法: connect(obj1, SIGNAL(fun1(param1, param2,...)), obj2, SLOT(fun2(param1,...))); //編譯後 connect(obj1, "fun1(param1, param2,

什麼?介面方法可以不是抽象的「JDK8介面語法的深度思考」

先贊後看,養成習慣 文字已收錄至GitHub開源倉庫 Lu_JavaNodes 碼雲倉庫地址Lu_JavaNodes,包含教程涉及所有思維導圖,案例程式碼和後續講解視訊,歡迎Star增磚添瓦。 前言 在傳統的介面語法中,介面中只可以有抽象方法。在是在實際的使用中,我們往往會需要用到很多和介面相關的功

AutoMapper語法

ima ppp snap app profile eat orm per hot var mapper = config.CreateMapper();// orIMapper mapper = new Mapper(config);var dest = mapper.Ma

HQL語句類的別名語法以及作用?

為我 其他 str hibernate 部分 我們 以及 最簡 rom 類名 as 別名類名後跟別名作用:a、調用時方便b、Hibernate中最簡單的查詢是from Street ,只是簡單地返回Street類的所有實例。在很多時候可能需要為類設置別名(alias),因為

總結常見的ES6語法特性。

等號 模塊 不能 文件 import 處理程序 定義 ogl 進行 前言 ES6是即將到來的新版本JavaScript語言的標準,他給我們帶來了更“甜”的語法糖(一種語法,使得語言更容易理解和更具有可讀性,也讓我們編寫代碼更加簡單快捷),如箭頭函數(=>)、class

sublime安裝sublimelinter php 語法檢查

efault pytho pat 方框 ack settings 技術 pan 復制 打開控制臺,install package 搜 sublimelinter 先安裝sublimelinter本體 安裝完以後再搜索一下,安裝sublimelinter-php 接下來,打開

yii2.0添加的模塊

復制 添加 ima 技術 ews end ots yii http 比如現在需要添加一個新的hnews模塊:復制frontend改名hnews 1、在common文件下的config下的 bootstrap.php 2、修改命名空間 在具體實例的main.config

Linux創建用戶並賦給指定文件權限

df命令 新增 st2 source cp -rf tro 操作 find 條件 工作中用到了,寫篇日誌總結一下。 創建新的用戶: 第一種方式: 創建用戶: adduser name 創建密碼: passwd name(回車後出現修改密碼的提示) 該方式創建的用戶目錄默認在

QT5實現求兩個輸入值的和並輸出

求和 數據類型 編寫 cnblogs 運行 代碼 .com int logs 1、在UI設計界面放置兩個輸入lineEdit、一個輸出TextBrowser和一個PushButton(用以按鍵求和),如圖 2、打開.h文件,在類裏面添加槽函數的聲明代碼,如圖 ; 3、打開

Eclipse設置創建文件的默認編碼格式

創建文件 分享 log .com 創建 區域 win 一個 b- window-prefenences-web-jsp(或者是其他文件格式,裏面是一個列表) 找到之後點擊,在右側區域中選擇encoding進行修改即可,然後應用,OK Eclipse中設置新創建文件的默認

Qt5創建臨時的後臺線程。

process name targe button move div 計算 info 後臺線程 有個需求就是,GUI圖形界面在上傳文件到服務器的時候,需要用zip命令行打包,因為文件很多的時候,zip命令打包需要計算很長時間,所以把這樣計算量大的任務分離到後臺線程比較合適,

Eclipse如何進行文件類型(File types)的關聯識別?

但是 .com 保存 繼續 height file src images pes 這段時間,由於項目需要,采用.btl文件類型代替.jsp文件類型進行前後端的頁面交互,但是eclipse又不能識別.btl文件類型。所以需要進行如下操作: 1.Window ->Pre