官术网_书友最值得收藏!

3.9 Qt中與界面相關的類庫

Qt的核心框架是一套C++類庫,里面的類很多,它們的合集就是一個大大的類庫,也是一個應用程序的編程框架。有了框架,就可以往框架內添加自己的代碼來實現我們所需要的Qt應用程序。這個過程好比開發商造好了整幢大樓,把毛坯房賣給了我們,而我們要做的就是裝修,使之可以居住。

要成為Qt編程高手,熟悉Qt類庫是必需的。Qt類庫非常龐大,不能眉毛胡子一把抓,對于初學者來說,應該由淺入深。實際工作中常用到的類可組成兩張繼承圖,如圖3-13和圖3-14所示。

圖3-13

圖3-13中的類主要涉及對話框類(QDialog)、菜單類(QMenu)、主窗口類(QMainWindow)等各個控件類,這是在Qt編程中經常會遇到的,它們的基類是QWidget。

Qt的類庫很大,我們不需要(也不可能)全部記住,剛學習時只需要抓住幾個頭(父類,見圖3-14)即可,其他蝦兵蟹將(子類)在用到的時候再學習。

圖3-14

3.9.1 QObject類

QObject類是所有Qt類的基類,是Qt對象模型的核心。它最主要的特征是關于對象間無縫通信的機制:信號與槽(槽就是信號處理函數,后面會講到)。

任何對象都要實現信號與槽機制,Q_OBJECT宏是強制的。不管是否真正用到信號與槽機制,最好在所有QObject子類中都使用Q_OBJECT宏,以免出現一些不必要的錯誤。

所有的Qt Widgets都是基礎的QObject類。如果一個對象是Widget,那么isWidgetType()函數就能判斷出。

QObject類既沒有復制構造函數也沒有賦值操作符,實際上它們使用宏Q_DISABLE_COPY()聲明為私有的。所有派生自QObject類的對象都使用這個宏聲明復制構造函數和賦值操作符為私有的。

3.9.2 QWidget類

QWidget類是所有用戶界面對象的基類,被稱為基礎窗口部件。主窗口、對話框、標簽、按鈕、文本輸入框等都是窗口部件。這些部件可以接收用戶輸入,顯示數據和狀態信息,并且在屏幕上繪制自己。Qt把沒有嵌入到其他部件的部件稱為窗口,一般窗口都有邊框和標題欄,就像程序中的部件(Widget)和標簽(Label)一樣,QMainWindow類和大量的QDialog子類是一般的窗口類型。窗口就是沒有父部件的部件,所以又稱為頂層部件。

3.9.3 和主窗口有關的類

主窗口就是一種頂層窗口,可以用來顯示數據、圖形等。程序的主窗口是經常和用戶打交道的用戶界面元素,它上面通??梢源娣挪藛螜?、工具欄、??靠丶?、狀態欄等,每個控件都對應著類。另外,對于這些控件上的操作也提供了相應的類,比如QAction等。

(1)QMainWindow類

這個類表示主窗口本身。

(2)QDockWidget類

該類表示停靠控件。

(3)QMenu類

該類用于菜單欄、上下文菜單和其他彈出菜單的菜單控件。菜單欄通常位于主窗口上方。

(4)QToolBar類

該類提供了一個通用的工具欄部件。它可以容納許多與操作相關的不同控件,如按鈕、下拉菜單、組合框和數字顯示框。通常,工具欄與菜單和鍵盤快捷鍵可以很好地協作使用。工具欄通常位于菜單欄下方。

(5)QStatusBar類

該類表示狀態欄。狀態欄通常位于主窗口的底部,用于顯示當前程序狀態信息或解釋某個命令的含義。

以上是主窗口上常見的界面元素。和這些控件相關的操作也封裝成了幾個類。

(1)QAction類

QAction類表示和控件有關的用戶界面操作。

(2)QActionGroup類

QActionGroup類用于把控件的操作進行組合。

(3)QWidgetAction類

通過接口擴展QAction類,用于將自定義控件插入到基于操作的容器(如工具欄)中。

3.9.4 對話框類和控件類

對話框是另外一種常見的頂層窗口,上面可以存放不同的控件,讓用戶通過控件來操作所需的功能。

(1)QDialog類

