QNetworkAccessManager仅适用于app main函数

时间:2016-01-07 04:36:58

标签: c++ qt qnetworkaccessmanager

我正在尝试使用QNetworkaccessmanager工作,但只有当我使用它时才会使用基本生成的主类。它不适用于像mainwindow这样的任何其他类。

的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();
}

1 个答案:

答案 0 :(得分:0)

您可以通过多种方式在应用代码中重复使用类实例,例如单例模式:

// 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();
 }

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

此外,一些软件工程师不喜欢单例模式(虽然可以说这很糟糕)但您可以使用new运算符动态创建对象,但要确保正确管理其生命周期。在Qt中还有很多方法可以做到这一点:将对象父对象传递给QObject派生类,QScopedPointer,QSharedPointer等的构造函数。