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文件的话,咱们会看到以下一段声明:ui

      namespace Ui {spa

           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的过程当中顺利、愉快,谢谢你们!
相关文章
相关标签/搜索