重学Qt——网络编程

网络编程

Qt常用的网络编程类:

类名 描述 主要功能
QTcpSocket 用于处理 TCP 协议的客户端和服务器的通信。 是处理 TCP 数据传输的主要类。
QTcpServer 用于创建一个 TCP 服务器,监听来自客户端的连接请求。 创建一个 TCP 服务器并管理客户端连接。
QUdpSocket 用于处理 UDP 协议的通信。 提供发送和接收 UDP 数据的功能。
QNetworkAccessManager 用于处理网络请求和响应,如 HTTP 请求。 是进行网络请求的主要类,支持异步操作。
QNetworkRequest 用于配置网络请求。 配置和定制网络请求的参数。
QNetworkReply 用于接收网络响应数据。 接收和处理网络响应。
QUrl 用于处理 URL。 解析、构建和查询 URL。
QNetworkInterface 用于处理网络接口的信息。 提供网络接口的相关信息。
QHostAddress 用于处理 IP 地址。 表示和操作 IP 地址。
QTcpDatagram 用于处理 TCP 数据报文的封装和解析。 提供对 TCP 数据报文的操作。
QNetworkDatagram 用于表示网络数据报文的接口。 与 QTcpSocket 或 QUdpSocket 结合使用来发送和接收数据。
QAbstractSocket 是所有套接字类的抽象基类。 提供通用的套接字接口和信号/槽机制来处理网络事件。

主机信息查询

获取主机信息可以通过多种方式实现,主要利用 Qt 的 QSysInfo 类以及其他相关的类。

QSysInfo

QSysInfo 类提供了系统相关的信息,包括操作系统版本、主机名称等。

获取系统相关的信息

示例:

cpp 复制代码
#include <QCoreApplication>
#include <QSysInfo>
#include <QDebug>

int main(int argc, char *argv[]) {
    QCoreApplication a(argc, argv);

    qDebug() << "Operating System:" << QSysInfo::currentCpuArchitecture();
    qDebug() << "OS Version:" << QSysInfo::productVersion();
    qDebug() << "Host Name:" << QSysInfo::machineHostName();
    qDebug() << "Product Type:" << QSysInfo::productType();

    return a.exec();
}

运行结果:

plain 复制代码
Operating System: "x86_64"
OS Version: "10"
Host Name: "DESKTOP-Q0OJMLO"
Product Type: "windows"

QStandardPaths

获取用户信息

示例:通过 QStandardPaths 可以获取用户的家目录和其他相关路径。

cpp 复制代码
#include <QCoreApplication>
#include <QStandardPaths>
#include <QDebug>

int main(int argc, char *argv[]) {
    QCoreApplication a(argc, argv);

    QString homeDir = QStandardPaths::writableLocation(QStandardPaths::HomeLocation);
    qDebug() << "Home Directory:" << homeDir;

    return a.exec();
}

运行结果:

plain 复制代码
Home Directory: "C:/Users/xxxcat"

QHostInfo

QHostInfo 是 Qt 中用于处理网络主机信息的类。它可以获取主机名及其相关的地址信息,常用于网络编程时与主机连接和解析相关的操作。

QHostInfo 类的一些主要特性和常用方法:

方法 描述
static QHostInfo fromName(const QString &name) 根据主机名解析并获取 QHostInfo 对象。
static QHostInfo fromAddress(const QHostAddress &address) 根据 IP 地址获取 QHostInfo 对象。
QString hostName() const 返回主机的名称。
QStringList aliases() const 返回与该主机关联的别名列表。
QList addresses() const 返回与该主机关联的所有 IP 地址的列表。
bool isNull() const 检查 QHostInfo 对象是否有效(是否为空)。
QList addresses() (公共函数) 获取与该主机关联的所有 IP 地址列表。此函数可能是重复的,可能是表格填写时的疏忽。
HostInfoError error() (公共函数) 获取解析主机信息时发生的错误类型。表格中没有详细描述此函数的返回值和用途,可能需要根据实际代码进行补充。
QString errorString() (公共函数) 获取解析主机信息时发生的错误字符串描述。同样,可能需要根据实际代码补充更详细的描述。
void abortHostLookup(int id) (静态函数) 中止特定的主机查找操作。需要传入一个标识符 id。
QString localDomainName() (静态函数) 获取本地计算机所在的域名。
QString localHostName (静态函数,可能带有错误) 获取本地计算机的主机名。这里的描述可能需要修正或补充完整的信息。
int lookupHost(QString &name, QObject* receiver, char *member) (静态函数) 根据主机名进行查找,并将结果发送到指定的 QObject 对象的指定成员函数中。需要提供主机名、接收对象和成员函数的指针。
获取特定主机的信息

