Как использовать QNetworkAccessManager в собственном классе?

Рейтинг: 0Ответов: 0Опубликовано: 25.03.2023

Всем привет. Я пытаюсь написать парсер на Qt и идея такая: у меня есть главное окно (класс MainWindow который наследуется от QMainWindow) где будут отображаться результаты парсера. И я создаю собственный класс Parse, который наследуется от QObject, где будет происходить процесс получения данных из сайта и эти данные должны передаться в MainWindow для отображения. Но почему-то в классе Parse у меня не работает QNetworkAccessManager, при отправлении запроса ничего не происходит, не вызывается слот "replyFinished(QNetworkReply* reply)". Но если QNetworkAccessManager использовать в MainWindow, то всё нормально работает. Подскажите в чем может быть проблема?

parse.h:

class Parser : public QObject
{
    Q_OBJECT

public:
    Parser(QString site, QObject *parent=0);

    void loadSite();

signals:

    void finished(QNetworkReply* reply);

private slots:

    void replyFinished(QNetworkReply*);

private:

    QString                 site;

    QNetworkAccessManager   *manager;
};

parse.cpp. Здесь просто для проверки записываю данные в файл

Parser::Parser(QString site, QObject *parent)
: QObject(parent)
, site{site}
{
    this->manager = new QNetworkAccessManager(this);
    connect(this->manager, SIGNAL(finished(QNetworkReply*)), this, 
            SLOT(replyFinished(QNetworkReply*)));

}

void Parser::loadSite()
{
    this->manager- >get(QNetworkRequest(QUrl("https://neerc.ifmo.ru/wiki/index.php?title=Заглавная_страница#.D0.90.D0.BB.D0.B3.D0.BE.D1.80.D0.B8.D1.82.D0.BC.D1.8B_.D0.B8_.D1.81.D1.82.D1.80.D1.83.D0.BA.D1.82.D1.83.D1.80.D1.8B_.D0.B4.D0.B0.D0.BD.D0.BD.D1.8B.D1.85%20викиконспекты")));

}

#include <QFile>
void Parser::replyFinished(QNetworkReply *reply)
{
    if(reply->error() == QNetworkReply::NoError)
    {
        QFile file("file.html");
        if(file.open(QFile::WriteOnly))
        {
            file.write(reply->readAll());
        }
        file.close();
    }
    reply->deleteLater();
 }

Но если тоже самое написать в MainWindow то всё нормально работает

При клике на кнопку из MainWindow создается Parser и вызывается метод внутри которого делается запрос

void MainWindow::on_pbtSearch_clicked()
{
    Parser parse(ui->siteCombo->currentText());
    parse.loadSite();

}

Ответы

Ответов пока нет.