QT元对象系统
Qt中的元对象系统是一个基于标准C的扩展,为Qt提供了信号与槽机制、实时类型信息、动态属性系统。元对象系统基于QObject类、Q_OBJECT宏、元对象编译器MOC实现。
QObject类
作为每一个需要利用元对象系统的类的基类.只有继承了QObject类才能使用元对象系统.
Q_OBJECT宏
定义在每个类的私有数据段,用来启用元对象功能,比喻动态属性,信号和槽.
元对象编译器(moc)
如果一个头文件包含Q_OBJECT宏定义,元对象编译器就会将该文件编译成C++源文件.该文件包括了Q_OBJECT的实现代码.新生成的文件名都会带有moc_前缀,表示是带有Q_OBJECT实现的源代码.
除了提供在对象间通讯的机制外,元对象系统还包含以下几种功能:
QObject::metaObject()方法,获得与一个类相关联的meta-object。
QMetaObject::className()方法,在运行期间返回一个对象的类名,不需要本地C++编译器的RTTI(run time type information)支持。
QObject::inherits()方法,用来判断一个对象的类是不是从一个特定的类继承而来。
QObject::tr()、QObject::trUtf8(),!!![为软件的国际化翻译字符串]!!!。
QObject::setProperty()、QObject::property(),根据属性名动态的设置和获取属性值。
QT内存管理
Qt内存管理机制:
Qt 在内部能够维护对象的层次结构。对于可视元素,这种层次结构就是子组件与父组件的关系;对于非可视元素,则是一个对象与另一个对象的从属关系。在 Qt 中,在 Qt 中,删除父对象会将其子对象一起删除.
QObject&parent 机制
使用元对象的类都是QObject的基类,QObject内部有一个表,会保存实际派生出的子类,还有一个指针保存parent,当(QObject类)自己析构时,会自己从parent列表中删除并析构所有的子类.
自动垃圾回收机制
Qt对象清理器是实现自动垃圾回收的很重要一部分.
(1)QObjectCleanupHandler.
QObjectCleanupHandler可以注册很多子对象,并在自己删除的时候自动删除所有子对象。同时,它也可以在程序运行时识别出是否有子对象被删除,从而将其从它的子对象列表中删除。这个类可以用于不在同一层次中的类的清理操作,例如,当触发关闭槽函数时关闭某窗口,某对象的析构.
(2) 计数器
(3) 记录所有者
QT信号与槽
信号与槽观察者模式的一种实现特性如下:
a.信号就是能被具体观察到的事件,或者说是事件发生后的通知信息.
b.槽函数是观察者
c.信号与槽的连接形成了一种 被观察者-观察者 的关系.
d.当事件发生或者状态改变,信号就会被发出;同时信号有义务去调用对该信号感兴趣的槽.
信号与槽是多对多的关系.信号是可以接力传递的.
#### 连接函数第五个参数
connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection)
Qt::ConnectionType type 枚举类型,默认是自动连接,用来确定连接类型.有唯一链接,堵塞连接,直接连接...
QT消息机制
最开始的Qt消息循环开始
QCoreApplication::exec()
。用户创建出一个QApplication,执行QCoreApplication::exec(),一个应用程序便开始了。QCoreApplication会不断从操作系统获取消息,并且分发给QObject。
如果没有消息循环,那么Qt的信号和槽无法完全使用,有些函数也无法正确执行。举个例子,通过 connect
连接的信号,当有信号发出时,其实是将一个事件压入了消息循环,如果没有QCoreApplication::exec(),那么这个消息循环将永远无法派发到指定的对象.
QT事件处理机制
Qt事件是一个QEvent对象,用于描述程序内部(如定时器超时)和外部发生的动作,任何QObject对象都具备事件处理能力。
事件处理流程:
用户操作 --> 系统内核感知 -(os消息/信号)-> Qt 应用程序 -(Qt 预定义的信号)-> 对应对象(事件发生在Qweiget/QMainWindow/...那对应的对象就是Qweiget/QMainWindow/...)的Event函数对该事件处理.
QT多线程
QT通过三种形式提供了对线程的支持,分别是平台无关的线程类、线程安全的事件投递、跨线程的信号-槽连接
QThread
QThread是Qt线程中有一个公共的抽象类,所有的线程类都是从QThread抽象类中派生的,需要实现QThread中的虚函数run(),通过start()函数来调用run函数。
void run()
线程体函数,用于定义函数功能.
void start()
线程体函数的启动函数.用于将线程入口地址指向为void run()
函数.
void terminate()
函数用于强制结束线程,不保证数据完整性和资源释放.
当线程启动和结束时,QThread会发送信号started()和finished(),可以使用isFinished()和isRunning()来查询线程的状态。
QThread实现多线程两种方式:
1 继承QThread类重写run().
2 创建一个QThread对象 用_thread->moveToThread(QObject obj); 将作业实例依附到线程中, 并启动线程 _thread->start();
Qtconcurrent::run([](){}); 实现多线程
Qtconcurrent::run([](){}); //C++11匿名函数、多线程. 配合QThreadpool 可做作业线程池.
QT网络编程
Qt网络模块为我们提供了编写TCP / IP客户端和服务器的类。 它提供了较低级别的类,例如代表低级网络概念的QTcpSocket,QTcpServer和QUdpSocket.
软件发布
Tip: windeployqt 虚拟盒子.
VS下的Qt
Tip: Qt for vs qmake .