本文主要介绍ui文件及其使用.
一、ui文件介绍
Qt项目编译成功后,你会发现一个.ui文件和ui_.h文件。一般还会有ui.setupUi(this);代码。本文介绍一下ui文件。
在VS2013中新建一个Qt Project(名为csdn),然后用文档编辑器打开csdn.ui文件,如下图所示,我们会发现其实是个自定义标签的XML文件。
<UI version="4.0" >
<class>csdnClass</class>
<widget class="QMainWindow" name="csdnClass" >
<property name="objectName" >
<string notr="true">csdnClass</string>
</property>
<property name="geometry" >
<rect>
<x>0</x>
<y>0</y>
<width>600</width>
<height>400</height>
</rect>
</property>
<property name="windowTitle" >
<string>csdn</string>
</property>
<widget class="QMenuBar" name="menuBar" />
<widget class="QToolBar" name="mainToolBar" />
<widget class="QWidget" name="centralWidget" />
<widget class="QStatusBar" name="statusBar" />
</widget>
<layoutDefault spacing="6" margin="11" />
<pixmapfunction></pixmapfunction>
<resources>
<include location="csdn.qrc"/>
</resources>
<connections/>
</UI>
对应有个csdn.h文件,该文件在第一次编译之后才能打开,主要代码如下
#ifndef UI_CSDN_H
#define UI_CSDN_H
#include <QtCore/QVariant>
#include <QtWidgets/QAction>
#include <QtWidgets/QApplication>
#include <QtWidgets/QButtonGroup>
#include <QtWidgets/QHeaderView>
#include <QtWidgets/QMainWindow>
#include <QtWidgets/QMenuBar>
#include <QtWidgets/QStatusBar>
#include <QtWidgets/QToolBar>
#include <QtWidgets/QWidget>
QT_BEGIN_NAMESPACE
class Ui_csdnClass
{
public:
QMenuBar *menuBar;
QToolBar *mainToolBar;
QWidget *centralWidget;
QStatusBar *statusBar;
void setupUi(QMainWindow *csdnClass)
{
if (csdnClass->objectName().isEmpty())
csdnClass->setObjectName(QStringLiteral("csdnClass"));
csdnClass->resize(600, 400);
menuBar = new QMenuBar(csdnClass);
menuBar->setObjectName(QStringLiteral("menuBar"));
csdnClass->setMenuBar(menuBar);
mainToolBar = new QToolBar(csdnClass);
mainToolBar->setObjectName(QStringLiteral("mainToolBar"));
csdnClass->addToolBar(mainToolBar);
centralWidget = new QWidget(csdnClass);
centralWidget->setObjectName(QStringLiteral("centralWidget"));
csdnClass->setCentralWidget(centralWidget);
statusBar = new QStatusBar(csdnClass);
statusBar->setObjectName(QStringLiteral("statusBar"));
csdnClass->setStatusBar(statusBar);
retranslateUi(csdnClass);
QMetaObject::connectSlotsByName(csdnClass);
} // setupUi
void retranslateUi(QMainWindow *csdnClass)
{
csdnClass->setWindowTitle(QApplication::translate("csdnClass", "csdn", 0));
} // retranslateUi
};
namespace Ui {
class csdnClass: public Ui_csdnClass {};
} // namespace Ui
QT_END_NAMESPACE
#endif // UI_CSDN_H
该头文件主要完成了子窗口控件的新建和布局,同时定义命名空间Ui。
需要注意的是,该头文件是在编译.ui文件时自动生成,所以不要试图对头文件进行修改*。
二、ui文件的使用
ui文件的使用有三种方法:1、直接使用 2、作为窗口类的成员 3、作为基类派生出新窗口类
1、直接使用
直接使用是重写main函数,在主函数中显示创建使用。一般很少这样用。
#include "csdn.h"
#include <QtWidgets/QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
csdn w; //class csdn : public QMainWindow
Ui::csdnClass ui;
ui.setupUi(&w);
w.show();
return a.exec();
}
2、作为父窗口的成员
作为父窗口的私有成员,并在构造函数中实例话 Ui::csdnClass。之后调用 Ui::csdnClass的setupUi方法。
#ifndef CSDN_H
#define CSDN_H
#include <QtWidgets/QMainWindow>
#include "ui_csdn.h"
class csdn : public QMainWindow
{
Q_OBJECT
public:
csdn(QWidget *parent = 0);
~csdn();
private:
Ui::csdnClass ui;
};
#endif // CSDN_H
#include "csdn.h"
csdn::csdn(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
}
csdn::~csdn()
{
}
3、作为基类派生出新窗口类
使用C++的多重继承,是窗口类同时继承Ui::csdnClass
#ifndef CSDN_H
#define CSDN_H
#include <QtWidgets/QMainWindow>
#include "ui_csdn.h"
class csdn : public QMainWindow, public Ui::csdnClass
{
Q_OBJECT
public:
csdn(QWidget *parent = 0);
~csdn();
};
#endif // CSDN_H
#include "csdn.h"
csdn::csdn(QWidget *parent)
: QMainWindow(parent)
{
setupUi(this);
}
csdn::~csdn()
{
}
备注:类名在实际工程中不应该小写,以上代码只是用来演示。
三种方法运行结果一样,如下图所示:
总结
虽然现在很多移动平台都在使用类似的*.ui文件的XML格式的文件作为窗口的界面设计使用,但是有两个问题:第一、有很多平台没有类似Qt Designer的工具需要程序员直接编辑该文件;第二、很少有平台想Qt这样先把ui文件转化成C++文件再编译的。很多都是直接丢给操作系统,在运行程序时才去解析,这无疑降低了程序的运行效率。