1. 程式人生 > >使用VS2010呼叫QtDesigner設計的UI檔案,並實現控制元件功能

使用VS2010呼叫QtDesigner設計的UI檔案,並實現控制元件功能

一、利用Qt Designer設計UI

參見《Linux視窗程式設計—Qt4精彩例項分析》

1、使用Qt Designer設計對話方塊的步驟:

2Qt Designer5中表單模板。

3、建立窗體,在窗體放置控制元件(拖動控制元件到窗體介面);

4、佈局控制元件;

選擇位於同一行的所有控制元件,選擇Qt Designer選單中的Form->LayOut Horizontally命令,完成所選控制元件的水平佈局。完成佈局後適當調整整個窗體的大小,以適應控制元件的大小。

5、設定各控制元件標籤順序;

選擇Qt Designer選單中的Edit->Edit Tab Order

命令,進入標籤設定模式,窗體中各個空間上出現藍色的小框,框內的數字表示該控制元件的標籤順序,即焦點順序,如下圖所示,可以單擊藍色小框修改標籤順序。完成後選擇QtDesigner選單中的Edit->Edit Widgets命令(或者F3)離開標籤設定模式。

6、建立和連線訊號和槽

選擇Qt Designer選單中的Edit->EditSignals/Slots命令,進入訊號/槽連線模式,如下圖所示。

此時單擊控制元件,然後拖動滑鼠,可以發現一根紅色的類似接地線的標誌線被拖出,鬆開滑鼠,彈出訊號/槽的連線配置視窗,如下圖所示。

注:選擇左邊列表框中的訊號,然後才可以選擇右邊槽函式,之後點選確定即可。

疑問:這些槽函式所代表的意思分別是??

至此,關於QtDesigner的操作就結束了,生成一個.ui檔案。此檔案即是UI檔案,使用前需要加入工程並被編譯。

【使用QtDesigner設計對話方塊的優劣】可以節省設計對話方塊的時間,而且修改方便、直觀,對於初學者來說,這是一種入門的好方法。帶隨著程式越來越複雜,QtDesigner也有不利的地方:首先,使用QtDesigner生成的程式碼比較龐大,很多程式碼是自動生成的,不利於開發者閱讀;其次,不利於對Qt程式設計本質的理解。

二、呼叫QtDesigner生成的ui檔案。

說明:我的開發環境是在VS2010中開發Qt程式,所以以下所有內容均是在此基礎上做的實現。此開發環境的搭建見博文《QT

介紹以及配置QT使用VS2010開發》

1、單純的呼叫ui檔案。

在上面生成的ui檔案為myui.ui,如何將其新增到工程中並使用呢,步驟如下:

a、使用VS2010新建Qt Application,工程名myui

b、使用QtDesigner生成的myui.ui檔案覆蓋VS2010建立Qt工程中的myui.ui

c、在VS2010解決方案樹狀圖中找到myui.ui,右鍵選擇“編譯”命令,VS會自動呼叫Qtuic工具編譯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() ) );