QDialog類是對話框窗口的基類,可以衍生出不少子類,比如文件對話框類、顏色對話框類、打印對話框類等。

對話框窗口主要用于短期任務和與用戶進行簡短的通信。對話框有兩種:模態和非模態(后面我們會詳細介紹它們的區別)。QDialog類可以提供返回值,并且可以有默認按鈕。

(2)各個控件類

在Qt中,控件又稱為小部件??丶鞣N各樣,比如按鈕控件(QAbstractButton)、編輯框控件(QTextEdit)等。后面我們將詳細介紹常見控件的用法。

3.9.5 Qt Widgets應用程序類型

在項目向導中新建項目時,如果選擇了Qt Widgets Application,那么最終生成的程序就是Qt Widgets應用程序,如圖3-15所示。

圖3-15

根據在向導中選擇基類的不同,Qt Widgets程序可以分為3大類:基于主窗口的Widgets程序、基于Widgets的Widgets程序和基于對話框的Widgets程序。我們可以在Qt Creator的向導對話框中進行選擇,如圖3-16所示。

如果用的是VC2017,也可以在向導對話框中進行選擇,如圖3-17所示。

圖3-16

圖3-17

通過向導生成這3種類型的程序而不需要編寫一行代碼,不過向導生成的程序只是一個程序架構,還是需要自己手動輸入具體的程序代碼來實現所需的功能。

下面我們來生成這3類的Widgets程序。

【例3.11】 一個簡單的主窗口程序(Qt Creator版)

(1)啟動Qt Creator 4.8.2,新建一個Qt Widgets項目,項目名為test。然后跟著向導操作,直到在類信息向導對話框上選擇(默認已經選中)基類為QMainWindow,如圖3-18所示。

然后繼續單擊“下一步”按鈕,直到向導完成。

圖3-18

(2)向導完成后,會幫我們創建如圖3-19所示的文件。

如果要設計界面,可以雙擊mainwindow.ui,此時將打開設計師界面,在該界面上能以可視化方式進行界面設計。main.cpp中定義了程序入口函數main()。mainwindow.cpp中定義了表示主窗口的MainWindow類,該類繼承自QMainWindow。MainWindow類的對象在main函數中有定義,如下所示:

在一個窗口的Qt程序中,至少有一個應用程序對象和窗口(這里是主窗口)對象。比如:

    QApplication a(argc, argv); //定義應用程序對象
    MainWindow w; //定義一個主窗口對象

(3)不需要添加任何代碼,直接按Ctrl+R快捷鍵運行程序,其中編譯的進度狀態可以在右下角狀態欄上看到,如圖3-20所示。

稍等片刻,運行成功,運行結果如圖3-21所示。

這個主窗口上還創建了工具欄,雖然還沒有具體的內容。另外,在右下角的3根斜線表示該窗口可以通過鼠標拖拉邊框來進行縮放。

圖3-19

圖3-20

圖3-21

【例3.12】 一個簡單的主窗口程序(VC版)

(1)啟動VC2107,新建一個Qt GUI Application項目,項目名為test。然后一路跟著向導操作,直到在可以選擇基類的向導對話框上選擇(默認已經選中)基類為QMainWindow。為了更加直觀,把類名由默認的test改為MainWindow,如圖3-22所示。然后單擊Finish按鈕,一個Qt程序就自動創建好了。

(2)打開解決方案資源管理器視圖,VC已經幫我們創建好如圖3-23所示的文件。

圖3-22

圖3-23

如果要設計界面,可以雙擊MainWindow.ui,此時將打開設計師界面,在該界面上能以可視化方式進行界面設計。main.cpp中定義了程序入口函數main()。MainWindow.cpp中定義了表示主窗口的類MainWindow,該類繼承自QMainWindow。MainWindow類的對象在main()函數中有定義,如下所示:

(3)不添加任何代碼,直接按Ctrl+F5快捷鍵運行程序,此時VC會自動在下方顯示輸出視圖。我們可以看到編譯時的狀態信息,如果沒有錯誤就會顯示編譯成功,如圖3-24所示。

在圖3-24中,顯示成功1個、失敗0個,說明程序運行成功了。運行結果如圖3-25所示。

圖3-24

圖3-25

上面的例子程序是基于QMainWindow類的,下面來看一下基于QWidget類的界面程序。QWidget類是所有窗口類的父類,功能最簡單。