示例:如何使用 QHostInfo 来获取特定主机的信息。

cpp 复制代码
#include <QCoreApplication>
#include <QHostInfo>
#include <QDebug>

int main(int argc, char *argv[]) {
    QCoreApplication a(argc, argv);

    QString hostName = "www.example.com"; // 替换为你想查询的主机名
    QHostInfo hostInfo = QHostInfo::fromName(hostName); // 从主机名获取主机信息

    if (hostInfo.error() == QHostInfo::NoError) { // 检查是否有错误
        qDebug() << "Host Name:" << hostInfo.hostName();
        qDebug() << "IP Addresses:" << hostInfo.addresses();
    } else {
        qDebug() << "Failed to retrieve host information:" << hostInfo.errorString();
    }

    return 0; // 不需要调用 a.exec(),因为这是一个控制台应用程序,不需要事件循环
}

应用场景

  • DNS 查询:用来解析主机名,获取其 IP 地址。
  • 网络通信:在客户端与服务器之间建立连接时,获取服务器信息。
  • 调试:有助于在调试和测试网络应用程序时获取详细的主机信息。

运行结果:

plain 复制代码
Host Name: "www.example.com"
IP Addresses: QList(QHostAddress("23.208.31.39"), QHostAddress("23.208.31.49"))

QNetworkInterface

QNetworkInterface 是 Qt 中用于处理网络接口信息的类。

  • 提供了有关本机网络接口的信息,例如 IP 地址、MAC 地址、接口名称等。
  • 常用于网络编程,帮助开发者获取和管理各种网络接口的详细信息。

QNetworkInterface 类的一些主要特性和常用方法:

方法 描述
static QList allInterfaces() 返回系统中所有网络接口的列表。
QString name() const 返回网络接口的名称。
QString hardwareAddress() const 返回网络接口的 MAC 地址。
QList addressEntries() const 返回该接口上配置的所有地址条目的列表。
bool isLoopBack() const 检查接口是否是回环接口(如 localhost)。
bool supportsIPv4() const 检查接口是否支持 IPv4 地址。
bool supportsIPv6() const 检查接口是否支持 IPv6 地址。
获取网络信息

示例:使用 QNetworkInterface 获取网络相关的信息,如IP地址、MAC地址等

cpp 复制代码
#include <QCoreApplication>
#include <QNetworkInterface>
#include <QDebug>

int main(int argc, char *argv[]) {
    QCoreApplication a(argc, argv);

    QList<QNetworkInterface> interfaces = QNetworkInterface::allInterfaces();
    for (const QNetworkInterface &interface : interfaces) {
        qDebug() << "Interface Name:" << interface.name();
        qDebug() << "IP Addresses:" << interface.addressEntries();
        qDebug() << "MAC Address:" << interface.hardwareAddress();
    }

    return a.exec();
}

运行结果:

plain 复制代码
Interface Name: "iftype53_32768"
IP Addresses: QList(address = QHostAddress("fe80::d7c4:880:5767:d260%iftype53_32768"), netmask = QHostAddress("ffff:ffff:ffff:ffff::"), address = QHostAddress("169.254.250.73"), netmask = QHostAddress("255.255.0.0"), broadcast = QHostAddress("169.254.255.255"))
MAC Address: "00:FF:B3:18:7B:0F"
获取本机的网络接口信息

