Qt Designer UI 中的设计模式

    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 绘制的代码了。对于多数的静态页面,这种方式已经能够满足需求了。对于需要动态构建UI对象的情形,我们也只需要在ui文件中绘制好widget区域和layout,我们直接控制layout对象就可以了。
    这里使用到的设计模式是桥接设计模式,算的上比较复杂的一种设计模式了。而且,对于桥接的定义,一般对于 Implementor 成员,多数时候只有一个。但是,一些时候,我们可能会使用两个。例如Qt view层编码,纯粹的widget绘制使用 ui文件这个 Implementor,对于widget上需要使用到的一些算法,那么就需要另外一个 Implementor。只是,这里的Implementor 稍微简单一些,并不需要接口,UI文件对应的都是具体的class。
    对于该ui对象的使用,也可以使用ui对象作为成员,也可以使用指针。这里推荐使用指针方式。使用指针方式实现的桥接设计模式,能够显著的改善C++ 编译耗时问题。如果使用ui对象作为成员,那么就要求在头文件中增加ui头文件依赖,将会导致编译时间大大增加。在接口实现上,也要求使用指针方式的桥接设计模式。桥接模式的分析,在另一篇文章中介绍。
    我这两年的工作中,指导了几个新来的同事或者实习生学习Qt。观察到一些现象,刚学习Qt的时候,可能会觉得Qt有点难,搞不清楚Qt的概念和工作原理。比如说Qt 自带了moc、uic、qrc工具编译器,这些东西是怎么在工程中起作用的?这说明我们的工作上,缺少一个Qt培训的步骤。这些工程上的原理,其实是非常简单的。只需要几次的培训课程,就能够完全覆盖了。我需要针对这个工作做一个完整的课程。

 

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值