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

时间:2014-12-30 18:00:44

标签: c++ qt cross-platform qnetworkaccessmanager dynamic-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();

任何帮助都很受欢迎!!!

1 个答案:

答案 0 :(得分:3)

您可以在库中的新线程中创建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共享库。