示例:

以下是一个简单的示例,展示如何使用 QNetworkInterface 获取本机的网络接口信息:

cpp 复制代码
#include <QCoreApplication>
#include <QNetworkInterface>
#include <QDebug>

int main(int argc, char *argv[]) {
    QCoreApplication a(argc, argv);

    // 获取所有网络接口
    QList<QNetworkInterface> interfaces = QNetworkInterface::allInterfaces();
    for (const QNetworkInterface &interface : interfaces) {
        qDebug() << "Interface Name:" << interface.name();
        qDebug() << "MAC Address:" << interface.hardwareAddress();

        // 获取地址条目
        QList<QNetworkAddressEntry> entries = interface.addressEntries();
        for (const QNetworkAddressEntry &entry : entries) {
            qDebug() << "IP Address:" << entry.ip().toString();
        }
        qDebug() << "--------------------------------";
    }

    return 0; // 不需要调用 a.exec(),因为这是一个控制台应用程序,不需要事件循环
}

应用场景

  • 网络监控:获取当前系统的网络外设信息。
  • 网络配置:用于检查和配置网络设置。
  • 调试:在开发网络应用程序时,获取接口信息以便更好地进行测试和调试。

运行结果:

plain 复制代码
Interface Name: "
MAC Address: "
IP Address: "
IP Address: "

TCP通信

QTcpSocket

QTcpSocket

用途:实现TCP客户端。

功能:提供在网络上读取和写入数据的能力。

QTcpServer

QTcpServer 是 Qt 中用于实现 TCP 服务器的类。

  • 提供了一个简单的接口,用于监听并接受来自客户端的 TCP 连接。
  • 可以使用 QTcpServer 类来创建网络服务,比如聊天应用、文件传输服务等。

QTcpServer 的主要特性和常用方法:

方法 描述
bool listen(const QHostAddress &address, quint16 port) 在指定的地址和端口上开始监听。
void close() 关闭服务器并停止监听。
QHostAddress serverAddress() const 返回服务器的 IP 地址。
quint16 serverPort() const 返回服务器的端口号。
void setMaxPendingConnections(int numConnections) 设置最大等待连接数。
void newConnection() 当有新的连接到达时发出此信号。

信号:void newConnection() :当有新的客户端连接到来时发出此信号。

创建一个基本的 TCP 服务器

示例:

cpp 复制代码
#include <QTcpServer>
#include <QTcpSocket>
#include <QCoreApplication>
#include <QDebug>

class TcpServer : public QTcpServer {
    Q_OBJECT

public:
    TcpServer() {
        connect(this, &QTcpServer::newConnection, this, &TcpServer::handleNewConnection);
    }

private slots:
    void handleNewConnection() {
        QTcpSocket *clientSocket = nextPendingConnection();
        qDebug() << "New client connected:" << clientSocket->peerAddress().toString();

        connect(clientSocket, &QTcpSocket::readyRead, this, [clientSocket]() {
            QByteArray data = clientSocket->readAll();
            qDebug() << "Received:" << data;

            // Echo back the data
            clientSocket->write(data);
        });

        connect(clientSocket, &QTcpSocket::disconnected, clientSocket, &QTcpSocket::deleteLater);
    }
};

int main(int argc, char *argv[]) {
    QCoreApplication a(argc, argv);
    TcpServer server;

    if (server.listen(QHostAddress::Any, 1234)) {
        qDebug() << "Server is listening on port" << server.serverPort();
    } else {
        qDebug() << "Server could not start!";
        return 1;
    }

    return a.exec();
}

#include "main.moc"

使用步骤

  1. 创建服务器:实例化 QTcpServer 对象。
  2. 监听端口:调用 listen() 方法,指定要监听的 IP 地址和端口。
  3. 处理连接:连接 newConnection() 信号到处理函数,当有新连接时接受客户端连接并处理数据。

