Qt探秘——谈ui文件的用法

转载自:点击打开链接http://blog.csdn.net/luo_isaiah/article/details/5794973

相信用过Qt Designer的朋友,对Qt Project中的.ui文件并不陌生。这个文件在Qt Designer中并不能直接修改其源代码,而只能通过Qt Designer的图形工具对其进行操作。对于这一点,我不得不要赞一下设计Qt Designer的人,因为这大大可以避免.ui文件中出现语法错误的概率,同时使得程序员能省下大量的程序界面设计时间进而缩短整个程序项目的开发。

从另一方面,我之所以想要谈谈这个.ui文件,是因为这个文件的使用方法不同于当今许多移动开发平台的类似文件的使用方法。从这一点上,我认为是一个相当好的创新。

我相信大家都知道,每个Qt Project都是纯C++的,而如果我们用普通的文档编辑器打开.ui文件时,我们会发现.ui文件其实是个自定义标签的XML文件,那么这个文件对于整个Qt Project来说,怎么发挥它的作用呢?难道说Qt的C++编译器能把它直接转换成C++语言,然后进行编译吗?带着这个问题,我进行了探索,发现却是另一种结果。

我们可以先用Qt Creator创建一个带有ui文件的GUI Project,创建过程中Qt Creator会让我们选择这个窗口类是基于QMainWindow、QWidget还是QDialog。我们随便选一个,在这我选的是QMainWindow。然后,我们可以得到5个文件,一个.pro文件,一个.ui文件,一个.h文件,两个.cpp文件,其中一个是main.cpp,其包含着Qt程序的入口函数main。

而这时,如果我们打开.h文件的话,我们会看到如下一段声明:

namespace Ui {

           class MainWindow;
    }
      这的意思是说,在命名空间Ui里面有一个类叫MainWindow,可是这个类的描述在哪呢,不清楚,但肯定不在当前这个.h文件中。但是我们可以在后面的类描述中发现,其中会有一个Ui::MainWindow的私有指针,既然是这样,估计在对应的.cpp文件中,应该能找到出现这个Ui::MainWindow的描述的.h文件,不出所料,在对应的.cpp中,就发现了这个文件:
      #include "ui_mainwindow.h"
      但是,如果这时你还没有build过的话,你会发现这个文件是找不到的,那么我们就来build一下这个Project吧。结果一build之后,我们就能看到这个文件了。打开后,我们会看到Ui::MainWindow的描述:
     namespace Ui {
            class MainWindow: public Ui_MainWindow {};
     } // namespace Ui
      这就是这个类的描述,简短而精悍,而在它的上面就是Ui_MainWindow类的描述了,而这个Ui_MainWindow正是按着.ui文件的设计通过uic工具生成的。那么这个类该怎么用呢?
      我们知道在Qt Project中,窗口类的实现有三种途径,要么继承QMainWindow,或是继承QWidget,再或是继承QDialog。而对于类似于Ui::MainWindow类的使用则有两种方法:
      第一种方法:假设我们的真正的窗口类叫MainWindow,它继承于QMainWindow,那么它可以有一个Ui::MainWindow的私有成员,并在MainWindow的构造函数中,实例化这个私有的Ui::MainWindow,之后调用这个私有的Ui::MainWindow的setupUi方法,设置MainWindow的用户界面接口,即按.ui文件的设计初始化MainWindow的界面。这样,一个按照.ui文件设计的界面的窗口就建立起来了。
      第二种方法:仍然假设我们的真正的窗口类叫MainWindow,它仍然要选择QMainWindow,QWidget,QDialog中的一个类进行继承。而与前一种方法不同的是,这个MainWindow类不需要一个Ui::MainWindow类的私有成员,而是使用了C++中的多重继承,让MainWindow同时继承Ui::MainWindow。而这时只需在要使用MainWindow的时候实例化它,在它的构造函数中调用setupUi方法,即可。
      这两种方法,在正常情况下,虽然就最后窗口的显示效果来说没有什么区别,但在内存的管理机制上,却有不同。从内存管理的安全性方面来说,用惯了Symbian的我更倾向于使用后一种方法。因为第一种方法中先实例化Ui::MainWindow后,无法保证在接下来的构造函数中,有可能因为内存不足而引发构造函数异常退出,进而导致Ui::MainWindow成为内存泄漏。虽然说Qt有自己的内存垃圾站的处理机制来解决内存泄漏问题,但是就个人感觉而言,这种机制的效率终究赶不上人为释放内存的效率。
      另外还想说的一点,就是虽然现在很多移动开发平台都在使用类似.ui文件的XML格式的文件作为窗口的界面设计使用,但存在两点问题,第一,有很多平台需要程序员直接去写这个XML格式的文件,而没有类似Qt Designer的工具,这使得程序员写的很头痛,并且因此而流失了许多开发时间;第二,很少有平台想Qt这样先把这个XML格式的.ui文件转化为C++文件再进行编译的,很多都是直接丢给操作系统,在运行程序时才去解析,得到相应数据后才能产生出相应的程序界面,这无疑又降低了程序的运行效率。
      此上就是个人在研究Qt开发过程中的一些心得体会,在此分享给大家。有不足的地方还希望大家多提建议,祝大家在开发Qt Project的过程中顺利、愉快,谢谢大家!
