Qt的設計初衷就是爲了能夠直觀並且友好地進行手工編碼,對於程序員來說,純粹通過編寫C++源代碼來開發整個Qt應用程序並不稀奇。儘管如此,許多程序員還是喜歡使用可視化的方法來設計窗體,因爲他們發現使用可視化方式會比手工編碼顯得更自然、更快速,並且也希望能夠通過可視化方法,對那些手工編碼所設計的窗體,進行更快速、更容易的測試和修改。
Q設計師( Qt Designer)爲程序員們提供了可供使用的新選擇,它提供一種可視化的設計能力。Qt設計師可用於開發應用程序中的所有或部分窗體。使用Qt設計師所創建的窗體最終仍舊是C++代碼,因此,可把Qt設計師看作是一個傳統的工具集,並且不會對編譯器強加其他特殊要求。
無論是使用手工編碼還是使用Qt設計師,創建對話框時總是要包含以下這幾個相同的基本步驟:
- 創建並初始化子窗口部件。
- 把子窗口部件放到佈局中。
- 設置Tab鍵順序(窗口部件接收焦點的順序)。
- 建立信號-槽之間的連接。
- 實現對話框中的自定義槽。
以下是使用ui文件的代碼:
#include <QApplication>
#include <QDialog>
#include "ui_gotocelldialog.h"
int main(int argc, char *argv[])
{
#if 1
QApplication app(argc, argv);
Ui::GoToCellDialog ui;
QDialog *dialog = new QDialog;
ui.setupUi(dialog);
dialog->show();
return app.exec();
#endif
}
qmake工具可以自動檢測到用戶界面文件(***.ui文件)並且可以生成適當的makefile規則來調用Qt的用戶界面編譯器(user interface compiler,uic)。uic工具會將**.ui文件轉換成C++並且將轉換結果存儲在ui_**.h文件中。
所生成的ui_**.h文件中包含了類Ui::XXX的定義,該類是一個與**.ui文件等價的C++文件。這個類聲明瞭一些成員變量,它們存儲着窗體中的子窗口部件和子佈局,以及用於初始化窗體的 setupUi()成員函數。
Ui::XXX類的定義如下:
class Ui_XXX
{
public:
QVBoxLayout *vboxLayout;
QHBoxLayout *hboxLayout;
QLabel *label;
QLineEdit *lineEdit;
QHBoxLayout *hboxLayout1;
QSpacerItem *spacerItem;
QPushButton *okButton;
QPushButton *cancelButton;
void setupUi(QWidget *GoToCellDialog)
{
...
}
...
生成的類沒有任何基類。當在main.cpp文件中使用該窗體時,可以創建一個 QDialog對象,然後把它傳遞給 setupUi()函數。
如果現在運行該程序,對話框也可以工作,但它並沒有正確地實現所想要的那些功能:
- OK按鈕總是失效的。
- Cancel按鈕什麼也做不了。
- 行編輯器可以接受任何文本,而不是隻能接受有效的單元格位置座標。
通過寫一些代碼,就可以讓對話框具有適當的功能。最爲簡捷的做法是創建一個新類,讓該類同時從QDialog和Ui::XXX中繼承出來,並且由它來實現那些缺失的功能(從而也證明了這句話:通過簡單地增加另外一個間接層就可以解決軟件的任何問題)。命名慣例是:將該類與uic所生成的類具有相同的名字,只是沒有Ui::前綴而已,在該類的構造函數中調用Ui::XXX的setUi()成員函數實現窗口創建,然後再決定每一個子部件的行爲。因爲多重繼承的關係,XXX類中可以直接訪問Ui::XXX的所有成員。setUi()成員可以自動將子部件的信號和符合一定命名規則的槽函數進行連接。