是对QT的分析,不仅局限于QT。
二者区别
天下文章一大抄,技术也一样。MFC是对Windows系统API进行的封装,是以视类与文档类为核心的框架设计。微软20年前就已经把MVC玩的很6了,还有控件、动态库等等技术都是微软爸爸先搞出来的。若单单用QT开发Windows程序的话因为最后也是调的系统API,可能性能还不如MFC高。
然而,QT的强大之处在于其跨平台的支持,把Windows、Linux、Mac等的系统都给封装到QT的API,程序员只需要掌握了QT的API,开发一次就实现了三种平台的开发。加上QT又是开源的,自然就把MFC的市场强走了。
因为跨平台的支持大多都是通过宏定义的方式进行分类处理的,所以最后对性能的影响相比维护上的便利实际上是可忽略的。
不要重复造轮子
这句话是开源的“精神”所在,QT早先也是闭源的,后来才开源的,其实开源也是没办法的事,微软在全球形成的程序员具有很强的粘性,从开发工具到开发环境。如果没有点诚意确实抢不动市场。“开源+免费”先开拓市场,让用户多起来,让bug都暴露出来,用户数量上去了,金主爸爸自然就来了。
对于中小企业来说,对性能没有极致的追求,使用QT确实节省了很多的人力成本。加上18年开始的国产潮,源码开源或可控已经成了架构方案的核心要求之一。系统我们暂时搞不出来了,那就支持开源的Linux吧,14亿人口的大国导向,让QT站上了快车道。
意识到危机的微软开始发力跨平台,很早就传出开源且跨平台的.Net 开发的客户端程序也要支持Linux。但时至今日也没啥动静。要么是这块的市场微软看不上,要么就是想要通过不支持Linux来稳住用户群体,微软把Linux也支持的太好了,用户直接不装Windows了,岂不是搬起石头砸自己的脚?毕竟Linux的消费级用户体验还是比较差的,很不稳定。
QT的创新点
1.元对象系统
我的前东家之前搞了个什么元语言,现在看来是抄的QT了😏。元对象是QT独有特新的基石,那么如何理解呢?比如你要为你的汽油车增加电动特性,使自己的爱车支持混动,如何办?
自然需要增加电池和电动机。元对象是新特性,元对象编译器是为了支持新特性加装的电池和电动机。那么元对象有啥特性
呢?
a.对象间通信 这个特性是QT专属。C++、OOA很强大,有对象的概念,但是没有考虑到对象和对象间是要通信📞的啊。QT是通过信号与槽实现的,后面会说到。
b.运行时类型信息 c++有种机制叫做RTTI
(Run-Time Type Identification,运行时类型识别),它使程序能够获取由基指针或引用所指向的对象的实际派生类型。然鹅仅限于获取类型名字和类型id,而QT可以获取类型的更详尽的信息😃。例如:可以判断对象的父类。
c.动态属性系统 我们知道类里面可以定义一个变量存储该类的属性,例如动物类中存在一个int类存储动物年龄。QT框架需要知道类的属性进行从而对一些特性进行支持。下面是属性定义与使用的简单代码:
//1.定义 isMainWnd属性
class MainWindow : public QMainWindow
{
Q_OBJECT
Q_PROPERTY(bool isMainWnd READ isMainWnd )
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
bool isMainWnd(){
return true;
}
}
private:
Ui::MainWindow *ui;
};
//2.使用属性
MainWindow w;
auto c = w.property("isMainWnd");
2.信号与槽
信号与槽是以元对象系统中实现对象间通信的技术为基础进行的扩展。大多数用到信号与槽的地方都是异步业务了,对于异步我们更为熟悉的是函数回调的方式,例如:定时器回调、异步IO回调等。信号与槽可以参考下面两张图进行理解。
作为一名居安思危的程序员,如何学习?
业务实现可以用QT,但是一定不能强依赖QT,一定要掌握C++这么语言的知识。一旦QT走坏(限制使用、收费、版权、大国封锁等导致QT冷门),只要我们对C++这门语言掌握到位就不怕!