QNetworkAccessManager只能通过应用程序主功能工作

QNetworkAccessManager works only from the app main function

本文关键字:功能 工作 应用程序 QNetworkAccessManager      更新时间:2023-10-16

我正在尝试使用我正在使用的QNetworkaccessmanager,但只有当我使用它时,它才是基本生成的主类。它在任何其他类(如主窗口)中都不起作用。

main.cpp

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    Updater up;
    up.Update();
    return a.exec();
}

updater.cpp

#include "Updater.h"

Updater::Updater(QObject *parent) :
    QObject(parent)
{
    manager = new QNetworkAccessManager(this);
    connect(manager, SIGNAL(finished(QNetworkReply*)),
            this, SLOT(replyFinished(QNetworkReply*)));
}
void Updater::Update()
{
    manager->get(QNetworkRequest(QUrl(//url)));
}
void Updater::replyFinished (QNetworkReply *reply)
{
    if(reply->error())
    {
        qDebug() << "ERROR!";
        qDebug() << reply->errorString();
    }
    else
    {
        QString result = (QString)reply->readAll();
        //foo(result)
    }
    reply->deleteLater();
}

有很多方法可以在应用程序代码中重用类的实例,例如singleton模式:

// TODO: Provide Updater* updater() in the header file
// and use it like updater()->Update(); wherever you like
// in your application class' objects
static Updater* s_updater;
Updater* updater()
{
   return s_updater;
}
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    Updater up;
    s_updater = &up;
    // do this from somewhere else
    // up.Update();
    return a.exec();
 }

这种方法的问题是如何将结果传递给特定的消费者,但这是一个单独的问题,甚至不清楚你是否想要它或它的工作方式是可以的,但只是这个对象需要在你的应用程序代码中调用。

此外,一些软件工程师不喜欢singleton模式(这是有原因的,尽管可以说这太糟糕了),你可以简单地用新的操作符动态创建对象,但要确保正确管理它的生命周期。在Qt中也有很多方法:将对象父对象传递给QObject派生类的构造函数、QScopedPointer、QSharedPointer等。