应用场景

  • 聊天应用:用于处理多个客户端的聊天消息。
  • 文件服务:实现文件上传和下载服务。
  • 实时数据传输:如传感器数据的实时发送和接收。

运行结果:

plain 复制代码
Server is listening on port 1234

UDP通信

QUdpSocket

QUdpSocket 是 Qt 中用于实现 UDP(用户数据报协议)通信的类。与 TCP 不同,UDP 是一种无连接的协议,适用于快速传输数据而不需要建立和维护连接。

特性和方法

以下是 QUdpSocket 类的一些主要特性和常用方法:

方法 描述
bool bind(quint16 port, const QHostAddress &address = QHostAddress::Any, QuicSocketOptions options = 0) 在指定的端口和地址上绑定 Socket。
qint64 writeDatagram(const QByteArray &data, const QHostAddress &host, quint16 port) 发送数据报文到指定的地址和端口。
qint64 readDatagram(QByteArray &data, QHostAddress *host = nullptr, quint16 *port = nullptr) 从 Socket 接收数据报文。
void close() 关闭 Socket。
bool hasPendingDatagrams() const 检查是否有待处理的数据报文。

信号处理

  • void readyRead() :当有数据报文可读时发出此信号。
  • void errorOccurred(QAbstractSocket::SocketError socketError) :发生错误时发出此信号。
创建一个基本的 UDP 客户端和服务器

示例:

以下是一个简单的示例,展示如何使用 QUdpSocket 创建一个基本的 UDP 客户端和服务器:

cpp 复制代码
#include <QCoreApplication>
#include <QUdpSocket>
#include <QDebug>

class UdpServer : public QObject {
    Q_OBJECT
public:
    UdpServer() {
        udpSocket = new QUdpSocket(this);
        udpSocket->bind(1234);
        connect(udpSocket, &QUdpSocket::readyRead, this, &UdpServer::processPendingDatagrams);
        qDebug() << "UDP server is listening on port 1234";
    }

private slots:
    void processPendingDatagrams() {
        while (udpSocket->hasPendingDatagrams()) {
            QByteArray buffer;
            QHostAddress sender;
            quint16 senderPort;

            buffer.resize(udpSocket->pendingDatagramSize());
            udpSocket->readDatagram(buffer.data(), buffer.size(), &sender, &senderPort);

            qDebug() << "Received datagram from:" << sender.toString() << ":" << senderPort;
            qDebug() << "Message:" << buffer;
        }
    }

private:
    QUdpSocket *udpSocket;
};

class UdpClient : public QObject {
    Q_OBJECT
public:
    UdpClient() {
        udpSocket = new QUdpSocket(this);
        QByteArray message = "Hello UDP Server!";
        udpSocket->writeDatagram(message, QHostAddress::LocalHost, 1234);
        qDebug() << "Sent datagram:" << message;
    }

private:
    QUdpSocket *udpSocket;
};

int main(int argc, char *argv[]) {
    QCoreApplication a(argc, argv);
    
    UdpServer server;
    UdpClient client;

    return a.exec();
}

#include "main.moc"

使用步骤

  1. 创建 Socket:实例化 QUdpSocket 对象来创建 UDP Socket。
  2. 绑定端口:使用 bind() 方法在指定端口上绑定 Socket。
  3. 发送数据:使用 writeDatagram() 发送数据。
  4. 接收数据:连接 readyRead() 信号处理接收到的数据。

应用场景

  • 实时通信:如游戏、视频会议等需要低延迟的场景。
  • 广播和组播:发送数据到多个接收方。
  • 传感器数据:收集和传输传感器数据。

运行结果:

plain 复制代码
UDP server is listening on port 1234
Sent datagram: "Hello UDP Server!"
Received datagram from: "::ffff:127.0.0.1" : 51741
Message: "Hello UDP Server!"

UDP组播

在 Qt 中,UDP 组播是一种用于向多个接收者同时发送数据的网络通信方式。使用 QUdpSocket 类,可以轻松实现 UDP 组播功能。组播是通过特定的 IP 地址(通常在范围 224.0.0.0 至 239.255.255.255 内的地址)来实现的。

组播的基本概念

  • 组播地址:使用特定的组播 IP 地址,可以将数据发送到一组接收方。
  • 加入组播组:接收方需要加入组播组,以接收到发送的数据。
  • 实时应用:组播常用于流媒体、在线游戏和实时数据传输。
使用 QUdpSocket 实现组播

以下是使用 QUdpSocket 实现 UDP 组播的基本步骤和示例:。

步骤

  1. 创建 QUdpSocket 实例:用于发送和接收数据。
  2. 绑定端口:接收方需要绑定到特定的端口。
  3. 加入组播组:接收方使用 QUdpSocket::joinMulticastGroup() 方法加入组播地址。
  4. 发送数据:发送方使用 QUdpSocket::writeDatagram() 方法发送到组播地址。
  5. 接收数据:接收方使用 readyRead() 信号处理接收到的数据。

示例:一个简单的组播服务器和客户端。

组播服务器

cpp 复制代码
#include <QCoreApplication>
#include <QUdpSocket>
#include <QHostAddress>
#include <QTimer>
#include <QDebug>

class MulticastServer : public QObject {
    Q_OBJECT
public:
    MulticastServer() {
        udpSocket = new QUdpSocket(this);
        QHostAddress groupAddress("224.0.0.1");
        quint16 port = 1234;

        // 定时发送数据
        QTimer *timer = new QTimer(this);
        connect(timer, &QTimer::timeout, this, [this, groupAddress, port]() {
            QByteArray message = "Hello Multicast!";
            udpSocket->writeDatagram(message, groupAddress, port);
            qDebug() << "Sent:" << message;
        });
        timer->start(1000);  // 每秒发送一次
    }

private:
    QUdpSocket *udpSocket;
};

int main(int argc, char *argv[]) {
    QCoreApplication a(argc, argv);
    MulticastServer server;

    return a.exec();
}

#include "main.moc"

运行结果:

plain 复制代码
Sent: "Hello Multicast!"
Sent: "Hello Multicast!"
Sent: "Hello Multicast!"
Sent: "Hello Multicast!"
Sent: "Hello Multicast!"
Sent: "Hello Multicast!"

组播客户端

cpp 复制代码
#include <QCoreApplication>
#include <QUdpSocket>
#include <QHostAddress>
#include <QDebug>

class MulticastClient : public QObject {
    Q_OBJECT
public:
    MulticastClient() {
        udpSocket = new QUdpSocket(this);
        QHostAddress groupAddress("224.0.0.1");
        quint16 port = 1234;

        // 绑定端口并加入组播组
        udpSocket->bind(port);
        udpSocket->joinMulticastGroup(groupAddress);

        connect(udpSocket, &QUdpSocket::readyRead, this, &MulticastClient::processPendingDatagrams);
        qDebug() << "Joined multicast group:" << groupAddress.toString();
    }

private slots:
    void processPendingDatagrams() {
        while (udpSocket->hasPendingDatagrams()) {
            QByteArray buffer;
            QHostAddress sender;
            quint16 senderPort;

            buffer.resize(udpSocket->pendingDatagramSize());
            udpSocket->readDatagram(buffer.data(), buffer.size(), &sender, &senderPort);

            qDebug() << "Received:" << buffer << "from:" << sender.toString() << ":" << senderPort;
        }
    }

private:
    QUdpSocket *udpSocket;
};

int main(int argc, char *argv[]) {
    QCoreApplication a(argc, argv);
    MulticastClient client;

    return a.exec();
}

#include "main.moc"

总结

  • 组播服务器 向特定的组播地址发送数据,所有加入该组播组的客户端都能接收到。
  • 组播客户端 加入组播组并接收数据,处理通过信号与槽机制实现。

使用 UDP 组播,可以高效地管理大规模的数据分发,适用于实时多媒体应用、在线游戏等场景。

运行结果:

plain 复制代码
QAbstractSocket: cannot bind to QHostAddress::Any (or an IPv6 address) and join an IPv4 multicast group; bind to QHostAddress::AnyIPv4 instead if you want to do this
Joined multicast group: "224.0.0.1"

HTTP网络应用

QNetworkRequest

QNetworkRequest 是 Qt 网络模块中用于封装 HTTP 请求参数的类。它主要在使用 QNetworkAccessManager 发送网络请求时,与之配合使用。在请求中, QNetworkRequest 可以包含 URL、HTTP 方法、Headers、请求体等信息。

主要功能和特性

  1. 设置 URL:定义请求的目标地址。
  2. 指定 HTTP 方法:如 GET、POST、PUT、DELETE 等。
  3. 添加请求头:使用 setRawHeader() 方法可设置自定义 HTTP 头部信息。
  4. 设置请求的内容类型:如 JSON 或 XML,通过 setHeader() 方法设置 Content-Type 。
  5. 支持 SSL:可以配置 SSL 相关的属性。
  6. 超时设置:通过 QNetworkAccessManager 设置请求的超时。

QNetworkAccessManager

QNetworkAccessManager 是 Qt 网络模块中的一个核心类,用于处理网络请求。它提供了发送和接收数据的功能,支持 HTTP、HTTPS 和 FTP 协议,允许开发者在 Qt 应用程序中轻松进行网络通信。

主要功能和特性

  1. 发送请求:支持 GET、POST、PUT、DELETE 等 HTTP 方法。
  2. 管理请求和响应:处理网络请求的发送和接收,包括对响应的解析。
  3. 异步操作:所有网络操作都是异步的,避免阻塞用户界面。
  4. SSL 支持:提供 SSL/TLS 加密通信的支持。
  5. 支持身份验证:可以处理不同的身份验证机制。
  6. 处理缓存:可以与 Qt 的网络缓存系统配合使用。
发送一个简单的 GET 请求

示例:

cpp 复制代码
#include <QCoreApplication>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QUrl>
#include <QDebug>
#include <QObject>

class NetworkManager : public QObject {
    Q_OBJECT
public:
    NetworkManager() {
        manager = new QNetworkAccessManager(this);
        connect(manager, &QNetworkAccessManager::finished, this, &NetworkManager::onFinished);

        // 发起 GET 请求
        QUrl url("https://jsonplaceholder.typicode.com/todos/1");
        QNetworkRequest request(url);
        
        // 发送请求
        manager->get(request);
    }

private slots:
    void onFinished(QNetworkReply *reply) {
        if (reply->error() == QNetworkReply::NoError) {
            qDebug() << "Response:" << reply->readAll();
        } else {
            qDebug() << "Error:" << reply->errorString();
        }
        reply->deleteLater();
    }

private:
    QNetworkAccessManager *manager;
};

int main(int argc, char *argv[]) {
    QCoreApplication a(argc, argv);
    NetworkManager networkManager;
    return a.exec();
}

#include "main.moc"

说明

  1. 创建 QNetworkAccessManager 实例:负责处理所有的网络请求。
  2. 发送请求:通过 get() , post() , put() , 等方法进行不同类型的请求。
  3. 信号和槽机制:使用 finished 信号来处理请求的响应。
  4. 接收响应:在 onFinished 槽中,检查请求是否成功并处理响应。

常见用法

  • GET 请求:用于请求数据,例如获取网页内容。
  • POST 请求:用于发送数据,常用于表单提交。
  • 上传和下载文件:使用 put() 或者 get() 方法,可以进行文件的上传和下载操作。

处理 SSL:若需要使用 SSL,可以通过 QNetworkRequest 配置请求,并在 QNetworkAccessManager 中设置相关的 SSL 选项。

运行结果:

plain 复制代码
Response: "{\n  \"userId\": 1,\n  \"id\": 1,\n  \"title\": \"delectus aut autem\",\n  \"completed\": false\n}"

QNetworkReply

QNetworkReply 是 Qt 网络模块中用于表示网络请求的响应。它保存了从服务器收到的数据,并提供了访问这些数据的功能。通常与 QNetworkAccessManager 一起使用,在发送请求后, QNetworkReply 将接收并提供响应内容。

主要功能和特性

  1. 数据访问:提供读取服务器响应的多种方法,包括文本和二进制数据。
  2. 状态管理:可以查询请求的状态,确保应用能够处理成功和失败的场景。
  3. 错误处理:提供错误信息,方便开发者处理网络问题。
  4. 元数据:能够获取有关HTTP响应的元数据,如状态码、头信息等。
  5. 异步操作:与 QNetworkAccessManager 的信号槽机制一起工作,支持非阻塞操作。

主要方法

  • readAll() :获取响应的全部数据。
  • error() :获取当前请求的错误状态。
  • errorString() :返回错误的描述信息。
  • attribute() :获取请求的某些属性(如 SSL 错误)。
  • header() :获取响应头信息。
  • url() :获取请求的 URL。
使用 QNetworkReply 处理一个简单的 GET 请求的响应。

示例:

cpp 复制代码
#include <QCoreApplication>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QUrl>
#include <QDebug>
#include <QObject>

class NetworkManager : public QObject {
    Q_OBJECT
public:
    NetworkManager() {
        manager = new QNetworkAccessManager(this);
        connect(manager, &QNetworkAccessManager::finished, this, &NetworkManager::onFinished);

        // 设置请求 URL
        QUrl url("https://jsonplaceholder.typicode.com/todos/1");
        QNetworkRequest request(url);

        // 发送 GET 请求
        manager->get(request);
    }

private slots:
    void onFinished(QNetworkReply *reply) {
        if (reply->error() == QNetworkReply::NoError) {
            // 读取响应内容
            QByteArray responseData = reply->readAll();
            qDebug() << "Response:" << responseData;
        } else {
            // 处理错误
            qDebug() << "Error:" << reply->errorString();
        }
        reply->deleteLater();
    }

private:
    QNetworkAccessManager *manager;
};

int main(int argc, char *argv[]) {
    QCoreApplication a(argc, argv);
    NetworkManager networkManager;
    return a.exec();
}

#include "main.moc"

说明

  1. 接收响应:通过 onFinished 槽函数处理 QNetworkReply 的响应。
  2. 读取数据:使用 readAll() 方法获取服务器的响应数据。
  3. 检查错误:通过 error() 方法检查请求是否成功,并使用 errorString() 获取详细信息。

常见用法

  • 获取响应内容:使用 readAll() 或者其他数据读取方法获取服务器返回的数据。
  • 检查状态码和头信息:使用 HTTP 状态码和头信息作出相应的处理。
  • 处理 SSL 相关信息:获得 SSL 连接的状态和错误信息。

运行结果:

plain 复制代码
Response: "{\n  \"userId\": 1,\n  \"id\": 1,\n  \"title\": \"delectus aut autem\",\n  \"completed\": false\n}"
相关推荐
奇树谦1 小时前
QML 开发前端界面详解:从入门到示例实战
qt
caicai_xiaobai7 小时前
Notepad++手动安装 Hex-Editor 插件
qt
郝学胜-神的一滴7 小时前
Qt 高级开发 015:C++ 原生实现信号槽机制
开发语言·c++·qt·软件构建·用户界面
我在人间贩卖青春9 小时前
重学Qt——数据可视化
qt
sycmancia10 小时前
Qt——查找对话框的功能实现
开发语言·qt
x秀x11 小时前
双击EXE启动程序,出现QT动态链接库报错,解决方法
开发语言·qt
尤老师FPGA13 小时前
QT下载与安装
开发语言·qt
奇树谦13 小时前
深入理解 Qt 插件系统:原理、实现与实践
qt
郝学胜-神的一滴20 小时前
Qt 高级开发 009: C++ Lambda 表达式
开发语言·c++·qt·软件构建