最近把做的东西封装了一下,写成一个动态库,在Qt的应用中测试很好,跑起来没问题。但是用其他语言调用时出了一个意外,总是输出QEventLoop: Cannot be used without QApplication。究其原因是用了QEventLoop,但是其他语言写的应用程序没有启动QApplication中的exec()。这样就会有这个问题。
看了源代码,查了一些资料,确实躲不开这个事件循环的启动,又不想重新写一编功能。在网上不断找资料(无法google-你懂的),baidu充斥各种无用的资料,还好bing给力,终于找到遇到一样问题的人。解决方式也很简单,不需要运行QApplication (或 QGuiApplication 或 QCoreApplication)中的exec(),这个必然不行。真正需要运行的是processEvents()。当然,要看你创建的动态库是哪种类型,没必要在无界面的动态库中用QGuiApplication的processEvents()。processEvents不会在调用时阻塞。这样就启动了Qt的事件循环。而且只需要运行一次就可以,可以把这部分工作放在一个动态库初始函数中进行操作。
static int argc = 1;
static char arg0[] = "";
static char * argv[] = { arg0, nullptr };
Q_GLOBAL_STATIC_WITH_ARGS(QApplication, app, (arc, argv))
extern "C" __declspec(dllexport) void initialize() {
app->processEvents(); // prime the application instance
}
用Java和C#等测试,不在提示QEventLoop: Cannot be used without QApplication的错误,完美的运行出结果。希望对大家有所帮助。