QSystemTrayIcon 分别处理左键和右键吗?

Lig*_*lb1 6 c++ qt qt5 qt5.4

我有一个名为 StatusIcon 的类,它扩展了 QSystemTrayIcon。我想对其进行设置,因此右键单击将打开上下文菜单,左键单击将打开一个窗口。

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

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

从文档来看,这似乎可以使用 eventFilter 来实现,我在 StatusIcon 上设置了一个 eventFilter 方法,其中包含一个 qdebug 。单击右键或左键不会调用此函数。

我使用一行代码安装了它,例如:

this->installEventFilter(this)
Run Code Online (Sandbox Code Playgroud)

我想知道它是否不起作用,因为它已经覆盖了虚拟方法,因为我已经将 QSystemTrayIcon 作为超类。

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

有人能想出一种方法来实现这个功能吗?

Che*_*byl 6

你不需要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();
            }
        }
}
Run Code Online (Sandbox Code Playgroud)

对于菜单,只需使用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();
Run Code Online (Sandbox Code Playgroud)