时间: 2024-10-27 07:51:06

Qt探秘——谈ui文件的用法的相关文章

Qt入门学习——Qt Creator 中 ui 文件和 Qt 代码关系

通过<Qt Creator的使用>的学习,我们可以借助 Designer(界面设计器)快速设计界面. 此例子 ui 内容如下(只是简单添加了一个按钮): 工程的代码目录结构如下: 最终在工程所在目录会生成一个 ui 文件: 此 ui 文件实际上是xml 文件: 当我们编译 Qt 程序代码,Qt Creator 用 uic 工具把 ui 文件的内容转换成 C++ 代码,在工程目录同一级目录的 build- 目录下自动生成 ui_类名.h 文件,如本例子中的 ui_mywidget.h,是由 my

qt creator 使用Ui文件的问题

一.显式地调用uic.exe 如何将UI文件生成头文件 1,将设计的UI文件拷贝到uic.exe的目录下Qt\Qt5.3.2\5.3\mingw482_32\bin. 2, 打开windows的CMD,进入到UIC的目录下:cd C:\Qt\Qt5.3.2\5.3\mingw482_32\bin 3,  执行如下命令:uic mainwindow.ui -o mainwindow.h   就会再uic的目录下生成mainwindow.h uic命令参数的意思如下: 二.qt creator 建立

Qt 手动添加ui文件到工程(转)

制作ui文件 先应该用Qt Designer绘制一个自己的界面,并存为myform.ui(这里的myform可以用自己喜欢的名字代替).在制作自己的界面文件时要注意以下几个要点: 1.要记住ui文件的名字,因为uic生成的代码会存在ui_myform.h里:2.要记住主窗体的object name, 因为ui文件提供的类名将以这个form的名字来命,例如主窗体名字为MainWindow,则ui文件提供的类名会命名为Ui_MainWindow:3.要特别注意你的form选择的基类要和你代码中的窗体

QT多个UI文件加入一个项目

这样可在多个UI界面上进行分部开发.避免都在一个UI下太凌乱…… 在网上找了一些资料,很少有介绍这方面的,以及类似这样项目的源码. 看 一些基本控件的使用时,想到了一种方法:使用gridLayout控件 先建立几个Frame类型的UI设计界面类: [cpp] view plain copy CardFrame cardUI; DoorFrame doorUI; ReaderFrame readerUI; ui->gridLayout->addWidget(&cardUI); ui-&g

Qt之UI文件设计和运行机制

1.项目文件组成在QtCreator中新建一个WidgetApplocation项目,选中窗口基类中选中QWidget作为窗口基类,并选中"GnerateForm"复选框.创建后项目文件目录树如图: 项目组织文件pro:存储项目设置的文件主程序入口文件main.cpp,实现main函数的程序文件窗体界面文件widget.ui:一个XML格式存储的窗体上的文件以及其布局的文件widget.h是所设计的窗口类的头文件,widget.cpp是widget.h里定义类的实现文件.在C++里面,

QT模态对话框用法(在UI文件中设置Widget背景图,这个图是一个带阴影边框的图片——酷)

QT弹出模态对话框做法: 1.新建UI文件时,一定要选择基类是QDialog的,我的选择是:Dialog without Buttons(),如下图: 2.然后在使用的时候: MyDialog dlg(this); dlg.exec(); 如果不加this,则会在任务管理器里面产生一个新的EXE. 3.如果对话框的标题是自定义,不想使用系统的标题,这时候需要在代码中加入: setWindowFlags(Qt::Dialog | Qt::FramelessWindowHint ); setAttr

使用 PySide2 开发 Maya 插件系列一:QT Designer 设计GUI, pyside-uic 把 .ui 文件转为 .py 文件

使用 PySide2 开发 Maya 插件系列一:QT Designer 设计GUI, pyside-uic 把 .ui 文件转为 .py 文件 前期准备: 安装 python:https://www.python.org/downloads/ 安装 PySide2:安装 python 后,在安装目录下有 /script 文件夹,里面有 pip.exe ,cmd执行:pip install PySide,pip install PySide2(注意: python2.x 对应 PySide,py

[转]Qt中ui文件的使用

用designer设计的*.ui文件可以通过uic工具转换为*.h文件(在编译时也会自动生成这样一个ui_*.h文件),有了这个.h文件就可以直接按照纯C++的方式对其中的类进行调用.ui文件的使用就是利用默认工具uic自动产生一个类,然后用该类的setui函数加载界面到相应的对象上.       .ui文件的使用有三种形式:第一种是直接使用,第二种是定义一个新类,声明一个ui子对象,利用该对象来加载界面,第三种是将ui作为基类派生新的类. 借用一个例程分析如下: 工程及界面          

在Qt中如何使用QtDesigner创建的UI文件(一) (转)

使用Qt有一些时间了,一直在IDE环境(qtcreator和VS2003+集成器)中使用,自然少了很多麻烦的步骤.但是在享受这种便利的同时,我们也失去了理解更多知识背后的点滴.在IDE中,如果我们要开发一个对话框,通常是使用 "新建->Qt->Qt设计师界面类" 这样IDE会自动的帮我们生成三个文件(filename.ui, filename.h,filename.cpp).qmake也非常智能,可以自动检测到这个用户界面文件(filename.ui)并且生产适当的make