Qt类库概述

Qt类库概述

Qt核心特点

概述

QtC++语言增加的特性在Qt Core模块里实现的。如:信号-槽,属性系统,动态类型转换等.

元对象系统

元对象系统由以下三个基础组成
(1). QObject类是所有使用元对象系统的类的基类.
(2). 在一个类的private部分声明Q_OBJECT宏,使得类可使用元对象的特性.
(3). MOC【元对象编译器】为每个QObject的子类提供必要代码来实现元对象系统的特性
过程:MOC工具读取c++源文件,对有Q_OBJECT宏的类,为这个类生成另外一个包含有元对象支持代码的C++源文件,这个生成的源文件连同类的实现文件一起被编译和连接。

除信号与槽机制,元对象还提供:
(1). QObject::metaObject()返回类关联的元对象,元对象类QMetaObject包含了访问元对象的一些接口函数.
(2). QMetaObject::newInstance()函数创建类的一个新的实例.
(3). QObject::inherits(const char* className)函数判断一个对象实例是否是名称为className的类或QObject的子类的实例.
(4). QObject::tr()QObject::trUtf8()可翻译字符串,用于多语言界面设计.
(5). QObject::setProperty()QObject::property()用于通过属性名称动态设置和获取属性值
(6). 对QObject及其子类,还可使用qobject_cast()函数进行动态投射
例如:设QMyWidgetQWidget的子类且类定义中声明了Q_OBJECT

QObject *obj = new QMyWidget;
// 投射失败时,得到的指针内容为NULL
QMyWidget *myWidget = qobject_cast<QMyWidget*>(obj);

属性系统

属性定义

Qt提供一个Q_PROPERTY()可定义属性.
基于元对象系统实现,在QObject子类中,用宏Q_PROPERTY()定义属性,格式如下

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])

定义一个返回值类型为type,名为name的属性
READWRITE关键字定义属性的读取,写入函数
还有其他一些关键字定义属性的一些操作特性
属性的类型可为QVariant支持的任何类型,也可为用户自定义类型

Q_PROPERTY宏定义属性的一些主要关键字的意义如下:
(1). READ指定一个读取属性值的函数,没MEMBER关键字时必须设置READ
(2). WRITE指定一个设定属性值的函数,只读属性没有WRITE设置.
(3). MEMBER指定一个成员变量与属性关联,称为可读,可写的属性,无需再设置READWRITE
(4). RESET是可选的,用于指定一个设置属性缺省值的函数.
(5). NOTIFY是可选的,用于设置一个信号,属性值变化时发射此信号.
(6). DESIGNABLE表示属性是否在Qt Designer里可见,缺省为true
(7). CONSTANT表示属性值是一个常数,对一个对象实例,READ指定的函数返回值是常数,但每个实例的返回值可不一样。
(8). FINAL表示所定义的属性不能被子类重载

QWidget类定义属性的例子:
如:Q_PROPERTY(bool focus READ hasFocus)
如:Q_PROPERTY(QCursor cursor READ cursor WRITE setCursor RESET unsetCursor)

属性使用

不管是否用READWRITE定义接口函数.
只要知道属性名称,就可通过QObject::property()读取属性值,通过QObject::setProperty()设置属性值.

QPushButton *button = new QPushButton;
QObject *object = button;
object->setProperty("flat", true);
bool isFlat = object->property("flat");
动态属性

QObject::setProperty()可在运行时为类定义一个新的属性,称为动态属性。
动态属性针对类的实例定义的。
动态属性可用QObject::property()查询.
就如在类定义里用Q_PROPERTY宏定义的属性一样.

类的附加信息

属性系统还有一个宏Q_CLASSINFO(),可为类的元对象定义"名称-值"

class QMyClass : public QObject
{
QOBJECT
Q_CLASSINFO("author", "Wang")
Q_CLASSINFO("company", "UPC")
Q_CLASSINFO("version", "3.0.1")
public:
	...
}

Q_CLASSINGO()宏定义附加类信息后,可通过元对象的一些函数获取类的附加信息.
classinfo(int)获取某个附加信息
如:QMetaClassInfo QMetaObject::classInfo(int index) const;
QMetaClassInfonamevalue

信号和槽

对象间通信