【例3.13】 一個簡單的Widget窗口程序(Qt Creator版)

(1)啟動Qt Creator 4.8.2,新建一個Qt Widgets項目,項目名為test,然后一路跟著向導操作,直到在可以選擇基類的向導對話框上選擇基類為QWidget。為了更加直觀,我們把類名由默認的test改為QWidget,如圖3-26所示。

圖3-26

繼續單擊“下一步”按鈕直到完成。

(2)打開解決方案資源管理器視圖,可以看到Qt Creator已經創建好如圖3-27所示的文件。

如果要設計界面,可以雙擊widget.ui,此時將打開設計師界面,在該界面上能以可視化方式進行界面設計。main.cpp中定義了程序入口函數main()。widget.cpp中定義了表示主窗口的Widget類,該類繼承自QWidget類。Widget類的對象在main()函數中有定義,如下所示:

(3)不添加任何代碼,直接按Ctrl+F5快捷鍵運行程序,如果沒有錯誤就會顯示編譯成功,運行結果如圖3-28所示。

圖3-27

圖3-28

【例3.14】 一個簡單的Widget窗口程序(VC版)

(1)啟動VC2107,新建一個Qt GUI Application項目,項目名為test。然后一路跟著向導操作,直到在選擇基類的向導對話框上選擇基類為QWidget。為了更加直觀,我們把類名由默認的test改為widget,如圖3-29所示。

圖3-29

然后單擊Finish按鈕,一個Qt程序就自動創建好了。

(2)打開解決方案資源管理器視圖,可以看到VC已經創建好如圖3-30所示的文件。

如果要設計界面,可以雙擊widget.ui,此時將打開設計師界面,在該界面上能以可視化方式進行界面設計。main.cpp中定義了程序入口函數main()。widget.cpp中定義了表示主窗口的widget類,該類繼承自QWidget。widget類的對象在main函數中有定義,如下所示:

(3)不需要添加任何代碼,直接按Ctrl+F5快捷鍵運行程序,此時VC會自動在下方顯示輸出視圖。我們可以看到編譯時的狀態信息,如果沒有錯誤就會顯示編譯成功,最終運行效果如圖3-31所示。

還有一種程序類型是對話框程序,我們將在后面一章詳細介紹。長久以來,不同的開發環境,控制臺程序和窗口圖形界面程序井水不犯河水,很少有交集。但在Qt中,它們的結合是那么的簡單。下面我們看一個例子。

【例3.15】 控制臺程序出現Widget窗口

(1)啟動Qt Creator 4.8.2,新建一個控制臺程序項目,項目名為test。

(2)打開main.cpp,輸入如下代碼:

注意,默認建立的控制臺程序給出的應用程序類是QCoreApplication,但是要在控制臺中使用QWidget就必須使用QApplication類。QCoreApplication類提供了一個事件循環,用于非GUI應用程序給自己提供事件循環,因此對于Qt非GUI的應用程序,應該使用QCoreApplication類。對于GUI應用程序(比如用到了Widget窗口),應該使用QApplication類。QApplication類定義在widgets模塊中,與QWidget類相關,能設置鼠標雙擊的間隔時間、按鍵的間隔時間、鼠標拖曳距離和時間、滾輪滾動行數等,還能獲取桌面激活的窗口、模態控件、彈跳控件等。

實例化控件窗口對象后就可以調整窗口的大小并顯示出來,最后設置窗口的標題。打開test.pro,在文件開頭添加“QT+=widgets”。

(3)按Ctrl+R快捷鍵運行這個項目,運行結果如圖3-32所示。

圖3-30

圖3-31

圖3-32

主站蜘蛛池模板: 涞水县| 仪征市| 武邑县| 抚宁县| 河津市| 合江县| 赣榆县| 钟山县| 香河县| 奉新县| 柯坪县| 南平市| 平阳县| 资源县| 油尖旺区| 林州市| 梁河县| 霸州市| 陆丰市| 旬阳县| 秦皇岛市| 疏勒县| 聂拉木县| 土默特右旗| 淅川县| 安庆市| 海林市| 平泉县| 霸州市| 兴文县| 杨浦区| 乳源| 陇西县| 珲春市| 沙雅县| 密山市| 博乐市| 资兴市| 普兰店市| 太原市| 固镇县|