Не могу наследовать класс QNetworkReply

83
11 июля 2021, 08:00

Всем привет. Второй день бьюсь головой и не могу наследоваться от класса QNetworkReply. Я не знаю что уже я делаю неправильно по этой причине вынужден обратится к вам всем за помощью.

myqnetworkreply.h

#ifndef MYQNETWORKREPLY_H
#define MYQNETWORKREPLY_H
#include <QNetworkReply>
#include <QObject>
QT_BEGIN_NAMESPACE
class MyQNetworkReply : public QNetworkReply
{
    Q_OBJECT
public:
    explicit MyQNetworkReply(QObject *parent = 0);
    ~MyQNetworkReply();
    void downloadProgress(qint64 ist, qint64 max);
};
QT_END_NAMESPACE
#endif // MYQNETWORKREPLY_H

myqnetworkreply.cpp

#include "myqnetworkreply.h"
QT_USE_NAMESPACE
MyQNetworkReply::MyQNetworkReply(QObject *parent) : QNetworkReply(parent)
{
}
MyQNetworkReply::~MyQNetworkReply()
{
}
void MyQNetworkReply::downloadProgress(qint64 ist, qint64 max)
{
    ist = 0;
    max = 0;
}

В QNetworkReply есть функция downloadProgress(), собственно её мне и нужно вытащить.

Получаю вот такую ошибку: invalid new-expression of abstract class type 'MyQNetworkReply' replyL = new MyQNetworkReply(this);

Код основного класса

#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //myReply = new MyQNetworkReply(this);
    //replyL = new QNetworkReply(this);
    NetworkManager = new QNetworkAccessManager();
    process = new QProcess(this);
    //connect(replyL, &QNetworkReply::downloadProgress, this, &MainWindow::downloadProgress);
    connect(ui->pushButton, &QPushButton::clicked, this, &MainWindow::startDownload);
    connect(NetworkManager, &QNetworkAccessManager::finished, this, &MainWindow::downloadFinished);
}
MainWindow::~MainWindow()
{
    delete ui;
}
void MainWindow::startDownload()
{
    QUrl url("http://www.eqdrive.com.ua/files/Updates/UpdateEQDriveConfig/UpdaterEQDrive.exe");
    QNetworkRequest downloadRequest;
    downloadRequest.setUrl(url);
    NetworkManager->get(downloadRequest);
    //QNetworkReply *reply = NetworkManager->get(downloadRequest);
    //connect(reply, &QNetworkReply::downloadProgress, this, &MainWindow::downloadProgress);
    //connect(reply, &QNetworkReply::readyRead, this, &MainWindow::saveDownloadedFile);
}
void MainWindow::downloadFinished(QNetworkReply *reply)
{
    if(reply->error())
    {
        qDebug() << reply->errorString();
    } else {
        QByteArray downloadedFile = reply->readAll();
        QFile *file = new QFile("UpdaterEQDrive.exe");
        if(file->open(QFile::WriteOnly))
        {
            file->write(downloadedFile);
            file->close();
            qDebug("Download Finished");
        }
    }
}
void MainWindow::saveDownloadedFile()
{
    counter++;
    qDebug() << "Save file " << counter;
    //NetworkManager->get(downloadRequest);
}
void MainWindow::downloadProgress(qint64 ist, qint64 max)
{
    ui->progressBar->setRange(0, max);
    ui->progressBar->setValue(ist);
}
Answer 1

Решение проблемы оказалось простой. В функции MainWindow::startDownload() нужно раскомментировать 2 строчки кода:

QNetworkReply *reply = NetworkManager->get(downloadRequest);
connect(reply, &QNetworkReply::downloadProgress, this, &MainWindow::downloadProgress);

и progressBar заработает как нужно. Спасибо за это Fat-Zer

READ ALSO
asio::thread_pool + std::promise — почему-то много VSZ

asio::thread_pool + std::promise — почему-то много VSZ

Есть такой простой пример, в котором происходит использование пула на 70 потоков и создание в каждом std::promise:

82
Как поменять цикл while на for?

Как поменять цикл while на for?

я стараюсь не использовать цикл while, потому что он мне не нравитьсяНо мне нужно вызвать функцию ReceiveAndPrint и проверить ее, не равна ли она 0, после...

87
Как перемешать массив таким образом, чтобы модуль разности любых соседних чисел был не меньше чем 5?

Как перемешать массив таким образом, чтобы модуль разности любых соседних чисел был не меньше чем 5?

Заполнить одномерный массив размером 200 элементов случайными и неповторяющимися числами в диапазоне 1 – 200

118
Чтение сокета средствами C++

Чтение сокета средствами C++

Пишу сервер на С++, отправляю ему данные вида dhw6558d5fjf48dnbp5fps5tkze5f83n{\"gl\":\"123\"} а получаю это и еще 5 непонятных символов

116