Qt5 中的 signal/slot 新語法
Qt 5 之前的語法
在 Qt 5 之前,我們需要使用下面的語句來連結 signal 和 slot:
12 | connect(sender,SIGNAL(valueChanged(QString,QString)),receiver,SLOT(updateValue(QString))); |
Qt 實際上利用SIGNAL
和SLOT
這兩個巨集,把其後的函式名轉換成一個字串。隨後,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風格的查詢表示 Qt中Signal與Slot引數問題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 |