赞
踩
优点:
缺点: Qt 作为一个软件平台,比较庞大、臃肿。
元对象系统
Qt的元对象系统(meta-object)提供了用于内部对象通讯的信号与槽(signals & slots)机制,运行时类型信息,以及动态属性系统(dynamic property system)。
整个元对象系统基于三个东西建立:
moc工具读取c++源文件。如果它找到一个或多个包含Q_OBJECT宏的类声明,它会生成另一个c++源文件,其中包含每个类的元对象代码。生成的源文件要么#include到类的源文件中,要么(更常见的情况)编译并链接到类的实现。
属性系统
如同很多编译器厂商提供的编译器一样,Qt也提供了一个精妙的属性系统。然而,作为一个独立于编译器和架构的库,Qt不依赖于诸如__property或[property]这样的非标准的编译器特性。Qt的这套属性系统特性可以用于任何Qt支持的编译器与架构。它基于元对象系统(Meta-Object System),这套系统同时也提供信号与槽机制用于对象间通讯。
以下摘录简要说明了属性与成员变量的区别:
- 成员变量是一个“内”概念,反映的是类的结构构成。属性是一个“外”概念,反映的是类的逻辑意义。
- 成员变量没有读写权限控制,而属性可以指定为只读或只写,或可读可写。
- 成员变量不对读出作任何后处理,不对写入作任何预处理,而属性则可以。
- public成员变量可以视为一个可读可写、没有任何预处理或后处理的属性。 而private成员变量由于外部不可见,与属性“外”的特性不相符,所以不能视为属性。
- 虽然大多数情况下,属性会由某个或某些成员变量来表示,但属性与成员变量没有必然的对应关系, 比如与非门的 output 属性,就没有一个所谓的 $output 成员变量与之对应。
属性 与成员变量的 区别与联系 及属性修饰词理解
信号与槽
信号与槽用于对象之间的通讯。信号与槽机制是Qt的核心特性,也是与其他框架最大的不同之处。Qt的元对象系统使得信号与槽机制得以实现。
在Qt中,使用了信号与槽机制代替了回调机制。信号将会在特定的事件出现时被发出。Qt的控件预定义了很多信号,当然我们也可以继承这些控件以定义自己的子类,然后添加自己的信号。槽是在响应特定信号时会被调用的方法。Qt的控件存在很多预定义的槽,但通常的做法是继承控件以生成自己的子类,然后添加自己的槽,这样我们就可以自行处理感兴趣的信号。
详见:
QT核心机制1:元系统
QT核心机制2:属性系统
QT核心机制3:信号与槽
信号与槽的具体流程。
优点:类型安全,松散耦合。缺点:同回调函数相比,运行速度较慢。
优点:
缺点:
回调函数。信号或是传递值,或是传递动作变化;槽函数响应信号或是接收值,或者根据动作变化来做出对应操作。
参考: 信号槽机制与回调函数的区别
注意点:
Qt提供了一种机制,能够自动、有效的组织和管理继承自QObject的Qt对象,这种机制就是对象树。
Qt库中的很多类都以QObject作为它们的基类。QObject的对象总是以树状结构组织自己。当我们创建一个QObject对象时,可以指定其父对象(也被称为父控件),新创建的对象将被加入到父对象的子对象(也被称为子控件)列表中。当父对象被析构时,这个列表中的所有子对象会被析构。不但如此,当某个QObject对象被析构时,它会将自己从父对象的列表中删除,以避免父对象被析构时,再次析构自己。
详见: Qt编程中new出来的控件为什么没有delete
信号与槽机制是比较灵活的,但有些局限性我们必须了解,这样在实际的使用过程中才能够做到有的放矢,避免产生一些错误。下面就介绍一下这方面的情况。
QtConcurrent运行一个线程池,它是一个更高级别的API,不适合运行大量的阻塞操作:如果你做了很多阻塞操作,你很快就会耗尽池并让其他请求排队.在那种情况下,QThread(较低级别的构造)可能更适合于操作(每个代表一个线程).
文件流(QTextStream):操作轻量级数据(int,double,QString)数据写入文本件中以后以文本的方式呈现。
数据流(QDataStream):通过数据流可以操作各种数据类型,包括对象,存储到文件中数据为二进制。
文件流,数据流都可以操作磁盘文件,也可以操作内存数据。通过流对象可以将对象打包到内存,进行数据的传输。
互斥量(QMutex)
QMutex m_Mutex; m_Mutex.lock(); m_Mutex.unlock();
互斥锁(QMutexLocker)
QMutexLocker mutexLocker(&m_Mutex);
从声明处开始(在构造函数中加锁),出了作用域自动解锁(在析构函数中解锁)。
等待条件(QWaitCondition)
QWaitCondtion m_WaitCondition; m_WaitConditon.wait(&m_muxtex, time);
m_WaitCondition.wakeAll();
QReadWriteLock类
》一个线程试图对一个加了读锁的互斥量进行上读锁,允许;
》一个线程试图对一个加了读锁的互斥量进行上写锁,阻塞;
》一个线程试图对一个加了写锁的互斥量进行上读锁,阻塞;、
》一个线程试图对一个加了写锁的互斥量进行上写锁,阻塞。
读写锁比较适用的情况是:需要多次对共享的数据进行读操作的阅读线程。
QReadWriterLock 与QMutex相似,除了它对 “read”,"write"访问进行区别对待。它使得多个读者可以共时访问数据。使用QReadWriteLock而不是QMutex,可以使得多线程程序更具有并发性。
信号量QSemaphore
但是还有些互斥量(资源)的数量并不止一个,比如一个电脑安装了2个打印机,我已经申请了一个,但是我不能霸占这两个,你来访问的时候如果发现还有空闲的仍然可以申请到的。于是这个互斥量可以分为两部分,已使用和未使用。
QReadLocker便利类和QWriteLocker便利类对QReadWriteLock进行加解锁
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。