如何使用ui文件
作者:王姍姍,華清遠(yuǎn)見嵌入式學(xué)院講師。
這兩天跟著班級輔導(dǎo),總有學(xué)生感到很疑惑,用ui designer設(shè)計出來的ui文件是如何使用的,下面我從一個例子來說明下,希望能對有這樣疑惑的同學(xué)有幫助。
事實上,現(xiàn)在有了繼承設(shè)計工具qtcreator,作為開發(fā)者再也不用考慮這個問題,因為當(dāng)你用qtcreator創(chuàng)建一個工程的時候,qtcreator提供的框架已經(jīng)替我們完成了這個任務(wù)。
咱們先從這個程序開始看:
新建一個工程,
在這個工程中用ui designer來設(shè)計了這樣的一個界面
這是我按ctrl+alt+r運行出來的,如何使這個利用ui designer設(shè)計出來的ui文件能運行起來就是我們這篇文章要議論的內(nèi)容。
先來看看qtcreator提供的默認(rèn)框架是如何實現(xiàn)的。要研究qtcreator怎么實現(xiàn),就得先看dialog.h這個文件。
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
namespace Ui {
class Dialog;
}
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();
};
#endif // DIALOG_H
觀察不難得出,在上文中我用紅色包含的就是實現(xiàn)這個程序的關(guān)鍵。它聲明一個類,將設(shè)計出來的ui界面作為該類的一個子對象,在其構(gòu)造函數(shù)中,先完成對子對象的構(gòu)造,再使用子對象ui調(diào)用其setupUi(this)函數(shù)實現(xiàn)ui的現(xiàn)實。
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
}
看完上面的代碼,我們來分析下到底為什么要這樣來使用ui文件。
在沒有qtcreator之前,給了我們一個ui文件,該如何調(diào)用?
針對于ui文件,不知道大家知不知道uic這個工具,這是qt繼承的一個工具,它可以利用ui生產(chǎn).h文件。
uic dialog.ui –o tt.h
就生產(chǎn)了下面的文件:
/********************************************************************************
** Form generated from reading UI file 'dialog.ui'
**
** Created: Sun May 9 17:29:42 2010
** by: Qt User Interface Compiler version 4.6.2
**
** WARNING! All changes made in this file will be lost when recompiling UI file!
********************************************************************************/
#ifndef TT_H
#define TT_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 {};
} // namespace Ui
QT_END_NAMESPACE
#endif // TT_H
通過觀察我們會發(fā)現(xiàn)uic自動將我們設(shè)計的ui文件,生成了一個類,在此例中為classUi_Dialog。事實上也是這樣,uic會自動會利用設(shè)計好的ui生成一個包含類Ui_**的ui_**.h文件。那么在此例中,就會將我們設(shè)計好的dialog就會被uic文件解析,生成一個叫做ui_dialog.h的文件,此文件中包含Ui_Dialog的類。
那么總結(jié)出來,要讓ui design設(shè)計出來的界面顯示出來,只要能設(shè)法調(diào)用Ui_Dialog類的setupUi函數(shù)就行了。
一種簡單的方法,直接使用,重新寫一個這樣的main函數(shù)。
#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寫成一個新定義類的一個數(shù)據(jù)成員,也就是qtcreator提供的那種方法。
#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();
};
這樣使用的時候需要注意的是在初始化的時候要先完成子對象的初始化,在其構(gòu)造函數(shù)中重寫構(gòu)造函數(shù)。
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
}
第三種方法是以Ui_Dialog類為基類,派生一個新類,在該類的初始化函數(shù)中調(diào)用setupUi。
#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);
};
實現(xiàn)如下:
#endif // DIALOG_H
#include "dialog.h"
#include "ui_dialog.h"
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
Ui::Dialog()
{
setupUi(this);
}
希望通過講解,大家能總結(jié)出該如何使用ui文件。無非就是利用默認(rèn)工具uic自動產(chǎn)生的類,去調(diào)用該類的setui函數(shù)。第一種是直接使用,第二種是定義一個新類,聲明一個ui子對象,第三種是將ui作為基類派生新的類。
聯(lián)系客服