QT IOC容器-前言

原创
07/29 11:38
阅读数 66

前言的前言

    说实话,写这系列文章心里还是比较忐忑的。自认为自身的技术水平并不算高,我写的这几个开源库中的技术细节和面向对象的设计理念都是自己撸了这么久的代码和查阅别人开源库所参悟出来的,所有东西都是自己的理解,也不知道对不对。大家将看且看,如果有幸能得到部分人的认同,我可能会开心好久。同样的,如果有人能指导一二,我也非常感谢,毕竟又学到了新东西不是吗。


这回是正文

    好的废话不多说,开始进入正题。这篇文章主要是一个序言,陈列出我现有的一些成果和创作历程(抄袭历程)。
    我的所有项目都是开源的,在githubgitee上都有上传,大部分功能的用法都写在README里面,其他的从测试代码中也能看出用法。
    有一点注意一下,现在还在用的仓库只有McIocBoot、McLogQt(后续合并进McIocBoot)和McAudioPlayer,也就是说McIocContainer项目其实是在McIocBoot仓库中,与它同名的仓库是第一版,现已不使用。

已完成项目

  1. McIocContainer(在McIocBoot仓库中,我所有项目的核心库)
  2. McIocBoot(在McIocBoot仓库中,依赖McIocContainer声明式注入所封装的QML到C++的交互方式)
  3. McLogQt(在McLogQt仓库中,依赖McIocContainer的XML配置文件注入所实现的日志库)
  4. McAudioPlayer(在McAudioPlayer仓库中,依赖上面的三个项目,主要是将上面三个项目完全用到实际开发)

McIocContainer开发史

    我是从大三开始入坑的QT,主要目的有两个:第一是做一些自己可用的工具;第二是想学一个自己感兴趣的方向并且还能找工作。所以从java swing转到QT,因为当初不想做网站,所以没有学javaee,至于为什么不是从一开始就学的C++,其实我内心是有点抵触C++的,因为C语言太让人头疼。
    2018年12月份的时候我大四实习,也是成功找到一个QT方向的工作,虽然工资不咋滴。但是这个时候我了解到QT方向的工作其实并不好找,使用QT的公司也很少,而刚好我一个同学只在大三学了大半年java就能找到不错的工作,而且至少从招聘网站上java的工作需求非常多,所以那个时候又开始学javaee。搭了几天的SSH和SSM,好不容易跑通了一个demo,我那个同学告诉我学Spring Boot就可以了,虽然SSM还有公司在用,但是SpringBoot肯定会是主流的。好嘛,又开始转战SpringBoot,这东西确实比SSM要简单得多,至少很容易就能跑通一个demo。
    经过几个月的不懈努力(其实也就只有周末和晚上才有空,而且还要腾出时间玩游戏),终于完成了一个简易的博客网站(自认为的),然后开开心心的在19年4月份开始找java工作。结果就是投了两周的简历,面试倒是面试了好几家,但是一点水花都溅不起来,接着就是无限的绝望,然后反思。突然有一天我想通了,因为我在这个网站的角色是全栈开发,前端也是我做的,而且我在前端花的时间比后端要多得多,也就是说我这几个月其实更多的跑去学前端去了,而java只学了个寂寞,所以我又放弃了,继续回来搞QT。
    当时用SpringBoot的时候其实感触是非常多的,虽然我很早就知道了反射的存在,但是那个时候才体会到反射的好处,我之前不知道在哪儿看到的一句话:反射是设计的灵魂,也在这体验到了。但是突然我灵光一闪,QT不是也实现了反射的功能吗?那我岂不是

    这个时候其实我非常天真的认为QT的反射也有java的反射那么强大,什么都能干的那种,中途还跑到四川图书馆找了本SpringBoot原理的书去看,想去抄它里面IOC容器的实现。结果在我实现功能的时候,各种不支持,而且QT动态写入属性是依赖QVariant类的,那个时候对这个类又不怎么熟,就只能一点点的堆,所以第一版的时候很多东西都没考虑到,因为我都不确定最后能不能实现,中途好几次都想要放弃。
    功夫不负有心人,最后还是实现了,但是这个时候容器里面保存的是QObject*类型,这是存在内存泄漏的,因为这个对象不知道会不会被复用,所以也就无法销毁。所以才改成了现在这种动态指针的形式。

McLogQt的开发史

    当完成第一版IOC容器的时候,我重构了我的音乐播放器McAudioPlayer,从之前的QWidget改为QML,并将IOC容器引入了进去。其实重构之前就想到需要一个日志库,在这之前其实我都不怎么重视日志这个东西,直到我在实习的时候遇到了一个坑。
    当时实习的那家公司规范里面有说要使用日志,要求的是用google的glog,但并没有人用,所以我也就没用。但当时我接手的那个程序在外面使用的时候出了一个bug,一直找不到原因,我编译glog又老是不过,我就只是简单的撸了两个函数来调试那一个功能,也就是从这个时候开始想要定一个日志库来使用。glog肯定不想用了,编译都这么麻烦。然后我搜来搜去找到了log4qt,因为我用过log4j,对这个库还是比较熟悉的,但是他的配置文件也太恼火了,我复制log4j的配置文件过来好像用不了,这特么就非常尴尬,这个时候我就下定决心要自己撸一个完全依附在QT上的,基于QDebug的日志库,因为这样可以降低这个日志库的存在,比如我加入几行代码就能将日志库引入进去,去掉几行代码又能将日志库去掉并且不影响程序运行。
    在我重构完音乐播放器之后就开发的这个日志库,但那个时候是硬撸的,代码非常烂,完全没有可扩展性,但勉强还能用一用,也就将就着用了一段时间。毕业之后工作的那个公司的所有框架都是在arm linux上跑的,pc端并没有怎么重视,所以我也就把自己的一些库拿去用了。这个日志库用了一段时间之后实在是受不了了,刚好IOC容器也重构完了,所以又去参照log4j配置文件的格式,推导出它大致的代码结构,依赖IOC容器完成了现在的这一版。

McIocBoot开发史

    开发这个库的原因是因为当时重构音乐播放器遇到了很多难题。首先第一点就是QML和C++的交互问题,无论是通过qmlRegisterType注册还是往rootContext注入属性都需要每次都去调用一次,而且还要找个地方专门去调用;第二点就是GUI线程卡顿问题,响应界面操作的线程是主线程,那么调用C++的业务层函数的时候也是在主线程,那么一些耗时操作只能自己再想办法开线程去做,而且最关键的一点是用户点击了某一个按钮的时候我们界面可能会立即给出响应的,比如转圈圈或者其他提示。所以基于这些原因,又想了一下B/S架构中网页和服务器的交互方式开发出的这个库。


其他

    这一系列的文章主要会介绍这几个库的用法,同时理一下相关核心技术的的实现原理,深入讨论一下QT的元对象系统和QVariant这两个关键技术,最后会给出我现在整理出的QT/C++编程规范,目前暂定按下面的顺序:

  1. QT IOC容器-前言
  2. QT IOC容器-使用教程
  3. QT IOC容器-元对象系统
  4. QT IOC容器-QVariant
  5. QT IOC容器-McLogQt
  6. QT IOC容器-McBoot
  7. QT IOC容器-McAudioPlayer
  8. QT/C++编程规范
展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部