Schalal

3 Qt类库概述

3.1 Qt核心特点

3.1.1 概述

3.1.2 元对象系统(Meta-Object System)

(1)组成

(2)元对象的一些功能

//QMyWidget是QWidget的子类,并且在类定义中声明了Q_OBJECT宏
QObject *obj = new QMyWidget; 
QWidget *widget = qobject_cast<QWidget*>(obj);//则widget指针指向一个QWidget对象
QMyWidget *myWidget = qobject_cast<QMyWidget*>(obj);//则myWidget指针指向一个QMyWidget对象
QLabel *label = qobject_cast<QLabel*>(obj);//则label是一个NULL指针,因为QMyWidget类不是QLabel的子类

3.1.3 属性系统

(1)定义

Q_PROPERTY()宏定义属性,基于MOS实现,属性系统与C++编译器无关。

Q_PROPERTY宏定义一个返回值类型为type、名称为name的属性,用READ、WRITE关键字定义属性的读取、写入函数,其格式:

Q_PROPERTY(type name
           (READ getFunction [WRITE setFunction] |
            MEMBER memberName [(READ getFunction | WRITE setFunction)])
           [RESET resetFunction]
           [NOTIFY notifySignal]
           [REVISION int]
           [DESIGNABLE bool]
           [SCRIPTABLE bool]
           [STORED bool]
           [USER bool]
           [CONSTANT]
           [FINAL]
           [REQUIRED])

tip:以下来自Qt官网

实质上来讲,应该就是为Qt类设置新的属性,以及读取、写入属性值等时触发的操作。

(2)使用

通过QObject::property()和QObject::setProperty()分别读取和设置属性值,其中:

bool QObject::setProperty(const char *name, const QVariant &value)

Sets the value of the object’s name property to value.

If the property is defined in the class using Q_PROPERTY then true is returned on success and false otherwise. If the property is not defined using Q_PROPERTY, and therefore not listed in the meta-object, it is added as a dynamic property and false is returned.

Information about all available properties is provided through the metaObject() and dynamicPropertyNames().

Dynamic properties can be queried again using property() and can be removed by setting the property value to an invalid QVariant. Changing the value of a dynamic property causes a QDynamicPropertyChangeEvent to be sent to the object.

Note: Dynamic properties starting with “q” are reserved for internal purposes.

即可以设置类的动态属性。

(3)Q_CLASSINFO()宏

为类的元对象附加“名称-值”信息,如

Q_CLASSINFO("author","shchyan")

使用

QMetaClassInfo QMetaObject::classInfo(int index) const

获取指定index的附加信息对象,再使用name()和value()函数获得其附加信息的名称和值。

3.1.4 信号和槽

基于MOS,理论上说比回调函数稍慢(需要查找连接的对象和槽函数),但更灵活。

其声明

QMetaObject::Connection 
connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection)
QMetaObject::Connection 
connect(const QObject *sender, const QMetaMethod &signal, const QObject *receiver, const QMetaMethod &method, Qt::ConnectionType type = Qt::AutoConnection)
QMetaObject::Connection 
connect(const QObject *sender, PointerToMemberFunction signal, const QObject *receiver, PointerToMemberFunction method, Qt::ConnectionType type = Qt::AutoConnection)
QMetaObject::Connection 
connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)
QMetaObject::Connection 
connect(const QObject *sender, PointerToMemberFunction signal, const QObject *context, Functor functor, Qt::ConnectionType type = Qt::AutoConnection)

自定义信号

eg:

class QPerson:public QObject
{
    Q_OBJECT
private:
    int m_age=10;
pubilc:
    void incAge();
signals:
    void ageChanged(int value);//信号函数不能有返回值,无需实现,使用emit发射信号
}
void QPerson::incAge()
{
    m_age++;
    emit ageChanged(m_age);
}

3.2 Qt全局定义(<QtGlobal>文件中)

3.2.1 数据类型定义

3.2.2 函数

多为函数模板,基础数学运算在<QtMath>中定义

3.2.3 宏定义

3.3 容器类

3.3.1 概述

3.3.2 顺序容器类(Sequence container)

(1)QList<T>

数组列表,eg:

QList&lt;QString&gt; list;
list<<"one"<<"two"<<"three";
QString str1 = list[1];//"two"
QString str1 = list.at(0);//"one"

(2)QLinkedList<T>

链式列表

(3)QVector<T>

动态数组,以下标索引访问数据

(4)QStack<T>

栈,进栈:push(),出栈:pop()

(5)QQueue<T>

队列,进队:enqueue(),出队:dequeue()

3.3.3 关联容器类(associative container)

(1)QSet<T>

集合,查找速度更快

(2)QMap<Key, T>

字典,Key指关键字类型,T指值类型

(3)QMultiMap<Key, T>

是QMap的子类,多值字典,一个关键字对应多个值,不能使用下标[]访问值,使用value()返回QList对象

(4)QHash<Key, T>

基于散列表实现字典功能的模板类,其与QMap的区别:

QHash比QMap的查找速度更快(QHash基于哈希函数,QMap基于AVL)

(5)QMultiHash<Key, T>

多值映射的QHash

3.4 容器类的迭代

迭代器(iterator)为访问容器类里的数据提供了统一的方法,Qt有有Java迭代器和STL迭代器两种类型,前者更易于使用并且提供了一些高级功能,后者效率更高。

容器类 迭代器类型 只读迭代器 读写迭代器
QList<T> Java迭代器 QListIterator<T> QMutableIterator<T>
QList<T> STL迭代器 QList<T>::const_iterator QList<T>::iterator

foreach关键字(<QtGlobal>定义的一个宏)

foreach(variable, container)

eg:

QLinkedList&lt;QString&gt; list;
foreach(const QString &str,list){
    if (str,isEmpty())
        break;
    qDebug&lt;&lt;str;
}

3.5 Qt类库的模块