初學Qt(一)
- 2019 年 10 月 7 日
- 筆記
如果是一個小白,那麼該如何學習Qt呢?接下來我從自己的學習經歷中總結一下,希望對初學Qt的同志能有一點兒幫助。
一、初識Qt——訊號和槽、跨平台開發框架
首先要知道的是Qt是基於C++的跨平台應用程式開發框架,所謂跨平台就是你在Windows下寫的程式放在Linux下也能用,而且圖形化風格也會隨著系統的改變而改變。此外它擁有大量的組件,以方便和加速開發過程,如它的IDE(集成開發環境)—— Qt Creator、Qt Designer、Qt Assistant等,還有很多,不一一列舉。除此之外,提到Qt我們可能最先想到的就是訊號和槽——它為我們提供了一種方便對象間通訊的機制。舉個例子,你的應用程式介面有個按鈕,你想讓它在被按下後彈出一個Qt入門程式Demo與講解的對話框,
可能對於初學者而言還是有點蒙圈,不過沒關係,現在知道Qt能跨平台、有一個獨特的訊號和槽的機制就可以了。
二、應用程式類型與三大介面基類
Qt開發環境搭建完成後,我們會建立自己的工程(工程就是Qt會把預處理、編譯、彙編、鏈接等工作搞定),之後寫下第一個關於Qt的程式。在創建工程這塊,我要說的是要了解Qt提供的一些模板:如左側第一個默認的是應用程式,第二個是創建庫模板。在右側,創建應用程式可以是窗體程式或是控制台程式(沒有影像化介面),其他的類型沒有使用過,不做介紹。如果左側選擇的是Library模板,對應右側會是不同的選項。

以我們常用的應用程式和窗體程式為例,必須要繼承三大基類中的一個。他們分別是QMainWindow、QWidget、QDialog。MainWindow帶有菜單條,工具條和一個狀態條的主應用程式窗口;Widget是所有用戶介面對象的基類,窗口部件是用戶介面的一個基本單元 ;Dialog是對話框窗口的基類,對話框窗口主要用於短期任務和用戶進行短期通訊的頂級窗體。下方Generate form默認是勾選的,也就是創建.ui文件。不是很懂?沒關係,每次建工程都會選,選著選著就會有感情了。

三、Qt控制項概述與應用舉例
Qt的控制項有很多很多,直到現在我也有很多沒有用過。說到這,提一下,我們可以使用Qt Designer的快速設計和布局各種窗體部件,也可以使用純程式碼進行窗體設計。初學者建議先使用Designer進行設計。
開啟PPT模式:
Layouts:布局器,垂直、水平、柵格布局等方式
Buttons:各種按鈕,單選按鈕、多選按鈕、對話框按鈕等
Item Views:Qt Model/View的顯示部分,列表、樹、表格等,使用時需要通過Model設置數據源
Item Widgets:Model/View的簡便類,可直接進行增刪改查等功能
Containers:容器,很常用。。。常用到可能會單獨說一說。
Input Widgets:輸入窗體,可以自己繼承裡面的Plain Text Edit或Text Edit控制項自己實現一個文本編輯器
Display Widgets:顯示窗體。
這塊通過一個小Demo串幾個知識點:訊號和槽,控制項的簡單使用,如何根據自己的功能去查找文檔以及有一點難度的應用。總共三小部分:
①點擊一個按鈕,彈出一個標題為「閑魚搜索」的通知對話框,
對話框為HTML樣式的「Qt入門程式與Demo講解!!!」。這個是通
過訊號和槽實現的。
②Input Widgets下的lineEdit,通過Qt幫助文檔查找一些訊號和槽。
Linux 下Qt Assistant 在Qt安裝目錄/opt/Qt5.5.1/5.5/gcc/bin下
③lineEdit本身沒有滑鼠點擊焦點的訊號發出,我想在編輯框被點
擊時得到訊號,該如何操作?
①打個廣告。。
這裡面可以設置HTML樣式的顯示。
QMessageBox::information(this,tr("閑魚搜索"), tr("<font color=red><h2>Qt入門程式 與Demo講解!!!</h2></font>")) ;

②lineEdit 幫助文檔閱讀
紫色部分是該類需要包含的頭文件、模組以及它的基類

點擊上邊圖片那個More,找到了幾個訊號,我們試一下。這裡面提下,Qt調試資訊輸出需要包含QDebug類,使用qDebug()輸出。我們看到字元改變會立即將訊號傳遞到槽中輸出,按下回車鍵後對應的槽也進行了響應。挺好玩的。


③如何獲取點擊lineEdit編輯框的通知(訂製自己想要的功能)
lineEdit編輯框被點擊時是沒有訊號發出的,若想得到這個通知,有兩種方式:
一是繼承QLineEdit,自己重新實現滑鼠點擊事件,二是使用事件過
濾器。下面我們以事件過濾器為例:
lineEdit安裝事件過濾器,重新實現eventFilter(QObject
*watched, QEvent *event)。列印下結果如下圖:
