初學Qt(二) 中高級功能列舉

  • 2019 年 10 月 11 日
  • 筆記

上一次和大家聊了聊Qt的三大基類,訊號和槽的使用以及重新實現一些事件等話題。如果在學習Qt之前有一定的C語言編程,可能對響應介面操作還會有些不習慣。這次聊一聊Qt的中高級功能。

一、高級功能:國 際化、自定義外觀、3D畫圖、創建插件

在C++ GUI Qt 4一書中,將Qt 的國際化也就是動態語言翻譯(就是點擊中文按鈕介面語言變成中文,點擊英文按鈕介面語言變成英文)、自定義外觀也就是樣式表、OpenGL 3D畫圖、Qt插件機制等作為高級功能進行說明。實際開發過程中,這些功能都是交叉使用的,也沒有很明顯的區分。這次和大家介紹主要是讓初學者對Qt的功能有一個初步的認識,用Qt可以實現一些什麼功能。

二、中級功能:

布局管理

如果項目對UI美化有比較重要的需求,那麼樣式表和控制項的布局管理就要側重很多,使用樣式表可以做出很多精美的控制項,可惜我不咋熟。最後控制項布局管理屬於基礎的需求。

事件處理:①比如當你點擊滑鼠左鍵,想彈出一個「祝祖國70華誕快樂」的對畫框,可以選擇重新實現滑鼠點擊事件。②安裝事件過濾器,主要就是在一個QObject實例接收到事件之前,可以讓其他的QObject對象先攔截這個事件,關於事件,還需要更多的去了解。③處理耗時操作,當調用QApplication::exec()時,就已經開啟了事件循環。那麼如果處理一個事件耗時過多,則UI介面就會卡頓。一般處理方式有兩個,第一種是將耗時操作放到執行緒中進行處理;第二種則是頻繁調用QApplication::processEvents()。

二維圖形:Qt的二維圖形是基於QPainter類的。QPainter既可以繪製幾何形狀,如點、線、圓、弧形、餅狀圖、多邊形、貝塞爾曲線等,也可以繪製像素映射、影像和文字。此外,Qpainter還支援一些高級特性,像反走樣、像素混合、漸變填充和矢量路徑等。QPainter也支援線性變換,例如平移、旋轉、錯切和縮放。QPainter可以在「繪圖設備」上,例如QWidget、QPixmap、QImage或者QSvgGenerator。重新實現Qwidget::paintEvent可以用於訂製窗口部件的外觀,可以指定某一風格的表單或者創建創建一個QStyle的子類。可以使用OPenGL命令來代替QPainter。OpenGL是一個繪製三維圖形的標準庫,QT裡面使用QtOpenGL模組簡化了OpenGL程式碼與Qt應用程式之間的繼承。

項目視圖:即Model/View,Qt中一種使UI顯示和底層數據分離的手段。具體的一些內容可以查看我之前的文章:Model/View簡便類和Qt Model/View預定義模型。

輸入與輸出:從文件或是其他設備讀取或寫入數據是很常見的功能。Qt中有兩個高級的類:QTextStream用來讀寫文本數據,QDataStream用來讀寫二進位數據。QFile則使讀取單個文件變得容易操作。最後嵌入資源,通過Qt的資源系統來實現,如程式運行的圖標圖片。通過Qt資源編譯器rcc可以將資源轉換為C++程式碼。

資料庫:QtSql模組提供了與平台以及資料庫種類無關的訪問SQL資料庫的介面。該介面由利用Qt的Model/View結構將資料庫與用戶介面集成一套類來提供支援。這裡不多做極少。

網路編程:TCP/IP 、UDP、HTTP以及FTP。之前寫過使用Qt的類從網頁上獲取數據,使用的就是HTTP協議。TCP/IP 之前文章寫過拆包、組包傳輸圖片的應用。以後有機會把UDP和FTP的例子也補充下。

多執行緒:防止UI卡死的第二種方式是將耗時操作放到執行緒中執行,而且多執行緒的使用也是編程中很重要的一部分。尤其是如何終止一個阻塞的執行緒,很值得考究。Qt中有兩種方式使用多執行緒。一種是繼承QThread重新實現run()函數的方式,注意,這裡只有run()內的部分運行在執行緒中;另一種是使用moveToThread()將需要運行在執行緒中的部分放在槽函數中,使用該方式比較容易將Socket放入執行緒中執行。

XML: 可擴展標記語言,是一種常用的數據交換和數據存儲的多用途文本文件格式。類似的還有Json文件。剛開始學Qt的我都不知道有這個東西。。這兩種文件格式還有很多其他用途,在此不多做介紹。我們可以使用xml文件當做配置文件,使用Json文件也可以。對於一些簡單的存儲,如ip、埠號等,可以使用QSetting存儲。

好了,至此,終於將C++ GUI Qt 4的目錄過完了一遍,希望對初學Qt的同志有一些幫助,那我是很快樂的。