QNetworkAccessManager 仅适用于应用程序主功能
Posted
技术标签:
【中文标题】QNetworkAccessManager 仅适用于应用程序主功能【英文标题】:QNetworkAccessManager works only from the app main function 【发布时间】: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();
【问题讨论】:
【参考方案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 等的构造函数。
【讨论】:
以上是关于QNetworkAccessManager 仅适用于应用程序主功能的主要内容,如果未能解决你的问题,请参考以下文章
错误:没有用于调用“QNetworkAccessManager::QNetworkAccessManager(Networking* const)”的匹配函数