java编写图形界面程序-Qt应用程序开发时如何进行图形用户界面的设计工作
进行Qt应用程序开发时,经常利用Qt Designer来进行图形用户界面的设计工作。利用它进行图形界面的设计工作有着直观、方面、易于后期维护的优点。在Qt Designer里面做的所有工作,终会保存为一个XML格式的ui文件,该文件保存了很多窗口部件、布局等的位置和状态信息。而当我们开发一个应用程序时面临的问题便是我们如何使用这个ui文件。对此Qt提供了一个用户界面编译器,该工具可以从这个XML格式的ui文件生成一个C++格式的.h头文件。命令的使用方法是
uic -o 输出文件名(.h文件) 源文件名(.ui文件)
习惯上生成的.h文件名为在源文件名的前面加上ui_前缀,例如源文件名为calculatorform.ui,则生成的.h文件名为ui_calculatorform.hjava编写图形界面程序,使用的命令如下:
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直接继承java编写图形界面程序,所以可以直接用其中的窗口部件成员
};
这种方法因为用到了多继承而显得略为复杂,以前的Qt版本中常采用此法,现在Qt Creator默认的已不使用这种方法了。
嵌入式物联网需要学的东西真的非常多,千万不要学错了路线和内容,导致工资要不上去!