1. 程式人生 > >[轉]Qt中ui文件的使用

[轉]Qt中ui文件的使用

如何 pro 進行 rect 相關 set utf8 產生 pan

用designer設計的*.ui文件可以通過uic工具轉換為*.h文件(在編譯時也會自動生成這樣一個ui_*.h文件),有了這個.h文件就可以直接按照純C++的方式對其中的類進行調用。ui文件的使用就是利用默認工具uic自動產生一個類,然後用該類的setui函數加載界面到相應的對象上。

.ui文件的使用有三種形式:第一種是直接使用,第二種是定義一個新類,聲明一個ui子對象,利用該對象來加載界面,第三種是將ui作為基類派生新的類。

借用一個例程分析如下:

工程及界面

技術分享

技術分享

/***************************************dialog.h********************************************/
#ifndef DIALOG_H
        #define DIALOG_H
#include <QDialog>
namespace Ui {
                class Dialog;      
}

/*為什麽要使用這樣一個命名空間呢?因為我們接著又要定義一個Dialog類,二者同名,所以才用了這個命名空間。此處的類Dialog繼承自Ui_Dialog,屬於一個前置聲明

,因為在dialog.h中我們有這麽一句Ui::Dialog *ui; 使用了Ui::Dialog 來定義一個指針,但是這個Ui::Dialog並沒有實際上進行定義(我們是在下文中的ui_dialog.h中定義的Dialog),也沒有包含相關頭文件,所以用了一個前置聲明(關於前置聲明此處略)*/

class Dialog : public QDialog {        //又定義了一個Dialog類
                Q_OBJECT
        public:
                Dialog(QWidget *parent = 0);
                
~Dialog(); protected: void changeEvent(QEvent *e); private: Ui::Dialog *ui; // 聲明一個子類 private slots: void on_pushButton_clicked(); }; #endif // DIALOG_H

紅色部分聲明一個類,將設計出來的ui界面作為該類的一個子對象,在其構造函數中,先完成對子對象的構造,再使用子對象ui調用其setupUi(this)函數實現ui的現實。

Dialog::Dialog(QWidget *parent) :
                QDialog(parent),
                ui(new Ui::Dialog)
        {
                ui->setupUi(this);   //加載界面
        }

看完上面的代碼,我們來分析下到底為什麽要這樣來使用ui文件。

在沒有qtcreator之前,給了我們一個ui文件,該如何調用?

針對於ui文件,不知道大家知不知道uic這個工具,這是qt繼承的一個工具,它可以利用ui生產.h文件。

uic dialog.ui –o ui_dialog.h

就生產了下面的ui_dialog.h文件:

/**************************************ui_dialog.h*******************************************/
#ifndef UI_DIALOG_H
        #define UI_DIALOG_H
#include <QtCore/QVariant>
        #include <QtGui/QAction>
        #include <QtGui/QApplication>
        #include <QtGui/QButtonGroup>
        #include <QtGui/QDialog>
        #include <QtGui/QHeaderView>
        #include <QtGui/QLabel>
        #include <QtGui/QPushButton>
QT_BEGIN_NAMESPACE
class Ui_Dialog
        {
        public:
                QLabel *label;
                QPushButton *pushButton;
        void setupUi(QDialog *Dialog)
                {
                        if (Dialog->objectName().isEmpty())
                        Dialog->setObjectName(QString::fromUtf8("Dialog"));
                        Dialog->resize(115, 148);
                        label = new QLabel(Dialog);
                        label->setObjectName(QString::fromUtf8("label"));
                        label->setGeometry(QRect(10, 30, 91, 21));
                        QFont font;
                        font.setPointSize(12);
                        font.setBold(true);
                        font.setWeight(75);
                        label->setFont(font);
                        pushButton = new QPushButton(Dialog);
                        pushButton->setObjectName(QString::fromUtf8("pushButton"));
                        pushButton->setGeometry(QRect(20, 80, 75, 23));
                retranslateUi(Dialog);
                QMetaObject::connectSlotsByName(Dialog);
                } // setupUi
        void retranslateUi(QDialog *Dialog)
                {
                        Dialog->setWindowTitle(QApplication::translate("Dialog",        "Dialog",        0,        QApplication::UnicodeUTF8));
                        label->setText(QApplication::translate("Dialog",        "hello,wang",        0,        QApplication::UnicodeUTF8));
                        pushButton->setText(QApplication::translate("Dialog",        "close",        0,        QApplication::UnicodeUTF8));
                } // retranslateUi
};
namespace Ui {
                class Dialog: public Ui_Dialog {};    //此處定義了命名空間,其中定義了一個Dialog類,繼承自Ui_Dialog類
        } // namespace Ui
QT_END_NAMESPACE
#endif // TT_H

通過觀察我們會發現uic自動將我們設計的ui文件,生成了一個類,在此例中為class Ui_Dialog。事實上也是這樣,uic會自動會利用設計好的ui生成一個包含類Ui_**的ui_**.h文件。那麽在此例中,就會將我們設計好的dialog就會被uic文件解析,生成一個叫做ui_dialog.h的文件,此文件中包含Ui_Dialog的類。

那麽總結出來,要讓ui design設計出來的界面顯示出來,只要能設法調用Ui_Dialog類的setupUi函數就行了。

一種簡單的方法,直接使用,重新寫一個這樣的main函數。

#include <QtGui/QApplication>
        #include <QDialog>
#include "ui_dialog.h"
        int main(int argc, char *argv[])
        {
        QApplication a(argc, argv);
        Ui::Dialog ui;
        QDialog *d=new QDialog;
        ui. setupUi(d);
                d->show();
                return a.exec();
        }

第二種方法相對比較簡單一點,就是將Ui::Dialog ui或Ui::Dialog *ui寫成一個新定義類的一個數據成員,也就是qtcreator提供的那種方法。(也叫單繼承方法,只繼承了QDialog類)

#include <QDialog>
        #include "ui_dialog.h"
class Dialog : public QDialog {
                Q_OBJECT
        public:
                Dialog(QWidget *parent = 0);
                ~Dialog();
protected:
                void changeEvent(QEvent *e);
private:
                Ui::Dialog *ui;
private slots:
                void on_pushButton_clicked();
        };

這樣使用的時候需要註意的是在初始化的時候要先完成子對象的初始化,在其構造函數中重寫構造函數。

Dialog::Dialog(QWidget *parent) :
                QDialog(parent),
                ui(new Ui::Dialog)
        {
                ui->setupUi(this);
        }

第三種方法是以Ui_Dialog類為基類,派生一個新類,在該類的初始化函數中調用setupUi。(也叫多重繼承方法,繼承了QDialog類和Ui::Dialog類)

#ifndef DIALOG_H
        #define DIALOG_H
#include <QDialog>
        #include "ui_dialog.h"
class Dialog : public QDialog ,public Ui::Dialog
        {
                Q_OBJECT
        public:
                Dialog(QWidget *parent = 0);
        };

實現如下:

#endif // DIALOG_H
        #include "dialog.h"
        #include "ui_dialog.h"
Dialog::Dialog(QWidget *parent) :
                QDialog(parent),
                Ui::Dialog()       
        {
                setupUi(this);
        }

附上一個直接使用ui_hellodialog.h的小例程

技術分享 技術分享

程序如下:

/**************************************ui_hellodialog.h******************************************/

/******************************************************************************** 
** Form generated from reading UI file ‘hellodialog.ui‘ 
** 
** Created: Wed May 14 19:28:14 2014 
**      by: Qt User Interface Compiler version 4.8.4 
** 
** WARNING! All changes made in this file will be lost when recompiling UI file! 
********************************************************************************/  
  
#ifndef UI_HELLODIALOG_H  
#define UI_HELLODIALOG_H  
  
#include <QtCore/QVariant>  
#include <QtGui/QAction>  
#include <QtGui/QApplication>  
#include <QtGui/QButtonGroup>  
#include <QtGui/QDialog>  
#include <QtGui/QHeaderView>  
#include <QtGui/QLabel>  
  
QT_BEGIN_NAMESPACE  
  
class Ui_HelloDialog  
{  
public:  
    QLabel *label;  
  
