0

我正在尝试通过执行以下操作使我的 QSystemTrayIcon 类成为单独的线程类

  1. 从 QThread 派生了我的 TrayIcon 类
  2. 在 TrayIcon 类中实现了 run() 方法
  3. 将 TrayIcon 初始化代码移至 Run 方法

从主调用 TryIcon.start()。

但是我的应用程序在执行 TrayIcon 类中的“connect”语句时崩溃了。连接语句用于托盘图标菜单功能。

我试图通过阅读 QT 文档、示例来了解 QThread、连接功能。

4

1 回答 1

0

你不能那样做。所有 GUI 代码都必须驻留在 GUI 线程中。如果需要,您可以在单独的 QObject 中实现托盘图标行为的耗时方面。然后将该 QObject 移动到一个单独的线程,并通过信号/插槽连接(不是直接插槽调用!)或通过发布事件从 GUI 线程与其通信。直接调用is slot 是没有意义的:slot 代码会在调用线程中执行,这不是你想要的。

如果您想让生活更轻松,您可以在 QObject 上公开便利槽。这些仅连接到执行实际工作的受保护或私有插槽。您将在 QObject 的构造函数中建立这样的连接,并且它必须是 QueuedConnection。然后,您可以直接调用便利槽:在幕后,Qt 将编组参数并将它们作为事件发布到 QObject 所在线程的事件队列中。该线程中的事件循环将从队列中获取它们并将调用调度到在您的 QObject 中工作的插槽。

于 2012-05-08T22:49:58.077 回答