QSystemTrayIcon 处理左右分别点击?

Posted

技术标签:

【中文标题】QSystemTrayIcon 处理左右分别点击?【英文标题】:QSystemTrayIcon handle left and right click separately? 【发布时间】:2015-05-04 18:00:23 【问题描述】:

我有一个名为 StatusIcon 的类,它扩展了 QSystemTrayIcon。我想设置它,所以右键单击打开上下文菜单,左键单击打开一个窗口。

目前默认行为似乎是左右单击打开上下文菜单。

我需要找到一种方法来阻止左键单击并运行我自己的代码。

从文档看来,这可以使用 eventFilter 来实现,我在 StatusIcon 上设置了一个带有 qdebug 的 eventFilter 方法。这不会通过右键或左键单击来调用。

我使用如下代码安装它:

this->installEventFilter(this)

我想知道它是否无法正常工作,因为它已经覆盖了虚拟方法,因为我将 QSystemTrayIcon 作为超类。

有谁知道为什么 eventFilter 没有被调用?

有人能想出实现此功能的方法吗?

【问题讨论】:

我也尝试过覆盖从 QObject 继承的事件方法。这不会被调用。这是events system 文档。似乎我从这里尝试的一切都不起作用。我似乎无法在 QSystemTrayIcon 上捕获这些点击事件。 【参考方案1】:

您不需要eventFilter。左键:

//somewhere in constructor
connect(tray,SIGNAL(activated(QSystemTrayIcon::ActivationReason)),this,SLOT(showHide(QSystemTrayIcon::ActivationReason)));

//...

void MainWindow::showHide(QSystemTrayIcon::ActivationReason r)

    if (r == QSystemTrayIcon::Trigger)
        
            if (!this->isVisible())  
                this->show();
             else 
                this->hide();
            
        

对于菜单,只需使用setContextMenu():

QMenu *menu = new QMenu(this);
//for example
menu->addAction(showHideAct);
menu->addAction(optionAct);
menu->addAction(infoAct);
menu->addSeparator();
menu->addAction(quitAct);

tray = new QSystemTrayIcon();
tray->setIcon(QIcon("://data/tray.png"));
tray->setContextMenu(menu);//important method for you
tray->show();

【讨论】:

看起来棒极了。我显然错过了这里文档的主要部分。我会在一个小时左右尝试这个,让你知道我的进展如何。谢谢。 我刚刚重新阅读文档并意识到这是我的问题。我将上下文菜单附加到图标上,左右都打开它。这并不能解决它,因为它没有办法阻止上下文菜单在左键单击时打开,或者检测单击是左键还是右键。这会同时触发。 使用上面的代码,您将拥有鼠标左键单击功能,以及鼠标右键单击时的自定义上下文菜单。我也有相同的代码,它工作正常。或阅读this。 我已经有几天没有时间研究这个了,但目前我有与此非常相似的代码。对我来说,虽然这个解决方案的问题是触发器是左右点击的激活原因。然后在左右单击时打开上下文菜单。这显然是不对的。这发生在 OS X Yosemite 和带有 tint2 和 openbox 的 Arch Linux 上。今晚我将尝试并努力解决这个问题。我正在考虑暂时放弃上下文菜单,只是将我需要的项目添加到弹出窗口中。不是我计划的,但它会解决我的问题。

以上是关于QSystemTrayIcon 处理左右分别点击?的主要内容,如果未能解决你的问题,请参考以下文章

QSystemTrayIcon 未显示

QSystemtrayicon:Mac 上没有图像

新闻列表中标题和日期的左右分别对齐的几种处理方法

Qt之自定义托盘

如何捕捉 QSystemTrayIcon 的 MouseHover 事件?

有啥方法可以通过 Qt Designer 添加 QSystemTrayIcon