    void setupUi(QDialog *HelloDialog)  
    {  
        if (HelloDialog->objectName().isEmpty())  
            HelloDialog->setObjectName(QString::fromUtf8("HelloDialog"));  
        HelloDialog->resize(400, 300);  
        label = new QLabel(HelloDialog);  
        label->setObjectName(QString::fromUtf8("label"));  
        label->setGeometry(QRect(120, 120, 151, 31));  
  
        retranslateUi(HelloDialog);  
  
        QMetaObject::connectSlotsByName(HelloDialog);  
    } // setupUi  
  
    void retranslateUi(QDialog *HelloDialog)  
    {  
        HelloDialog->setWindowTitle(QApplication::translate("HelloDialog", "Dialog", 0, QApplication::UnicodeUTF8));  
        label->setText(QApplication::translate("HelloDialog", "Hello World! \344\275\240\345\245\275Qt\357\274\201", 0, QApplication::UnicodeUTF8));  
    } // retranslateUi  
  
};  
  
namespace Ui {  
    class HelloDialog: public Ui_HelloDialog {};  
} // namespace Ui  
  
QT_END_NAMESPACE  
  
#endif // UI_HELLODIALOG_H  

/****************************************main.cpp****************************************/

#include "ui_hellodialog.h"  
int main(int argc, char *argv[])  
{  
    QApplication a(argc, argv);  
    QDialog w;  
    Ui::HelloDialog ui;  
    ui.setupUi(&w);  
    w.show();  
    return a.exec();  
}  

引文鏈接:

2.3 使用Qt設計師來創建對話框

Qt中ui文件的使用

ui_*.h文件中自動生成的界面類的使用方法

[轉]Qt中ui文件的使用