connect函数的不同参数形式
QMetaObject::Connection QObject::connect(const QObject *sender, const char* signal, 
	const QObject *receiver, const char* method, Qt::ConnectionType type = Qt::AutoConnection);
// 对应实例
connect(spinNum, SIGNAL(valueChanged(int)), this, SLOT(updateStatus(int)));

QMetaObject::Connection QObject::connect(const QObject *sender, const QMetaMethod &signal, 
	const QObject *receiver, const QMetaMethod &method, Qt::ConnectionType type = Qt::AutoConnection);
// 对应实例
connect(lineEdit, &QLineEdit::textChanged, this, &widget::on_textChanged);

对于具有不同参数的同名信号不能用指针进行信号-槽的关联
Qt::ConnectionType表明了信号-槽间的关联方式:
(1).Qt::AutoConnection
信号发射时,自动确定关联方式.
如信号的接收者与发射者在同一个线程,就使用Qt::DirecConnection方式.否则,使用Qt::QueuedConnection方式.
(2). Qt::DirectConnection
信号被发射时槽函数立即执行,槽函数与信号在一个线程.
(3). Qt::QueuedConnection
在事件循环回到接收者线程后执行槽函数,槽函数与信号在不同的线程.信号发送线程无阻塞.
(4). Qt::BlockingQueuedConnection
Qt::QueuedConnectio相似,信号线程会阻塞直到槽函数执行完毕。信号与槽在同一线程这会造成死锁.

使用sender获得信号发射者

在槽函数里,用QObject::sender可获取信号发射者的指针.
如知道信号发射者的类型,可将指针投射为确定的类型,然后使用这个确定类的接口函数.

QSpinBox* spin = qobject_cast<QSpinBox*>(sender());
自定义信号及其使用
class A
{
	Q_OBJECT
signals:
	// 无需实现
	void ageChanged(int);
}

void A::fun()
{
	emit ageChanged(10);
}

元对象特性测试实例

QPerson类的定义

(1). QMetaObject
(2). QMetaProperty
(3). QMetaClassInfo

Qt全局定义

如:<QtGlobal>

数据类型定义

数据类型等效定义字节数
qint8signed char1
qint16signed short2
qint32signed int4
qint64long long int8
qlonglonglong long int8
quint8unsigned char1
quint16unsigned short2
quint32unsigned int4
qint64unsigned long long int8
qulonglongunsigned long long int8
ucharunsigned char1
ushortunsigned short2
uintunsigned int4
ulongunsigned long8
qrealdouble8
qfloat16float4

函数

宏定义

(1). QT_VERSION
形如:0xMMNNPP
Qt5.9.1对应于0x050901
(2). QT_VERSION_CHECK
QT_VERSION_CHECK(m,n,p)返回可与QT_VERSION比较类型.
(3). QT_VERSION_STR
Qt版本号对应的字符串,如"5.9.0"
(4). Q_BYTE_ORDERQ_BIG_ENDIANQ_LITTLE_ENDIAN
Q_BYTE_ORDER表示系统内存中数据的字节序
Q_BIG_ENDIAN, Q_LITTLE_ENDIAN分别表示大端和小端
(5). Q_DECL_IMPORTQ_DECL_EXPORT
使用或设计共享库时,用于导入或导出库的内容
(6). Q_DECL_OVERRIDE
类定义中,用于重载一个虚函数.使用Q_DECL_OVERRIDE后,如函数不属于虚函数重载报错
(7). Q_DECL_FINAL
将一个虚函数定为最终级别,无法在重载或修饰一个类使其无法被继承
(8). Q_UNUSED(name)
修饰在函数中定义但未被使用的参数
(9). foreach(variable, container)
(10). forever{...}
(11). qDebug(const char*,...)
(12). qWarning/qCritica/qFatal/qInfo/...

容器类

容器类概述

QStringListQList<QString>
Qt容器类是线程安全的
QList<T>T不可为QObject或其任何子类

顺序容器类

如:QList,QLinkedList,QVector,QStack,QQueue

QList

操作方法:insert/replace/removeAll/move/swap/append/prepend/removeFirst/removeLast
索引访问:.[index]
索引访问:.at(index)
容量:isEmpty()/size()

