Qt编写多线程动态库遇到的QEventLoop: Cannot be used without QApplication

博主分享了在使用Qt动态库时遇到的问题,即在非Qt应用程序中调用该库时出现QEventLoop错误。解决方案是通过调用QApplication的processEvents()而非exec()来启动事件循环。这种方法适用于无界面动态库,只需在初始化函数中运行一次即可避免错误,且在Java和C#等语言中测试成功。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      最近把做的东西封装了一下,写成一个动态库,在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的错误,完美的运行出结果。希望对大家有所帮助。

 

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值