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

 相信用过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-08-03 13:46:52

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

visual studio 2010-打不开VS2010中qt设计的.ui文件,但是程序运行时界面正常。是什么原因呢?

问题描述 打不开VS2010中qt设计的.ui文件,但是程序运行时界面正常.是什么原因呢? 解决方案 重启启动下,再编译看看,你有没有人为修改过里面的东西,再不行重新删除了创建一次.设计器对代码的格式等都有限制,你的代码是合法的,人工写的可能还是造成设计器不识别. 解决方案二: 在VS上开发过Qt程序,在VS上安装Qt插件,就可以打开了 解决方案三: 是不是因为 QT 的版本,或者 VS的版本不匹配.

国际化-QT工程中如何多个UI文件使用一个.qrc文件

问题描述 QT工程中如何多个UI文件使用一个.qrc文件 10C VS2010 创建了一个QT项目,在其中又添加了一个UI,想让两个UI同时使用工程中的同一个.qrc文件进行国际化配置(ts文件翻译),请大神赐教!!!在线等,,急!! 解决方案 1.在qt designer中打开新添加的ui:2.在qt designer的资源浏览器中点击"编辑资源":3.在出现的编辑资源对话框上点击"打开资源文件"按钮,选择qrc文件即可. 解决方案二: Qt .qrc文件qt中的

qt设计器中ui文件打开

问题描述 qt设计器中ui文件打开 在ubuntu中点击打开ui文件不出现qt设计器选项,但是qt设计器已经安装了,只是安装在home目录下,是不是因为没有安装再根目录下没有相关链接的原因,怎么建立连接才能打开ui文件直接连接用qt设计器打开? 解决方案 windows 下这叫文件关联,Ubuntu 也可以设置link text

浅谈php命令行用法

 这篇文章主要介绍了浅谈php命令行用法的相关资料,需要的朋友可以参考下     Php是一个非常流行的web服务端脚本语言.其实,php不仅仅可以在web服务器中充当重要角色.在命令行一样可以执行. 本文中,笔者为各位介绍下php在命令行中的使用方法. 1. 查看php的版本.配置 在命令行中输入php –v 即可查看当前php的版本. 其他的选项有: –m.-i.笔者在这里就不给出列子了. -m 会显示当前php加载的有效模块. -i 则输出无html格式的phpinfo. 使用 –ini

总结Linux中压缩文件和解压文件的用法

总结Linux中压缩文件和解压文件的用法,压缩文件和解压文件是在Linux中最常见的一种操作,熟悉和掌握这部分的技能也是必须的,一般我们常用的命令有:tar.unzip.bunzip2等等,如何正确的使用也是需要掌握的一个知识重点,下面我们分两个部分来对压缩文件和解压文件进行说明. a.解压小全 tar -I或者bunzip2命令都可以解压.bz2文件tar xvfj example.tar.bz2tar xvfz example.tar.gztar xvfz example.tgztar xv

linux t 编译库so-linux下Qt编译库so文件

问题描述 linux下Qt编译库so文件 qt在linux编译后会产生四个so文件,so.so.1.so.1.0.so.1.0.0, 调用这个库时好像找的是so.1这个库. 问题1:如何让调用者找的是so这个库,然后再连接其他到实体库. 问题2:如何编译后只生成一个库文件,只要so.1.0.0. 谢谢!!! 解决方案 ? ? ? ? ? ? ?这里我的Qt是安装在默认的路径/opt下.使用的系统是OpenSuSE12.3 64位,Qt的版本是5.3.1.这里安装Qt时,必须勾选源码也安装上.因为

qt-如何使用QT编写一个bat文件,并执行它!!!

问题描述 如何使用QT编写一个bat文件,并执行它!!! 桌面上有bat文件,打开它就能运行出想要的结果. 但是在qt中怎么实现呀!!跪求大神指导.. 解决方案 参考:http://blog.csdn.net/zww0815/article/details/7944231http://blog.csdn.net/akof1314/article/details/5472359 解决方案二: QT只是一个跨平台的开发工具. 如果实现,就要看运行的系统.如果还是 Window 系统,可以考虑直接调用

Qt中的qrc文件

Qt中的qrc文件是一个xml格式的资源配置文件,与应用程序关联的应用程序由 .qrc 文件来指定,它用XML记录硬盘上的文件和对应的随意指定的资源名称,应用程序通过资源名称来访问资源.        指定的路径是 .qrc 文件所在目录的相对路径.注意,列出的资源文件必须位于 .qrc 文件所在目录或者其子目录下. 图标文件需要与qrc文件位于同一目录下或者在该目录的子目录中.另外,如果qrc文件中使用了前缀(例如<qresource prefix="/myresources"

.NET中的IO操作之文件流用法分析_实用技巧

本文实例讲述了.NET中的IO操作之文件流用法.分享给大家供大家参考.具体分析如下: 读操作 复制代码 代码如下: //1.创建文件流 FileStream fsRead =new FileStream("1.txt",FileMode.Open); //2.创建缓冲区,正常情况下,是不会直接等于文件大小的.这里只有读,所以就这么干了. byte[] bytes =new byte[fsRead.Length]; //3.开始读取, 返回值是读取到的长度. int r =fsRead.