QLinkedList
QVector
QStack

操作方法:push/pop

QQueue

操作方法:enqueue/dequeue

关联容器类

有:QMap/QMultiMap/QHash/QMultiHash/QSet
Multi指的是一个容器内元素允许出现键值相同.

QSet

操作方法:contains

QMap

定义:QMap<QString, int> map;
访问:map["one"] = 1;
方法:insert/remove
查询:.[key]/.value(key),如果没找到返回一个缺省构造值,使用value时可指定无值时返回值

QMultiMap

允许内容器内元素键值相同.
不提供[]
使用value访问最新插入的键的单个值,values返回所有值,返回值是QList<T>类型

QHash

QMap的键必须提供<运算符,
QHash的键必须提供==和名为qHash()的全局散列函数

QMultiHash

容器类的迭代

STL类型迭代器

STL类型迭代器总表

对每一个容器类,有两个STL类型迭代器
一个用于只读访问,一个用于读写访问

容器类只读迭代器读写迭代器
QList<T>/QQueue<T>QList<T>::const_iteratorQList<T>::iterator
QLinkedList<T>QLinkedList<T>::const_iteratorQLinkedList<T>::iterator
QVector<T>/QStack<T>QVector<T>::const_iteratorQVector<T>::iterator
QSet<T>QSet<T>::const_iteratorQSet<T>::iterator
QMap<Key, T>QMap<Key, T>::const_iteratorQMap<Key, T>::iterator
QMultiMap<Key, T>QMap<Key, T>::const_iteratorQMap<Key, T>::iterator
QHash<Key, T>QHash<Key, T>::const_iteratorQHash<Key, T>::iterator
QMultiHash<Key, T>QHash<Key, T>::const_iteratorQHash<Key, T>::iterator

还可使用const_reverse_iterator/reverse_iterator定义反向迭代器

顺序容器类的迭代器的用法
QList<QString> list;
list << "A" << "B" << "C" << "D";
QList<QString>::const_iterator i;
for(i = list.constBegin(); i!=list.constEnd();++i)
{
	qDebug() << *i;
}

QList<QString>::reverse_iterator i;
for(i = list.rbegin();i != list.rend();++i)
{
	*i = i->toLower();
}
关联容器类的迭代器的用法

QMapQHash,迭代器的*返回数据项的值
返回键用key()函数,value()返回值

QMap<int, int> map;
...
QMap<int, int>::const_iterator i;
for(i = map.constBegin(); i != map.constEnd(); ++i)
	qDebug()->i.key() << ':' << i.value();

foreach关键字

头文件:<QtGlobal>

foreach(var, container)
{
	...
}

QMapQHash,foreach访问的是键-值中的值集合.

Qt类库的模板

(1). Qt基本模块,提供了Qt在所有平台上的基本功能
(2). Qt附加模块,实现一些特定功能的提供附加价值模块
(3). 增值模块,提供额外价值
(4). 技术预览模块
(5). Qt工具

Qt基本模块

(1). QtCore
(2). Qt GUI
(3). Qt Multimedia
(4). Mt Multimedia Widgets
(5). Qt Network
(6). Qt QML
(7). Qt Quick
(8). Qt Quick Controls
(9). Qt Quick Dialogs
(10). Qt Quick Layouts
(11). Qt SQL
(12). Qt Test
(13). Qt Widgets

Qt附加模块

(1). Active Qt
(2). Qt 3D
(3). Qt Android Extras
(4). Qt Bluetooth
(5). Qt Concurrent
(6). Qt D-Bus
(7). Qt Gamapad
(8). Qt Image Formats
(9). Qt Mac Extras
(10). Qt NFC
(11). Qt Positioning
(12). Qt Print Support
(13). Qt Purchasing
(14). Qt Sensors
(15). Qt Serial Bus
(16). Qt SVG
(17). Qt WebChannel
(18). Qt WebEngine
(19). Qt WebSockets
(20). Qt Windows Extras
(21). Qt XML
(22). Qt XML Patterns
(23). Qt Charts
(24). Qt Data Visualization
(25). Qt Virtual Keyboard

增值模块

(1). Qt for Device Creation
(2). Qt Quick Compiler

技术预览

Qt工具

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

raindayinrain

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值