作者:华清远见
进行Qt应用程序开发时,经常利用Qt Designer来进行图形用户界面的设计工作。利用它进行图形界面的设计工作有着直观、方面、易于后期维护的优点。在Qt Designer里面做的所有工作,最终会保存为一个XML格式的ui文件,该文件保存了很多窗口部件、布局等的位置和状态信息。而当我们开发一个应用程序时面临的问题便是我们如何使用这个ui文件。对此Qt提供了一个用户界面编译器,该工具可以从这个XML格式的ui文件生成一个C++格式的.h头文件。命令的使用方法是
uic -o 输出文件名(.h文件) 源文件名(.ui文件)
习惯上生成的.h文件名为在源文件名的前面加上ui_前缀,例如源文件名为calculatorform.ui,则生成的.h文件名为ui_calculatorform.h,使用的命令如下:
uic -o ui_calculatorform.h calculatorform.ui
●指向各种widgets,layouts,layout items,button groups以及actions的指针
● 一个称为setupUi()的成员函数用来在构建各种窗口部件和布局,完成初始化及信号/槽的连接
●一个称为translateUi()的成员函数来处理文本翻译相关的工作。
另一个类从该类简单的公有继承,只不过放在了一个叫Ui的命令空间中,例如:
class Ui_Calculatorform
{
public:
QPushButton *pushButton;
...
void setupUi(QWidget *Widget)
{ ... } // setupUi
void retranslateUi(QWidget *Widget)
{ ... } // retranslateUi
};
namespace Ui {
class Calculatorform: public Ui_Calculatorform {};
} // namespace Ui
如何使用该类就是我们接下来要讨论的主题。
有三种主要的方式
方法一:直接法
直接法需要在main.cpp中包含刚才uic所生成的.h头文件。然后在main函数中我们创建一个QWidget的对象及一个该用户界面类的对象,并调用类的setupUi成员函数来使我们的QWidgt对象成为该界面对象的持有者
例如:
#include "ui_calculatorform.h"
int main(int argc,char *argv[])
{
QApplication app(argc,argv);
QWidget *widget = new QWidget; //创建一个QWidget对象
Ui::CalculatorForm ui; //创建一个该界面类的对象
ui.setupUi(widget); //让我们的QWidget对象成为该界面对象的placeholder
widget->show();
return app.exec();
}
Ui::CalculatorForm是ui_calculatorform.h中生成的类。
直接法简单易用,但是实际中很少应用这种方法。因为我们通常需要Designer中产生的部件之间有互动,且和应用程序的其余代码良好集成。然而这种方法不利于扩展。
方法二:单继承法
这种方法要求我们从标准的窗口部件(例如QWidget或QDialog等)去继承得到一个子类。而在该子类中,包含一个私有的用户界面类对象。包含的方式又分为两种:
一是直接包含一个该类的对象来作为成员变量,例如:
#include "ui_calculatorform.h"
class CalculatorForm : public QWidget
{
Q_OBJECT
public:
CalculatorForm(QWidget *parent = 0);
...
private:
Ui::CalculatorForm ui; //直接包含一个该类的对象来作为成员变量
};
CalculatorForm::CalculatorForm(QWidget *parent) : QWidget(parent)
{
ui.setupUi(this);
}
二是包含一个指向该界面类对象的指针来作为成员变量,例如:
namespace Ui {
class CalculatorForm;
}
class CalculatorForm : public QWidget
...
virtual ~CalculatorForm();
...
private:
Ui::CalculatorForm *ui; //包含一个指向该界面类对象的指针来作为成员变量
...
由于头文件中只需用到指针,所以不需要完整的类定义,可以加快编译的速度。
对应的实现文件,应该像下面这样来做
#include "ui_calculatorform.h"
CalculatorForm::CalculatorForm(QWidget *parent) :
QWidget(parent),ui(new Ui::CalculatorForm)
{
ui->setupUi(this);
}
CalculatorForm::~CalculatorForm()
{
delete ui;
}
方法三:多继承法
同时从标准的窗口部件基类(如QWidget)和uic生成的.h文件中的用户界面类(如Ui::CalculatorForm)做多继承,得到一个子类。这种方法允许直接在子类中访问预先定义好的窗口部件,而不需要加ui之类的前缀。例如:
#include "ui_calculatorform.h"
class CalculatorForm : public QWidget,private Ui::CalculatorForm
{
Q_OBJECT
public:
CalculatorForm(QWidget *parent = 0);
private slots:
... //由于从Ui::CalculatorForm直接继承,所以可以直接用其中的窗口部件成员
};
这种方法因为用到了多继承而显得略为复杂,以前的Qt版本中常采用此法,现在Qt Creator默认的已不使用这种方法了。
文章选自华清远见嵌入式培训