ui文件的使用是在Qt4中不太容易上手的一點,由於不少同窗都是從Qt3升級到Qt4的,在升級過程當中發現這部分的變化很是之大,讓人有點無所適從。 Qt3的designer簡直能夠媲美一個ide,能夠編輯代碼,能夠管理工程, 但是到了Qt4卻彷彿是退化到了史前一萬年,咱們又來到那個茹毛飲血的蠻荒時代,工程管理的功能被完全剔除到designer之外。編程
Trolltech這樣作也是有道理的,在他們的Qt4 What’s New裏就闡述了他們的觀點,Designer被清晰地定義爲界面設計工具,只負責界面設計這個單純的功能。(估計這也是在爲後來的Creator發佈作鋪墊,全部你須要的工程管理的功能都放在這個新工具裏實現了。)ide
在qt文檔中有一篇專門介紹ui文件在代碼中的使用的文章,寫的很是詳細,並且附有清楚的代碼例子。這篇文章在Assitant–>Content–>Qt Designer Manual–>Manual–>Using a Component in Your Application(4.5之後該文章改名爲Using a Designer .ui File in Your Application)。 不過在筆者實踐過程當中發現,其實還有一些隱藏在代碼以外的細節須要你們額外注意的,仍是須要點撥一下。函數
鑑於一些同窗還沒適應大篇英文的閱讀,另外鑑於這篇文檔確實不那麼好找,在這裏作個總結,但願對你們有所幫助。工具
首先應該用Qt Designer繪製一個本身的界面,並存爲myform.ui(這裏的myform能夠用本身喜歡的名字代替)。學習
在製做本身的界面文件時要注意如下幾個要點:ui
一、要記住ui文件的名字,由於uic生成的代碼會存在ui_myform.h裏
二、要記住主窗體的object name, 由於ui文件提供的類名將以這個form的名字來命名
三、要特別注意你的form選擇的基類要和你代碼中的窗體類兼容
四、要記得給每一個後面須要訪問到的控件起一個有意義而且好記的object name, 由於ui文件提供的控件將以這些object name來命名this
清楚了以上幾點,在代碼中使用你的ui文件就會變得很是簡單。spa
這一步最簡單,只須要修改pro文件,加入FORMS+=myform.ui.net
qmake -project命令也能夠識別後綴名爲ui的文件,並將之加入工程。翻譯
官方介紹的使用ui文件的方法有三種,一個是直接引用,二是單繼承,三是多繼承。 第一種方法其實很不實用,你們去看一下文檔中的例子就能夠了;第二種和第三種沒有本質的差異,能夠並做一類,這裏作重點介紹。
ui文件最終會被翻譯成標準的C++代碼,並存入一個.h文件中,這個過程在調用make以後才進行,因此初始狀況下你是看不到這個ui_myform.h文件的,只有通過了make過程該頭文件才生成。不過不要緊,沒有這個文件咱們照樣能寫出正確的代碼。
單繼承方式簡單來講就是在代碼中首先要自定義一個子類(後文稱爲MyForm),該類要從form對應的窗體類(或其兼容的子類)派生;並用ui生成的類定義一個類裏的成員變量(後文成文myui)。這樣在MyForm的構造函數中能夠直接調用myui和myui中的變量和函數,使用起來很方便。 舉例說明, 好比這裏有一個ui文件叫myform.ui, ui文件裏定義的窗體名字爲BigWidget,上面擺放了一個單行編輯控件叫lineeditName:
- //myform.h
- #include 「ui_myform.h」
- class MyForm: public QWidget
- {
- Q_OBJECT
- public:
- MyForm(QWidget*parent) { myui.setupUi(this); }
- private:
- Ui::BigWidget myui;
- private:
- void my_function();
- };
上面這段簡單的類的聲明是前文所述前三點要點的最佳例證,請對照要點的文字描述和具體的代碼體會其中的含義。這裏還有一點比較有意思的地方,就是ui文件提供的類被包含在了名爲Ui的name space裏,這樣作的目的是將ui文件的命名空間與用戶的代碼分離,避免二者出現命名衝突的狀況。相應的,咱們寫代碼的時候也要注意在使用ui文件中的類時要用「Ui::」的方式進行引用。
再來看cpp文件
- //myform.cpp
- #include <QMessageBox>
- #include 「myform.h」
- void MyForm::my_function(void) {
- QMessageBox::information(this, 「Name」, myui.lineeditName->text());
- }
這裏隨便寫了一個函數,爲了說明如何在窗體類裏調用ui文件中定義的控件。這段代碼很是簡單,就很少做說明了。
有了單繼承的基礎,學習多繼承是小菜一碟。來段代碼看一下就明白了。
- //myform.h #include 「ui_myform.h」
- class MyForm: public QWidget, public Ui::BigWidget
- {
- Q_OBJECT
- public:
- MyForm(QWidget*parent){setupUi(this);}
- private:
- void my_function();
- };
- //myform.cpp
- #include <QMessageBox>
- #include 「myform.h」
- void MyForm::my_function(void) {
- QMessageBox::information(this, 「Name」, lineeditName->text());
- }
是否是不用說明你們也能明白呢?多繼承其實就是不只從form須要的窗體類去派生,還要加上ui提供的類自己。這樣帶來的好處是你的窗體類繼承了ui裏的全部控件和方法,調用時就能夠少寫一些字。
單繼承和多繼承這兩種方法沒有好壞之分,你們能夠根據本身的編程習慣取捨。
在pro文件包含正確FORMS信息的狀況下,運行qmake; make就能夠編譯工程了。 make時若是你認真看一下輸出就會發現,make在最開始編譯的時候就會自動調用uic去生成須要的代碼。通過make以後ui_myform.h文件就生成了,建議你們去看一下這個文件的內容,其中仍是有一些有意思的東西值得研究的。
轉自:http://blog.csdn.net/yf24518150/article/details/5615960