C++ Qt:使用QCoreApplication/QNetworkAccessManager和共享动态C++;图书馆
我正在使用Qt作为主IDE开发一个共享库。该库应该为任何使用它的应用程序动态链接,并且需要用于Windows、OSX和Linux以及未来计划的可能的移动平台 Qt附带了几个非常有用的库,比如QString(用于unicode)和QNetwork。到目前为止,我只使用QtCore库,但发现我需要在共享库中执行一些REST调用。我很快找到了一些在Qt中使用QNetworkAccessManager进行REST调用的指南。但是,这些指南都基于应用程序模板,而不是库。显然,我的共享库中没有控制台、GUI或主功能 QtCoreApplication始终位于使用QNetworkAccessManager的示例中。从文档中可以看出: QtCoreApplication类为控制台Qt提供事件循环 应用程序 按照我的库的创建方式,它包含几个独立的函数,不需要任何控制台。进行REST调用的函数是独立的,QCoreApplication和QNetworkAccessManager可以在这里创建,然后在收到结果时删除 这可能吗?我已尝试使其工作,但在尝试执行QtCoreApplication时程序停止: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
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();
}
}