我正在使用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();
任何帮助都很受欢迎!!!
答案 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共享库。