使用VS2010呼叫QtDesigner設計的UI檔案,並實現控制元件功能
一、利用Qt Designer設計UI。
參見《Linux視窗程式設計—Qt4精彩例項分析》
1、使用Qt Designer設計對話方塊的步驟:
2、Qt Designer5中表單模板。
3、建立窗體,在窗體放置控制元件(拖動控制元件到窗體介面);
4、佈局控制元件;
選擇位於同一行的所有控制元件,選擇Qt Designer選單中的Form->LayOut Horizontally命令,完成所選控制元件的水平佈局。完成佈局後適當調整整個窗體的大小,以適應控制元件的大小。
5、設定各控制元件標籤順序;
選擇Qt Designer選單中的Edit->Edit Tab Order
6、建立和連線訊號和槽
選擇Qt Designer選單中的Edit->EditSignals/Slots命令,進入訊號/槽連線模式,如下圖所示。
此時單擊控制元件,然後拖動滑鼠,可以發現一根紅色的類似接地線的標誌線被拖出,鬆開滑鼠,彈出訊號/槽的連線配置視窗,如下圖所示。
注:選擇左邊列表框中的訊號,然後才可以選擇右邊槽函式,之後點選確定即可。
疑問:這些槽函式所代表的意思分別是??
至此,關於QtDesigner的操作就結束了,生成一個.ui檔案。此檔案即是UI檔案,使用前需要加入工程並被編譯。
【使用QtDesigner設計對話方塊的優劣】可以節省設計對話方塊的時間,而且修改方便、直觀,對於初學者來說,這是一種入門的好方法。帶隨著程式越來越複雜,QtDesigner也有不利的地方:首先,使用QtDesigner生成的程式碼比較龐大,很多程式碼是自動生成的,不利於開發者閱讀;其次,不利於對Qt程式設計本質的理解。
二、呼叫QtDesigner生成的ui檔案。
說明:我的開發環境是在VS2010中開發Qt程式,所以以下所有內容均是在此基礎上做的實現。此開發環境的搭建見博文《QT
1、單純的呼叫ui檔案。
在上面生成的ui檔案為myui.ui,如何將其新增到工程中並使用呢,步驟如下:
a、使用VS2010新建Qt Application,工程名myui;
b、使用QtDesigner生成的myui.ui檔案覆蓋VS2010建立Qt工程中的myui.ui;
c、在VS2010解決方案樹狀圖中找到myui.ui,右鍵選擇“編譯”命令,VS會自動呼叫Qt的uic工具編譯ui檔案,生成標頭檔案ui_myui.h。這個檔案包含了在Designer中所做的所有工作。
【對生成的ui_myui.h說明】
c1、該檔案是自動生成的,如果在UI設計過程中連線了訊號和槽,那麼生成的程式碼中將出現如下類似程式碼:
retranslateUi(Dialog);
QObject::connect(pushButtonOK, SIGNAL(clicked()), Dialog, SLOT(accept()));
QObject::connect(pushButtonCancel, SIGNAL(clicked()), Dialog, SLOT(reject()));
QMetaObject::connectSlotsByName(Dialog);
用於將UI中控制元件的訊號和槽函式繫結。
這樣在自己實現槽函式的時候就不用再寫繫結函數了。
c2、在此.h檔案中有定義了一個類class Ui_Dialog,並且有一個Dialog類以public的方式繼承Ui_Dialog,在namespace ui中,class Dialog: public Ui_Dialog {} 名字可能有些不同。特別說明:Dialog即是我們用designer設計的ui實體類。在main函式中就是使用此類聲稱物件。
d、修改myui工程的main.cpp檔案。如下:
將原有包含的標頭檔案“myui.h”修改為新生成的ui_myui.h,包含Dialog標頭檔案。在main函式中新增如圖所示程式碼執行即可執行呼叫UI檔案。目前只是呼叫了UI,並沒有實現槽函式。
2、實現UI中新增的系統定義槽函式。
自己定義類實現槽函式。為什麼要自己定義類呢?是這樣的,如果我們直接呼叫的話,有很大的弊端:當我們的工程很浩大的時候,如果我們要修改ui檔案了,則要相應改很多源程式來繼續當前的功能,而如果我們定義一個類來繼承它的話,隨你ui怎麼變,跟我關係不是很大。參見:
myclass.h
#include
#include “ui_myui.h”
namespace Ui
{
class myui;//注:designer生成的ui類為ui_DialogClass,而我們只是用它的派生類myui ,即myui是ui_DialogClass的一個實體
}
class myclass : public QDialog//自定義一個類myclass,通過呼叫ui類
{
Q_OBJECT
public:
myclass(QWidget *parent = 0);//最頂層父視窗為QWidget
~myclass();
private:
Ui::myui *ui;//建立一個ui指標物件,因為designer只是設計出來一個myui實體類,是個巨集觀概念,我們必須定義一個物件才能呼叫它
};
myclass.cpp
#include "myclass.h"
myclass::myclass(QWidget *parent) :QDialog(parent),ui(new Ui::myui)
{
ui->setupUi(this);//使用ui類
//如果沒有在UI設計過程中連線訊號和槽函式則在此處新增。
}
myclass::~myclass()
{
delete ui;
}
OK!我們的類已經定義好,寫main函式呼叫自定義的類
#include
#include"myclass.h"//注:為什麼只要這個標頭檔案就可以了呢?因為當我們建立一個myclass的物件的時候,會自動呼叫它的建構函式,釋放時自動呼叫其解構函式。事實上我們不止只用一個建構函式與解構函式,這時候怎麼辦呢?在myclass.h中宣告該函式,在myclass.cpp中寫具體實現方法。
int main(int argc,char *argv[])
{
QApplication app(argc,argv);
myclass window;
window.show();
return app.exec();
}
3、如果沒有在UI設計過程中連線訊號和槽函式則在自己定義的實現類中新增槽函式,並連線,連線位置一般在實現類的建構函式中。此時connect函式在使用UI上的控制元件時一定要加字首。如下:
connect( ui->pushButton, SIGNAL( clicked() ), this, SLOT( close() ) );