Qt Gui程式設計中兩種建立窗體介面方法

2021-08-19 05:58:05 字數 3777 閱讀 5535

qt程式設計中所使用的語言是物件導向的c++,在初學gui程式設計時,如果僅僅依靠qt designer編輯器來通過拖拽一些widget來設計介面,則會很容易迷惑我們,並且很難弄懂其中所涉及的物件導向思想,也不容易弄懂qt gui的乙個整體結構。所以在初學qt gui時可以通過手動編寫介面**來理解qt 的gui結構。

顧名思義,組合widget方法是通過將一些控制項進行組合,形成乙個主視窗。在這種方法中,首先是從qt的gui類庫中選擇乙個類作為主視窗的基類,如qdialog、qwidget、qmainwindow等類中選擇。以qdialog類為例,以對話方塊類為主視窗,然後再新增需要的其它控制項類成員,可以通過布局的方式將其它控制項進行布局,再將最終的布局作為主視窗對話方塊的布局。下面以乙個簡單的對話方塊為例,相關**如下:

[cpp]view plain

copy

#include //布局管理器

#include 

#include 

#include 

int main(int argc, char *argv)    

執行結果如下,乙個對話方塊為主視窗,在其中新增乙個slider和spinbox類,並將其進行橫向布局,再將布局新增到主視窗中。

qhboxlayout:在水平方向上排列視窗部件,從左到右(一般情況下)。

qvboxlayout:在豎直方向上排列視窗部件,從上到下。

qgridlayout:把各個視窗部件排列在乙個網格中。

組合widget的方法屬於面向過程的方法,當程式的規模逐漸變大時,使用這種方法會使得**量太多,結構混雜,不利於閱讀。既然是使用c++語言,使用物件導向的方法肯定是最好的選擇。子類化widget的方法即為建立乙個新類,這個新類就相當於乙個新視窗,可以是主視窗,也可以是需要的一些對話方塊或視窗部分,可以繼承於一些主視窗類,如qdialog、qmainwindow類等,然後將該視窗中所需要的控制項類作為成員物件新增進去,然後就可以之間通過例項化該類便可以建立乙個包含了一系列控制項的小視窗了。還是以上述例子為例,用子類化的方法實現:相關**如下:

標頭檔案head.h

[cpp]view plain

copy

"font-weight: normal;">"font-size:14px;">#define head_h  

#include 

class qspinbox;  

class qslider;  

class test:public qdialog  ;  

實現檔案test.cpp

[cpp]view plain

copy

"font-weight: normal;">"font-size:14px;">#include "head.h"

"font-weight: normal;">"font-size:14px;">test::test(qwidget *parent):qdialog(parent)    

主函式檔案main.cpp

[cpp]view plain

copy

"font-weight: normal;">"font-size:14px;">#include //布局管理器

#include 

#include 

#include 

#include "head.h"

int main(int argc, char *argv)    

結果

使用**編寫的方式來設計介面往往比較麻煩,而且需要修改的時候往往比較麻煩。這個時候可以使用qt designer編輯器來編輯介面。主要的實現方式是:首先在專案中建立乙個介面ui檔案,通過拖拽控制項的方式畫好自己的介面,設定各個widget的屬性。然後我們怎麼將這個ui檔案使用到專案中去呢?在進行qmake之後,會自動檢測到專案中的ui檔案並且可以生成適當的makefile檔案,makefile檔案會呼叫qt的使用者介面編譯器(user inte***ce compiler,uic),uic會將ui檔案轉換成c++檔案,轉換結果存放在ui_[ui檔名].h中。這個標頭檔案其實就類似於第一點中所說的子類化widget的類定義標頭檔案,只是這裡的類是根據使用者所設計的介面自動生成的,即這個標頭檔案中主要包含ui檔案的類宣告和介面中所使用到的一些控制項的宣告,以及乙個用於初始化窗體的setupui()函式。還是以第一點中所使用的例子來說明一下,過程如下:

執行之後我們發現專案檔案中會生成乙個名為ui_test.h的標頭檔案,部分**如下:

我們可以發現ui_test.h標頭檔案中主要是乙個類ui_test的宣告,以及乙個控制項的宣告等,這裡面的內容即為我們在qt designer中所設計的介面。類似於我們通過拖拽控制項的方式完成了子類化widget。

接下來我們要做的事情就是通過繼承我們所設計的類ui_test來建立視窗。

先在標頭檔案中繼承類ui_test,**如下:(注意下面繼承的類名叫做ui:test而非ui::ui_test的原因是ui_test.h中已將其繼承為test類了,具體檢視標頭檔案中的**)

test2.h

[cpp]view plain

copy

"font-size:14px;">#define test2_h  

#include 

#include "ui_test.h"

class test2:public qdialog,public ui::test    

;"font-size: 18px;">  

然後在原始檔中實現:

[cpp]view plain

copy

test2::test2(qwidget *parent):qdialog(parent)  

test2::~test2()    

主函式檔案:

[cpp]view plain

copy

#include "test2.h"

int main(int argc, char *argv)    

執行結果如下:

ps:在做這個簡單的實驗過程中,我還是出現了一點小問題,解決了,還是拿出來跟大家分享一下,如果有同學出現同樣的錯誤就不用在糾結了。

錯誤提示是:expected class-name before ';  

} // namespace ui  

定義了乙個名為ui的命名空間,其中已經對ui_test進行了繼承了的類test在其中。如果我們不使用命名空間ui的話也可以改為:

[cpp]view plain

copy

class test2:public qdialog,public ui_test  

但是一般推薦第一種改法,因為使用qt介面設計器進行設計視窗的時候經常設計到的類名很容易相同混淆,使用ui命名空間可以將關於設計介面自動生成的視窗類放在乙個空間內比較好。

C 中的兩種顯示窗體模式

opencode introduction c 中有兩種顯示窗體的方法,乙個就是form.show 另乙個就是form.showdialog 雖然兩者都可以實現窗體顯示,但是二者還是存在著不同點的。方法名,功能說明 form.show 顯示窗體。form.showdialog 將窗體顯示為模式對話方...

python threading 兩種建立方式

作用 建立在thread模組之上,可以更容易地管理多個執行執行緒。通過使用執行緒,程式可以在同乙個程序空間併發地執行多個操作。threading模組建立在thread的底層特性基礎上,可以更容易地完成執行緒處理。1 呼叫函式 要使用thread,最簡單的方法就是用乙個目標函式例項化乙個thread物...

Java中建立String的兩種方式

建立乙個string型別的變數一般有兩種方法,如下 public class test 那麼為什麼會存在這兩種建立方式呢,它們在記憶體中的表現形式各有什麼區別?第一種情況 建立的str1,str2兩個字串,和equals比較返回都為true,這是因為str1,str2都指向了方法區的同乙個字串。所以...