没有QApplication或QCoreApplication的信号槽连接

6
我想编写一个DLL,这个DLL可以被非QT应用程序加载。因此,当我的DLL被加载时,我没有任何。因此,我的Signal/Slot机制无法工作。
我在Qt论坛中深入搜索,但尚未找到如何解决这样的问题的好答案。我创建了一个QThread,将我的QObjects移动到该线程,并创建了一个假的QApplicationCore,并在QThread的run()函数中调用其exec()函数。这样,我的Signal Slot机制就能够正常工作,但我对这种间接解决方案不满意。我应该能够从主要的非Qt线程执行空间激活我的线程插槽。如何正确地处理此类dll插件的工作方式?欢迎提供直接回答和阅读源代码的建议。谢谢
注:加载我的DLL的外部应用程序是Windows应用程序。它是第三方应用程序,我不能触及它。
1个回答

6

在使用Qt信号与槽时,需要运行一个事件循环。你必须在QObjects存在的线程中运行事件循环。当然,你不能在应用程序的主线程中运行它(因为它不使用Qt),所以,正确的解决方案是:启动一个 QThread,将你的QObjects移动到此线程中(或在run()方法中创建这些对象),并在线程的run()方法中运行exec()


1
亲爱的阿奇,感谢您的回复。有趣的是,调用线程的exec()函数并没有起作用。除非我调用一个假的QApplication的exec()函数,否则什么都不起作用! - karadaga
1
QCoreApplication在幕后执行许多操作(如处理系统消息)。一些Qt对象也依赖于QCoreApplication实例。因此,例如在DLL_PROCESS_ATTACH上,我认为您无论如何都必须创建QCoreApplication实例。还请查看此线程:https://dev59.com/InI95IYBdhLWcg3wyRM0 - Archie
1
小注释:对于直接连接,如果我没记错的话,QCoreApplication是不必要的。 - mlvljr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接