在插件(DLL)中使用Qt网络模块
Using Qt network module in a plugin (DLL)?
我正在为一个大型非Qt Windows应用程序(Autodesk 3ds Max)编写一个插件。该插件是一个用C++11编写的本地DLL。
我希望我的插件通过使用Qt 4.8.7网络组件查询GitHub的HTTP API来检查更新。
我尝试了一个简单的测试,但QNetworkAccessManager::get()
调用永远挂起:
QNetworkAccessManager* manager = new QNetworkAccessManager(this);
QNetworkReply* reply = manager->get(QNetworkRequest(QUrl("https://api.github.com/repos/appleseedhq/appleseed-max/releases")));
QByteArray result = reply->readAll();
我想这是因为我没有运行Qt事件循环。
在这里进行的正确方式是什么?我需要QtApplication
吗?考虑到我写的是一个插件而不是一个应用程序,我应该如何构建东西?
解决方法是从DLL导出的函数中启动新的QThread派生对象,并在其中运行事件线程:
// Mind the files. For MOC compiler to create signals and slots
// we need the class to be declared in the header file.
// MyThread.h
// Include missing headers
class MyThread : public QThread
{
Q_OBJECT
protected:
void run(); // override
public slots:
void readData();
void requestFinished(QNetworkReply * reply);
};
void MyThread::run() // override
{
// TODO: make it to quit the loop with some signal
// initialize other objects before the loop
QNetworkAccessManager* manager = new QNetworkAccessManager(this);
// we want manager object to run on this thread
manager->moveToThread(this); // the call maybe redundant here
connect(manager , SIGNAL(finished(QNetworkReply*)),
this, SLOT(requestFinished(QNetworkReply*)));
QEventLoop loop;
loop.exec();
}
// MyThread.cpp
#include "MyThread.h"
void MyThread::readData(QString strUrl)
{
// mind how exactly you compose the request (?)
QNetworkRequest request(QUrl(strUrl));
// here: usually this 'get' request is done from some slot while already in event loop
QNetworkReply *reply = manager->get(request);
// or maybe post request
// QNetworkReply *reply = manager->post(request);
// Error handling
// connect(reply, SIGNAL(error(QNetworkReply::NetworkError)),
// this, SLOT(slotError(QNetworkReply::NetworkError)));
// connect(reply, SIGNAL(sslErrors(QList<QSslError>)),
// this, SLOT(slotSslErrors(QList<QSslError>)));
}
void MyThread::requestFinished(QNetworkReply * reply)
{
QByteArray result = pReply->readAll();
// do something with result
pCallBack(result);
}
// MyDll.h
__declspec(dllexport) void dllFunctionStart();
// reading new data may depend on your app logic
__declspec(dllexport) void dllFunctionRequestData();
// MyDll.cpp
#include "MyDll.h"
#include "MyThread.h"
static MyThread* s_pThread;
__declspec(dllexport) void dllFunctionStart()
{
// TODO: take care of releasing the thread object on quitting the thread
s_pThread = new MyThread;
s_pThread->start();
}
// reading new data may depend on your app logic
__declspec(dllexport) void dllFunctionRequestData()
{
if (s_pThread)
s_pThread->readData();
}
附言:我没有编译它,但这通常是解决这个任务的方法。注意待办事项。
相关文章:
- 如何将网络模块添加到 QT pro 文件中?
- Qt网络引擎获取历史
- 将网络添加到Qt项目
- 如何在没有网络的情况下控制NodeMCU,但使用像Qt这样的GUI(通过wifi)?
- 如何将HTTPS与Qt网络一起使用
- QT网络崩溃
- Qt 网络引擎调试版本崩溃
- 如何在Qt中正确中止网络请求
- 使用 UDP 协议从 Windows 套接字发送到 Qt 套接字的网络数据包上的结构编码和解码
- 依赖于网络时的Qt测试
- 如何在qt网络引擎中禁用CSP
- Qt网络请求自动添加意外问号
- 使用Qt显示来自OpenCV的网络摄像头流
- 如何使用Qt在Windows上检查网络接口类型是以太网或无线
- QT.如何使用QTNetwork在网络上查看其他计算机
- 在插件(DLL)中使用Qt网络模块
- 正在执行qt网络请求
- QT网络回复不会给我来自PHP脚本的结果
- 用QT网络序列化和用Boost反序列化
- Qt网络访问管理器JSON获取响应