Qt UI文件的实现原理很简单。但是,如果做过C#或者Android的经验,会觉得Qt的实现方式还是更加复杂一些的。Java/C#中实现这种功能的时候,并不需要转换为代码。而是由代码直接读取ui文件的文本,由文本内的信息直接构建ui对象。为什么Java/C# 可以做到,C++不行,这是为什么呢?原因很简单,因为C++没有“反射”这个语言特性。如果没有反射,就不能简单的实现从字符串构造对象。那么就没有办法不修改代码、只修改ui文件而实现修改程序ui的目的。
在Qt中,每个UI文件就是一个工具类。针对它绑定的一个Widget实现类,初始化ui并绘制。所以,qt designer的作用,就是把构造UI,记录到文本(ui文件),通过一种工具(uic)转换为工具类的C++ 代码,也就是一个ui_前缀的头文件,这个文件的内容非常简单啊。只有两个接口:setupUI、retranslateUi。通过setupUI(QWidget* w) 接口来访问真正的QT view 对象 MySomeTypeWidget w,通过retranslateUi来实现多语言翻译。建议这里的w 使用字符串MySomeTypeWidget与Widget class同名这种规范。绘制一个widget,我们需要写的代码就是如下三个文件。
MySomeTypeWidget.h
MySomeTypeWidget.cpp
MySomeTypeWidget.ui
在C++中,我们包含 ui_MySomeTypeWidget.h。直接使用 MySomeTypeWidgetImpl 对象来辅助绘制widget。C++文件中,就没有widget 绘制的代码了。对于多