【问题标题】:QSystemTrayIcon leaves behind too many duplicate icons in the trayQSystemTrayIcon 在托盘中留下了太多重复的图标
【发布时间】:2015-07-31 02:37:01
【问题描述】:

当我运行并退出我的应用程序时,它会在托盘中留下太多托盘图标,而不仅仅是一个。我还设置了我的应用程序,因此一次只能实例化一个实例,但是在程序多次启动和退出之后,系统托盘似乎可以容纳所有图标,当我将鼠标悬停在它们上时它们会慢慢下降(合法)一。我怎样才能停止创建这个重复的图标?

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    systemTray = new QSystemTrayIcon();

    systemTray->setIcon( QIcon(":icons/Resources/Orange.ico") );

    systemTray->setVisible( true );
    systemTray->show();

    systemTray->setToolTip("Rigaku sync application");

    systemTrayIconMenu = new QMenu();

    systemTrayIconMenu->addAction( ui->actionOpen_App );
    systemTrayIconMenu->addAction( ui->actionSettings );
    systemTrayIconMenu->addAction( ui->actionClose );
    systemTrayIconMenu->addAction( ui->actionQuit );

    systemTray->setContextMenu( systemTrayIconMenu );
}

我删除了析构函数中的systemTray指针。

既然我们这样做了,我还希望能够双击应该调出应用程序的托盘图标。我怎样才能做到这一点?我知道我必须在双击时设置默认选项(在上下文菜单中也显示为粗体),但我该怎么做呢?谢谢!

更新

我现在可以使用 setDefaultAction() 显示默认菜单并双击托盘。现在我唯一的问题是如何去掉系统托盘中多余的图标。

【问题讨论】:

  • 同时调用QSystemTrayIcon::setVisible(true)QSystemTrayIcon::show() 是多余的。使用其中一种。在删除systemTray 对象之前,您是否尝试过调用setVisible(false)/hide()?您使用QMenu::setDefaultAction() 设置默认菜单项,将addAction() 返回的QAction* 传递给它。使用QAction:::triggered 信号响应菜单项点击。使用QSystemTrayIcon::activated 信号来响应托盘图标本身的用户活动。你读过文档吗? QSystemTrayIcon Class
  • 您在哪个桌面上看到这个,使用哪个 Qt 版本?例如,Unity 中的托盘图标支持在 5.5 之前被严重破坏
  • 您的应用程序是否以 0 退出代码关闭?
  • @FrankOsterfeld Windows 7 和 Qt 5.4
  • @kefir500 我确实通过exit(0) 退出,因为我的应用程序应该在后台运行,并且当用户单击close 按钮时,它会将其最小化到系统托盘。

标签: windows qt


【解决方案1】:

如果我理解正确,您使用的是 C/C++ exit 函数。

为了正确退出 Qt 应用程序,您必须调用此函数:

QCoreApplication::quit(); // Return code is 0

如果您想指定返回码,请使用以下函数:

QCoreApplication::exit(YOUR_RETURN_CODE);

你也可以用QApplication代替QCoreApplication,没有区别。

因此,当使用其中一种方法时,托盘图标会在您退出应用程序后正确销毁。

【讨论】:

  • 我在 MainWindow 中使用了 exit(),我认为这是 Qt 的退出?但是山雀不起作用。我确实 quit() 并解决了问题。
  • @zadane QMainWindow 中没有 exit 方法,所以您使用的是 C/C++ exit
  • @kefir500:您好,我遇到了类似的问题。但我的问题是,如果我的应用程序突然崩溃,图标并没有被删除。
  • @user12345 AFAIK,应用程序崩溃总是会留下托盘图标(至少在 Windows 上)。更多信息:#1#2
  • 这是正确答案。我在我的主窗口析构函数中添加了QCoreApplication::quit(); ,这完全解决了这个问题。
猜你喜欢
  • 2015-10-28
  • 2014-09-11
  • 1970-01-01
  • 1970-01-01
  • 2012-02-16
  • 2014-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多