gpt4 book ai didi

c++ - Qt:将 QCoreApplication/QNetworkAccessManager 与共享动态 C++ 库一起使用

转载 作者:太空狗 更新时间:2023-10-29 21:19:17 26 4
gpt4 key购买 nike

我正在开发一个使用 Qt 作为主要 IDE 的共享库。该库应该为使用它的任何应用程序动态链接,并且需要用于 Windows、OSX 和 Linux 以及 future 计划的可能的移动平台。

Qt 加载了几个非常有用的库,如 QString(用于 unicode)和 QNetwork。到目前为止,我只使用 QtCore 库,但发现我需要在共享库中进行一些 REST 调用。我很快找到了几个在 Qt 中使用 QNetworkAccessManager 进行 REST 调用的指南。然而,这些指南都是基于应用程序模板而不是库。显然,我的共享库中没有控制台、GUI 或主要功能。

QtCoreApplication 总是在使用 QNetworkAccessManager 的示例中。从文档中它被描述为:

The QtCoreApplication class provides an event loop for console Qt applications

我的库的创建方式包含几个独立的函数,并且永远不需要任何控制台。进行 REST 调用的函数是独立的,并且 QCoreApplication 和 QNetworkAccessManager 可以很好地在收到结果时被删除之前在这里创建。

这可能吗?我试图让它工作,但程序在尝试执行 QtCoreApplication 时停止:

int argc = 1;
char appname[] = "App";
char* argv[] = {appname, NULL};
QCoreApplication app = new QCoreApplication(QAppPriv::argc, QAppPriv::argv);
app->exec();

我在“MakeRequest”函数中运行了以下代码,但出现错误“QEventLoop:无法在没有 QApplication 的情况下使用”:

QTimer timer;
timer.setSingleShot(true);

// Create custom temporary event loop on stack
QEventLoop eventLoop;
timer.start(5000);

// "quit()" the event-loop, when the network request "finished()"
QNetworkAccessManager mgr;
QObject::connect(&timer, SIGNAL(timeout()), &eventLoop, SLOT(quit()));
QObject::connect(&mgr, SIGNAL(finished(QNetworkReply*)), &eventLoop, SLOT(serviceRequestFinished(QNetworkReply*)));

QUrl url( QString("http://ip.jsontest.com/") );
QNetworkReply* reply = mgr.get(QNetworkRequest(url));
eventLoop.exec();

非常感谢任何帮助!!!

最佳答案

您可以在库的新线程中创建 QCoreApplication 的实例。你应该检查只创建它的一个实例,那是因为每个 Qt 应用程序应该只包含一个 QCoreApplication :

class Q_DECL_EXPORT SharedLibrary :public QObject    
{
Q_OBJECT
public:
SharedLibrary();

private slots:

void onStarted();

private:
static int argc = 1;
static char * argv[] = {"SharedLibrary", NULL};
static QCoreApplication * app = NULL;
static QThread * thread = NULL;
};


SharedLibrary::SharedLibrary()
{
if (thread == NULL)
{
thread = new QThread();
connect(thread, SIGNAL(started()), this, SLOT(onStarted()), Qt::DirectConnection);
thread->start();
}
}
SharedLibrary::onStarted()
{
if (QCoreApplication::instance() == NULL)
{
app = new QCoreApplication(argc, argv);
app->exec();
}
}

这样您甚至可以在非 Qt 应用程序中使用您的 Qt 共享库。

关于c++ - Qt:将 QCoreApplication/QNetworkAccessManager 与共享动态 C++ 库一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27710250/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com