当应用失去焦点时,Qt系统托盘上下文菜单仍然存在

时间:2011-05-24 19:26:27

标签: windows qt contextmenu system-tray qmenu

我为我的应用设置了一个系统托盘图标,并附加了一个简单的上下文菜单。如果我右键单击该图标以显示上下文菜单,它可以正常工作。如果我然后单击失去应用程序焦点的某个地方(例如,任务栏上的其他位置或其他应用程序),则不会删除上下文菜单,并且在单击时仍会触发正确的操作。但是,如果我点击主应用程序,则上下文菜单会按预期消失。

以下是创建托盘图标和上下文菜单的相关代码 -

actionExit = new QAction( "Exit", this );
connect( actionExit, SIGNAL( triggered() ), this, SLOT( ExitClient() ));

myTrayIconMenu = new QMenu( this );
myTrayIconMenu->addAction( actionExit );

trayIcon = new QSystemTrayIcon( icon, this );
trayIcon->setContextMenu( myTrayIconMenu );
connect( systrayIcon, SIGNAL( activated( QSystemTrayIcon::ActivationReason )), 
         this, SLOT( ToggleVisibility( QSystemTrayIcon::ActivationReason )));
trayIcon->show( );

我是否需要添加自己的代码来测试应用程序失去焦点,以便我可以手动隐藏上下文菜单?我原以为这个功能是内置的。

[问题出现在Windows 7中,通过Qt插件使用Visual Studio 2010 Pro进行编译 - 我没有在任何其他操作系统下进行测试]

我在API文档中注意到了这一点 -

  

注意:系统托盘图标没有   取得菜单的所有权。你必须   确保它被删除   适当的时间,例如,   用合适的菜单创建菜单   父对象。

如果我使用

myTrayIconMenu = new QMenu( );

而不是

myTrayIconMenu = new QMenu( this );

当应用程序失去焦点时,将删除上下文菜单。但是我需要手动删除上下文菜单。

其他人如何处理这种情况?

4 个答案:

答案 0 :(得分:2)

在QApplication派生类而不是某些QWidget中实现QSystemTrayIcon可以解决此问题。

main.cpp中:

int main(int argc, char *argv[])
{
    return TestApp(argc, argv).exec();
}

testApp.cpp:

TestApp::TestApp(int &argc, char **argv) :
    QApplication(argc, argv)
{
    quitAction = new QAction("quit", this);
    connect(quitAction, SIGNAL(triggered()), this, SLOT(quit()));
    systemTrayMenu = new QMenu("tray menu");
    systemTrayMenu->addAction(quitAction);

    trayIcon = new QSystemTrayIcon( this);
    trayIcon -> setToolTip("test app");
    connect(trayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)),
            this, SLOT(iconActivated(QSystemTrayIcon::ActivationReason)));
    trayIcon -> setContextMenu(systemTrayMenu);
    trayIcon -> show();
}

答案 1 :(得分:0)

您能说出您使用的是哪种编译器吗?我想我以前也有这个问题。还有一些其他托盘图标相关的问题(菜单只能显示阴影,菜单会卡在任务栏下面等)。

自从我从Mingw32切换到Visual Studio 2008编译器以来,它一直没有打扰我。也许其他人可以详细说明(因为我不是Windows开发方面的专家)。

答案 2 :(得分:0)

您可以将aboutToHide()信号连接到deleteLater()广告位以处理删除菜单

答案 3 :(得分:0)

根据this bug

,看起来这个问题将在Qt 4.8.0中得到解决