我正在尝试通过执行以下操作使我的 QSystemTrayIcon 类成为单独的线程类
- 从 QThread 派生了我的 TrayIcon 类
- 在 TrayIcon 类中实现了 run() 方法
- 将 TrayIcon 初始化代码移至 Run 方法
从主调用 TryIcon.start()。
但是我的应用程序在执行 TrayIcon 类中的“connect”语句时崩溃了。连接语句用于托盘图标菜单功能。
我试图通过阅读 QT 文档、示例来了解 QThread、连接功能。
我正在尝试通过执行以下操作使我的 QSystemTrayIcon 类成为单独的线程类
从主调用 TryIcon.start()。
但是我的应用程序在执行 TrayIcon 类中的“connect”语句时崩溃了。连接语句用于托盘图标菜单功能。
我试图通过阅读 QT 文档、示例来了解 QThread、连接功能。
你不能那样做。所有 GUI 代码都必须驻留在 GUI 线程中。如果需要,您可以在单独的 QObject 中实现托盘图标行为的耗时方面。然后将该 QObject 移动到一个单独的线程,并通过信号/插槽连接(不是直接插槽调用!)或通过发布事件从 GUI 线程与其通信。直接调用is slot 是没有意义的:slot 代码会在调用线程中执行,这不是你想要的。
如果您想让生活更轻松,您可以在 QObject 上公开便利槽。这些仅连接到执行实际工作的受保护或私有插槽。您将在 QObject 的构造函数中建立这样的连接,并且它必须是 QueuedConnection。然后,您可以直接调用便利槽:在幕后,Qt 将编组参数并将它们作为事件发布到 QObject 所在线程的事件队列中。该线程中的事件循环将从队列中获取它们并将调用调度到在您的 QObject 中工作的插槽。