【问题标题】:signal slot connections without QApplication or QCoreApplication没有 QApplication 或 QCoreApplication 的信号槽连接
【发布时间】:2023-03-14 08:25:01
【问题描述】:

我想编写一个应该由非 QT 应用程序加载的 DLL。结果,当我的 DLL 被加载时,我没有任何 QApplication/QCoreApplication。结果我的信号/插槽机制不起作用。

我在 Qt 论坛中进行了深入搜索,但还没有找到关于如何处理此类问题的好的答案。我创建了一个QThread 将我的QObjects 移动到该线程并创建了一个假QApplicationCore 并在QThread 的run() 函数中调用它的exec() 函数。这样我的信号槽机制就起作用了,但我对这种间接解决方案不满意。我应该能够从主非 Qt 线程的执行空间激活我的线程槽。使用此类 dll 插件的正确方法是什么?欢迎直接回答和阅读资源推荐。谢谢

注意:加载我的 DLL 的外部应用程序是一个 Windows 应用程序。这是第三方应用程序,我无法触摸它。

【问题讨论】:

    标签: windows qt dll


    【解决方案1】:

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

    【讨论】:

    • 亲爱的阿奇,感谢您的回复。有趣的一点是调用线程的 exec() 函数不起作用。除非我调用假 QApplication 的 exec() 函数,否则没有任何作用!
    • QCoreApplication 在后台做了很多事情(比如处理系统消息)。一些 Qt 对象也依赖于 QCoreApplication 实例。所以,我想你无论如何都必须在 DLL_PROCESS_ATTACH 上创建 QCoreApplication 实例。也看看这个线程:stackoverflow.com/questions/2150488/…
    • 小评论:对于直接连接,QCOreApplication 不是必需的,iirc
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多