QNetworkAccessManager的使用例子

发布时间 2023-04-18 15:16:33作者: 兜尼完

QNetworkAccessManager是一种支持常见网络协议的类。可以很方便的使用。它提供了上传下载进度的接口,对网络错误也提供了接口。在Qt帮助中说在触发error(QNetworkReply::NetworkError)信号之后,后面很可能跟着finished()信号,因此可以在这两个信号的槽函数中及时删除QNetworkReply对象。当然不删除也行,那样QNetworkReply对象就会在QNetworkAccessManager对象释放的时候才会删除。下面是该类使用的范例。代码中的QtTest是主窗口类可以忽略,头文件:

class QtTest : public QMainWindow
{
    Q_OBJECT

public:
    QtTest(QWidget *parent = Q_NULLPTR);

private slots:
    void replyDownloadProgress(qint64, qint64);
    void replyFinished();
    void replyError();

private:
    Ui::QtTestClass ui;
    QNetworkAccessManager* manager;
};

CPP文件(ui.pbJindu是QProgressBar控件;ui.lbImage是QLabel控件):

QtTest::QtTest(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);
    manager = new QNetworkAccessManager(this);
    QUrl url(u8"https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png");
    QNetworkReply* reply = manager->get(QNetworkRequest(url));
    connect(reply, &QNetworkReply::downloadProgress, this, &QtTest::replyDownloadProgress);
    connect(reply, &QNetworkReply::finished, this, &QtTest::replyFinished);
    connect(reply, QOverload<QNetworkReply::NetworkError>::of(&QNetworkReply::error), this, &QtTest::replyError);
}

void QtTest::replyDownloadProgress(qint64 bytesReceived, qint64 bytesTotal)
{
    if (bytesReceived >= 0 && bytesTotal > 0)
    {
        ui.pbJindu->setValue(bytesReceived / bytesTotal * 100);
    }
}

void QtTest::replyFinished()
{
    QNetworkReply* reply = dynamic_cast<QNetworkReply*>(sender());
    QPixmap image;
    image.loadFromData(reply->readAll());
    ui.lbImage->setPixmap(image);
    reply->deleteLater(); /* 及时删除Reply对象。不删也行 */
}

void QtTest::replyError()
{
    ui.lbImage->setText(u8"下载失败");
}