转载自:点击打开链接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的过程中顺利、愉快,谢谢大家!

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

  1. Qt Designer设计 UI 文件并调用

    本文介绍的是Qt Designer设计 UI 文件并调用,在坛子里逛了一圈,关于UI方面的好像不怎多,本篇给大家分享一下. AD: 2013云计算架构师峰会超低价抢票中 Qt Designer设计 U ...

  2. qt creator 使用Ui文件的问题

    一.显式地调用uic.exe 如何将UI文件生成头文件 1,将设计的UI文件拷贝到uic.exe的目录下Qt\Qt5.3.2\5.3\mingw482_32\bin. 2, 打开windows的CMD ...

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

    制作ui文件 先应该用Qt Designer绘制一个自己的界面,并存为myform.ui(这里的myform可以用自己喜欢的名字代替).在制作自己的界面文件时要注意以下几个要点: 1.要记住ui文件的 ...

  4. Qt编程中,Ui文件如何被利用

    这两天跟着班级辅导,总有学生感到很疑惑,用ui designer设计出来的ui文件是如何使用的,下面我从一个例子来说明下,希望能对有这样疑惑的同学有帮助. 事实上,现在有了继承设计工具qtcreato ...

  5. QT笔记 -- (1) .ui文件

    刚开始写QT,designer用的不习惯,打开.ui文件看了一下,很容易读的xml文件,记录一下. 大体框架如下 <?xml version="1.0" encoding=& ...

  6. 利用Qt中的ui文件生成PyQt5程序,自定义槽函数

    1.在Qt Creator4.8.0上面设计如上.ui文件 2.点击上方图标,可以建立信号-槽连接,button_click()为自定义槽函数 3.设计目的:点击clear按钮,可消除上方文本框中的内 ...

  7. 关于Qt Designer程序/UI文件打开未响应的解决方法

    最近完成一个项目,到最后关头用QtCreator无法打开UI文件,每次都未响应,用QtDesigner也无法启动 这个问题把我折磨了半天,最后才知道原来是要删除C:\Users\Administrat ...

  8. Qt中在UI文件中新建控件并命名,但在代码中无法识别UI中的控件?

    代码中添加FilePathLineEdit控件,显示标准文件选择对话框显示选择的文件路径,但在槽函数中ui->FilePathLineEdit->setText("FilePat ...

  9. Qt中的ui文件转换为py文件

    将pyuic5 -o demo.py demo.ui写入ui-py.bat文件(自定义文件),将ui文件与ui-py.bat文件放在同一文件夹,双击.bat文件即可生成.py文件

随机推荐

  1. 2013第四届蓝桥杯决赛Java高职高专组题目以及解法答案

    2013第四届蓝桥杯决赛Java高职高专组题目以及解法答案 不知不觉离决赛都过去一个月了,一直忙于各种事情,都忘记整理一份试题.当作回忆也好. 1. 标题:好好学习 汤姆跟爷爷来中国旅游.一天,他帮助 ...

  2. android UI进阶之用【转】

    android UI进阶之用ViewPager实现欢迎引导页面 摘要: ViewPager需要android-support-v4.jar这个包的支持,来自google提供的一个附加包.大家搜下即可. ...

  3. uva 11137 Ingenuous Cubrency(完全背包)

    题目连接:11137 - Ingenuous Cubrency 题目大意:由21种规模的立方体(r 1~21),现在给出一个体积, 要求计算可以用多少种方式组成. 解题思路:完全背包, 和uva674 ...

  4. css3选择器的比较(三) -- 元素选择器 (+, ~)

    元素选择器中w3cschool中有些翻译不太准确 比如 +:其实是与element1元素同级,位于element1元素之后的第一个element2元素 ~:其实是与element1元素同级,位于ele ...

  5. Volley 设置 RetryPolicy 不起作用, 重复提交

    RT, Google后有的说是 将超时时间设置为0, 但是还是会重试提交, 解决方案如下: static HurlStack stack = new HurlStack(){ @Override pr ...

  6. .htaccess Rewrite apache重写和配置

    首先: 必须要空间支持 Rewrite 以及对站点目录中有 .htaccess 的文件解析,才有效. 如何让空间支持Rewrite 和 .htaccess 的文件解析呢 往下看 第一步:要找到apac ...

  7. [LeetCode]题解(python):095-Unique Binary Search Trees II

    题目来源: https://leetcode.com/problems/unique-binary-search-trees-ii/ 题意分析: 给一个整数,返回所有中序遍历是1到n的树. 题目思路: ...

  8. fork出的子进程和父进程的继承关系【转载】

    [原文地址]http://blog.163.com/dengjingniurou@126/blog/static/53989196200962924412524/ fork出的子进程和父进程的继承关系 ...

  9. cocos2dx ResolutionPolicy

    FrameSize 参数,在游戏运行时,我们可以通过 CCEGLView::sharedOpenGLView()->getFrameSize();如果在手机上运行,那么不同分辨率将会得到不同的值 ...

  10. 指针和引用区别 C++

    #include <iostream> using namespace std; int main(){ ; void cubeByPoint(int *);//指针传参声明 void c ...