一、预处理器
预处理器(Preprocessor)是C++语言的一个重要组成部分,它可以在编译时执行一些文本替换、条件编译等操作。Qt5Core在预处理器方面的支持主要有以下两个方面:
1、定义:Qt提供了一些预处理器宏(Predefined Macros),可以方便地获取一些编译时的环境信息,如:
qDebug() << "Compiler: " << compiler; qDebug() << "Project name: " << PROJECT_NAME;
其中,compiler和PROJECT_NAME就是Qt提供的两个预处理器宏。
2、条件编译:条件编译(Conditional Compilation)是指根据一定条件去编译或排除某段代码。Qt里面也支持条件编译,常用的有以下两种:
#if defined(Q_OS_LINUX) // 如果目标平台是Linux则编译以下代码 #elif defined(Q_OS_WIN32) // 如果目标平台是Windows则编译以下代码 #endif
#ifndef DEBUG // 如果没有开启DEBUG宏则开启 #define DEBUG #endif
二、容器
容器(Container)是指一些可用于存储数据的数据结构,如数组、链表、队列、栈、哈希表等。Qt5Core提供了一下几种容器类:
1、QList:QList是一个动态的数组,支持随机访问,可以在数组中任意位置插入、删除元素。
QListlist; list.append("first"); list.append("second"); list.insert(1, "third");
2、QVector:QVector同样是一个动态的数组,与QList类似。但是在一些场景下,QVector可以比QList更快一些。
QVectorvector; vector.append(1); vector.append(2); vector.insert(1, 3);
3、QMap:QMap是一个键值对映射表,可以根据键访问值,也可以插入、删除键值对。
QMapmap; map.insert("first", 1); map.insert("second", 2); map.insert("third", 3); qDebug() << map.value("first");
4、QHash:QHash是一个类似于哈希表的数据结构,同样支持键值对操作。
QHashhash; hash.insert("first", 1); hash.insert("second", 2); hash.insert("third", 3); qDebug() << hash.value("first");
三、线程
线程(Thread)是现代计算机程序设计中的一项重要技术,指的是在一个程序中同时执行多个代码片段的能力。Qt5Core线程模块提供了一套完整的线程内存模型和API,实现了多线程程序的开发。
1、QThread:QThread是Qt中线程的基础类,由它来管理线程的生命周期。通常情况下,我们不直接继承QThread来创建线程,而是将QThread作为一个成员变量放在我们自己的自定义线程类里面。
class MyThread : public QObject { Q_THREAD public: MyThread() {} void run() override { // 重写run方法,在里面执行线程函数 } };
2、QMutex:QMutex是Qt线程模块提供的一种锁机制,用于保证在多线程环境下资源的同步访问。QMutex可以用于多线程间保护数据的访问,也可以用于控制对民黄窗口的访问。
QMutex mutex; mutex.lock(); // 访问共享资源 mutex.unlock();
四、事件处理
事件处理(Event Handling)是指程序在运行时不断接收各种事件(如鼠标点击、键盘输入),并且针对每个事件采取不同的处理方法。Qt5Core中事件处理使用的核心概念是Event Loop(事件循环)。
1、QEventLoop:QEventLoop可以将当前线程转为一个事件循环,并在事件循环过程中等待各种事件的到信号。在某些程序设计模式中,QEventLoop可以用来等待异步操作的完成。
QEventLoop loop; QObject::connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit); loop.exec();
2、QCoreApplication:QCoreApplication是Qt中的应用程序的基础类,因为Qt设计目标就是开发GUI应用程序,因此QCoreApplication通常是由一个含有main()函数的Qt程序的基础。QCoreApplication有一个执行事件循环的exec()函数,该函数开始执行事件循环,并在这个循环中不断接收和处理事件。
QCoreApplication app(argc, argv); // 执行事件循环 return app.exec();
五、IO操作
IO操作(Input/Output Operation)是程序与外部环境交换信息的途径,常见的IO操作有文件读写、网络访问等。Qt5Core中提供了一套强大而易用的IO操作类,支持文件、网络、序列化和XML等操作。
1、QFile:QFile提供了一个读写普通文件的基础类,支持以二进制或文本格式写入数据,也可以读取文件中的数据。
QFile file("example.txt"); if (file.open(QIODevice::ReadWrite)) { QTextStream stream(&file); stream << "Hello World!" << endl; file.close(); }
2、QTcpSocket:QTcpSocket是TCP/IP协议通信的基础模块,支持在客户端和服务器之间建立基于TCP协议的Socket连接,进行数据的发送和接收。
QTcpSocket socket; socket.connectToHost("127.0.0.1", 6666); if (socket.waitForConnected()) { socket.write("Hello World!"); socket.flush(); socket.waitForBytesWritten(); socket.disconnectFromHost(); }
3、QDataStream:QDataStream提供了一套方便易用的序列化和反序列化机制,支持将QByteArray、QDataStream和普通数据类型之间进行来回转换。
QByteArray data; QDataStream stream(&data, QIODevice::WriteOnly); stream << QString("Hello World!"); // ... QDataStream in(&data, QIODevice::ReadOnly); QString str; in >> str;
4、QXmlStreamReader/QxmlStreamWriter:QXmlStreamReader/QxmlStreamWriter提供了一套简单易用的XML读写模块,支持解析和生成XML格式文档。
QXmlStreamReader reader(xmlData); while (!reader.atEnd()) { reader.readNext(); if (reader.isStartElement()) { qDebug() << "Element: " << reader.name(); } }