如何使用Qt Designer生成的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默认的已不使用这种方法了。 文章选自华清远见嵌入式培训 >>>更多优秀技术博文每日更新 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |