加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何使用Qt Designer生成的ui文件

发布时间:2020-12-16 02:12:44 所属栏目:百科 来源:网络整理
导读:作者:华清远见 进行Qt应用程序开发时,经常利用Qt Designer来进行图形用户界面的设计工作。利用它进行图形界面的设计工作有着直观、方面、易于后期维护的优点。在Qt Designer里面做的所有工作,最终会保存为一个XML格式的ui文件,该文件保存了很多窗口部件

作者:华清远见

进行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;

}

这种方法是目前Qt官方推荐的主要方法。

方法三:多继承法

同时从标准的窗口部件基类(如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默认的已不使用这种方法了。

文章选自华清远见嵌入式培训

>>>更多优秀技术博文每日更新

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读