用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); //加载界面
}