初學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)。打印下結果如下圖: