用designer設計的*.ui文件能夠經過uic工具轉換爲*.h文件(在編譯時也會自動生成這樣一個ui_*.h文件),有了這個.h文件就能夠直接按照純C++的方式對其中的類進行調用。ui文件的使用就是利用默認工具uic自動產生一個類,而後用該類的setui函數加載界面到相應的對象上。html
.ui文件的使用有三種形式:第一種是直接使用,第二種是定義一個新類,聲明一個ui子對象,利用該對象來加載界面,第三種是將ui做爲基類派生新的類。函數
借用一個例程分析以下:工具
工程及界面post
/***************************************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),也沒有包含相關頭文件,因此用了一個前置聲明(關於前置聲明此處略)*/ui
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的現實。this
Dialog::Dialog(QWidget *parent) : QDialog(parent), ui(new Ui::Dialog) { ui->setupUi(this); //加載界面 }
看完上面的代碼,咱們來分析下到底爲何要這樣來使用ui文件。url
在沒有qtcreator以前,給了咱們一個ui文件,該如何調用?spa
針對於ui文件,不知道你們知不知道uic這個工具,這是qt繼承的一個工具,它能夠利用ui生產.h文件。.net
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(); }
引文連接: