繁体   English   中英

Qt:将QCoreApplication / QNetworkAccessManager与共享动态C ++库结合使用

[英]Qt: Using QCoreApplication / QNetworkAccessManager with Shared Dynamic C++ Library

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

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

QtCoreApplication始终位于使用QNetworkAccessManager的示例中。 从文档中可以看出:

QtCoreApplication类为控制台Qt应用程序提供事件循环

我的库创建方式它包含几个独立的函数,不应该需要任何控制台。 进行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共享库。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM