Qt系统托盘上下文菜单在应用程序失去焦点后仍然保留。

5
我已经为我的应用程序设置了系统托盘图标,并附加了一个简单的上下文菜单。如果我右键单击图标以弹出上下文菜单,它可以正常工作。如果我接着在其他地方点击,使应用程序失去焦点(例如在任务栏的其他位置或打开其他应用程序),那么上下文菜单不会被移除,仍然可以通过单击触发正确的操作。但是,如果我单击主应用程序,则上下文菜单会如预期般消失。

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

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 );

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

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


谢谢您提供的新QMenu()提示!它解决了我的问题。 - Sergey Skoblikov
4个回答

2
在你的QApplication派生类中实现QSystemTrayIcon,而不是一些QWidget,可以解决这个问题。
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();
}

0

你能告诉我你正在使用哪个编译器吗?我想我以前也遇到过这个问题。还有一些与托盘图标相关的问题(只显示阴影的菜单,被任务栏卡住的菜单等)。

自从我从Mingw32切换到Visual Studio 2008编译器后,这个问题就不再困扰我了。也许其他人可以详细解释一下(因为我不是Windows开发专家)。


我正在使用带有QT插件的Visual Studio 2010专业版。 - Rok

0
你可以将 aboutToHide() 信号连接到 deleteLater() 槽上,以处理菜单的删除。

0

根据这个错误,看起来这个问题将在Qt 4.8.0中得到解决。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接