参考:
qt学习指南
Qt5和Qt6的区别-优快云博客
Qt 学习之路_w3cschool
Qt教程,Qt5编程入门教程(非常详细)
本地环境:
win10专业版,64位
技术选择
Qt5力推QML界面编程。QML类似HTML,可以借助CSS进行美化,借助JavaScript进行交互。不同平台下的QML有相同的渲染机制,界面效果一致。不过大部分时候还是要使用C++
Qt6主推QML,但是似乎有坑,不要碰。(知乎一些答案说的)
Qt5支持win7,5.12是LTS(长期支持),因此综合考虑使用Qt5.12(项目需要)
基础知识
观察者模式
Observer Pattern,也称为发布订阅模式。就是对象之间是一对多,当一个对象改变状态时,所有依赖于它的对象都会得到通知(信号)并自动更新。
- subject:被观察者,包含观察者列表(所有被观察的)、添加、删除和通知观察者的方法
- observer:观察者,包含接受消息并更新的方法
- ConcreteSubject:具体的被观察者,可以包含自己的业务逻辑,同时定义对哪些事件进行通知
- ConcreteObserver:具体的观察者,可以包含自己的业务逻辑,同时对应接受消息猴的处理逻辑
不过观察者有时候也可以是被观察者。
信号槽
信号槽可以将程序中的各个对象进行解耦
当某个事件发生后,sender会发出一个signal,这是一种广播,如果有receiver对这个信号感兴趣,它就会通过connect(连接函数),用自己的一个slot(槽函数)来处理这个信号。slot是自动调用的。
connect(sender, signal, receiver, slot);
// slot是接收到信号之后需要调用的函数
原生信号槽:Qt为每一个Object都预先写好了一些信号和槽函数
也可以自定义信号槽,需要:
- sender和receiver需要继承QObject,同时在类定义第一行写上Q_OBJECT
- sender要写信号函数
- 放在 signals: 标记下
- 是返回值void的函数,不需要实现(因为只表示一个信号)
- receiver要写槽函数,
- 放在 public slots: 标记下(当然可以换private protected)
- 是普通成员函数
- MainWindow要继承QMainWindow,同时在类声明第一行写上Q_OBJECT,并且写好对象的指针,再声明一个函数,用来发起信号(触发一个状态,比如 emit xx- >say() )
- MainWindow的实现中要创建sender和receiver对象,然后用connect函数连接,最后触发