【问题标题】:QNetworkAccessManager works only from the app main functionQNetworkAccessManager 仅适用于应用程序主功能
【发布时间】:2016-01-07 04:36:58
【问题描述】:

我正在尝试使用我开始工作的 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();
}

【问题讨论】:

    标签: c++ qt qnetworkaccessmanager


    【解决方案1】:

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

    // 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 等的构造函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-16
      • 2015-10-28
      • 1970-01-01
      • 2011-12-16
      • 2017-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多