C++ Qt:使用QCoreApplication/QNetworkAccessManager和共享动态C++;图书馆

C++ Qt:使用QCoreApplication/QNetworkAccessManager和共享动态C++;图书馆,c++,qt,cross-platform,qnetworkaccessmanager,dynamic-library,C++,Qt,Cross Platform,Qnetworkaccessmanager,Dynamic Library,我正在使用Qt作为主IDE开发一个共享库。该库应该为任何使用它的应用程序动态链接,并且需要用于Windows、OSX和Linux以及未来计划的可能的移动平台 Qt附带了几个非常有用的库,比如QString(用于unicode)和QNetwork。到目前为止,我只使用QtCore库,但发现我需要在共享库中执行一些REST调用。我很快找到了一些在Qt中使用QNetworkAccessManager进行REST调用的指南。但是,这些指南都基于应用程序模板,而不是库。显然,我的共享库中没有控制台、GUI

我正在使用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的情况下无法使用”


非常感谢任何帮助

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

QCoreApplication始终指向一个内部单例对象,该对象由Qt创建一次,因此所有其他QCoreApplication对象都将在内部指向它。这应该在应用程序的“主”部分创建,事件循环也将在该部分运行。事件循环不仅用于控制台应用程序,还用于将事件传播到Qt窗口对象。与windows相比,它在linux下的行为稍有不同,因为它所依赖的底层本机事件机制有所不同。
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();
   }
}