QNetworkAccessManager只能通过应用程序主功能工作
QNetworkAccessManager works only from the app main function
我正在尝试使用我正在使用的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等。
相关文章:
- OpenSSL 解密功能无法正常工作
- 链表中的显示功能无法正常工作
- 打印功能无法正常工作 - 链表
- 排序功能在C++中未按预期工作
- 如何组织 git 工作流以修复错误并同时引入新功能
- 为什么必须动态分配扩展数组才能使此功能正常工作C++
- Qt C++括号匹配和突出显示当前线路功能无法协同工作
- 下面的代码是如何工作的?它输出分解的数字并且功能齐全,我只是不明白它是如何做到的
- C 功能如何内部工作
- 大写功能无法正常工作
- 为什么这个base64解码/编码功能不能正常工作?
- 如何使功能"run"工作。程序在调用运行时退出
- C 11螺纹 - 非静态成员功能的使用无效 - 工作GCC 5.1.0损坏的GCC 7.3.1
- Lower_bound功能无法正常工作
- 仅一个功能的链接错误.在同一类和CPP文件中具有相似签名的其他函数工作正常
- 功能测试宏在 Visual C++ 中无法正常工作
- 将Linux打开,读,写,关闭功能以在Windows上工作
- 如何使转换功能工作?
- QNetworkAccessManager只能通过应用程序主功能工作
- 我无法让我的开关功能工作