QT Creator 快速入門教程 讀書筆記(三)

2022-01-29 14:23:05 字數 2829 閱讀 2982

gui 程式除了要繪製控制項,還要響應系統和使用者事件,例如重繪、繪製完成、點選滑鼠、敲擊鍵盤等。當事件發生時,ui 會產生相應的變化,讓使用者直觀地看到。

大部分程式設計(例如win sdk、web前端)中使用**函式來響應事件,而 qt 卻獨創了訊號和槽機制。所謂**函式,就是程式設計師提前定義乙個函式,當事件發生時就呼叫該函式。

訊號和槽是qt的核心,它讓兩個互不相干的物件連線起來,當乙個物件的狀態改變時,可以通知另乙個物件。

我們先通過例子來演示一下訊號和槽:

具體的**:

#include "mainwindow.h"

在上面的demo中建立了三個控制項:lineedit,btn,label,他們都是qmainwindow w的子控制項。執行的結果如下:

點選「取消」按鈕,程式就關閉了,這是第26行**的作用;在文字輸入框中輸入一段文字,下面的 label 會隨時顯示出來,這是第28行**的作用。

這兩個物件都是通過訊號和槽連線起來的,訊號和槽用於兩個物件之間的通訊。訊號和槽是qt的核心特徵,當乙個特殊的事情發生時便可以發射乙個訊號,比如demo中的取消按鈕被點選時,就會發射clicked()訊號;而槽就是乙個函式,它在訊號發射後被呼叫來響應這個訊號,qt的部件類中已經定義了一些訊號和槽,但是更常用的做法是子類化部件,然後新增自定義的訊號和槽來實現想要的功能。

訊號是只有函式宣告、沒有函式體的成員函式。槽是擁有完整函式體的普通成員函式,你可以在槽函式中實現各種功能,與普通函式相比並沒有區別,例如 quit() 的作用就是退出程式。

connect() 是 qobject 類的靜態成員函式;qobject 是 qt 中所有類的基類,它就像「樹根」,從這裡派生出了所有其他「樹枝」。

需要注意的是,訊號不是事件。當使用者點選「取消」按鈕時,qt 會捕獲該點選事件,進行預處理,然後發射 clicked() 訊號; clicked() 和 quit() 關聯起來了,接下來就會呼叫 quit() 函式。

訊號和槽機制歸根結底也是**函式,只不過繞了個圈子。在這種機制下,程式設計師有兩次處理事件的機會,一是在捕獲事件後發射訊號前進行預處理(事件不符合預期可以不發射訊號),二是在槽函式中進行主要處理。

再來看第27行。textchange() 訊號會在文字改變時發出,settext() 槽用來設定 label 的文字,qstring

是要傳遞的資料的型別。當使用者輸入文字時,lineedit 會發出 textchange() 訊號,該訊號將攜帶資料,資料型別為

qstring,資料內容為輸入的文字;settext() 槽接收到訊號後先解析訊號攜帶的資料,獲取使用者輸入的文字,然後填充到 label 中。

訊號和槽的關聯使用的是qobject類的connect()函式,connect() 是 qobject 類的靜態成員函式,它有多個原型:

connect(qobject *sender,   char *signal,

qobject *receiver, char *method);

connect(qobject *sender, pointertomemberfunction signal,

qobject *receiver, pointertomemberfunction method);

connect(qobject *sender, pointertomemberfunction signal,

qobject *context, functor functor);

connect(qobject *sender, qmetamethod &signal,

qobject *receiver, qmetamethod &method);

connect(qobject *sender, pointertomemberfunction signal, functor functor);

簡單起見,上面省略了 connect() 的返回值和最後乙個引數,以及某些引數前面的 const 修飾符,讀者可以在 qt 幫助手冊中檢視完整的原型。

connect() 函式返回值型別為qmetaobject::connection,表示當前連線控制代碼。最後乙個引數為qt::connectiontype type = qt::autoconnection,表示連線型別,一般預設即可。
觀察上面的原型,除了最後乙個有3個引數,其他都有4個引數,其中:

1) sender 為訊號傳送者,receiver 為訊號接收者,它們都是物件指標。

2) 第1個原型中,signal 為訊號,method 為槽函式,它們都是字串,必須借助 signal() 和 slot()

將函式形式轉換為字串形式。signal() 和 slot() 是巨集,而非函式。上面的示例中就使用了該原型,它是常用的原型,初學者必須要掌握。

3) 第2個原型中,pointertomemberfunction 為指向成員函式的指標。你可以將示例中的**做如下更改:

qobject::connect(&lineedit, &qlineedit::textchanged, &label, &qlabel::settext);

這是 qt 5 新增的原型,可以在編譯期間進行檢查,如果訊號和槽不存在或者不匹配,則會報錯。而第1種原型是從 qt 誕生以來一直支援的,不能在編譯期進行檢測,如果訊號和槽有誤,只會在程式執行期間給出警告並返回 false,不容易發現問題,這是它的乙個缺陷。所以在 qt 5 中我們鼓勵使用第2種原型。

matplotlib快速入門教程

matplotlib是乙個python的2d的繪相簿,通過使用matplotlib我們只需要幾行簡潔的 就可以繪圖,直方圖 功率譜 條形圖 錯誤圖 散點圖等。這篇部落格主要介紹的是matplotlib.pyplot模組,matplotlib其實就是乙個模仿matlab開發的python庫。當然,它不...

Linux快速入門教程

序言 linux是一套免費使用和自由傳播的類unix作業系統,這個系統是由全世界各地的成千上萬的程式設計師設計和實現的。下面的一些linux教程是為了快速入門,目的在於能快速掌握linux的基本知識,能對伺服器進行基本的維護。1.1 命令列操作 1.1.1 shell 簡介 1.1.2 shell ...

BMFont 快速入門教程

什麼是bmfont?這是個軟體,全稱bitmap font generator,顧名思義,位 字生成器。這個工具就是用來生成位 字字型配置檔案的,fnt檔案。這裡介紹是因為遊戲開發中經常用到這個,主流的各大遊戲引擎都支援使用bmfont字型格式,如cocos unity3d等。bmfont是個免費軟...