【问题标题】:Qt system tray context menu remains when app loses focus当应用程序失去焦点时,Qt 系统托盘上下文菜单仍然存在
【发布时间】:2011-09-01 05:26:54
【问题描述】:

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

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

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() 提示!它解决了我的问题。

标签: windows qt contextmenu system-tray qmenu


【解决方案1】:

在您的 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();
}

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 我正在使用带有 QT 插件的 Visual Studio 2010 Professional
    【解决方案3】:

    您可以将aboutToHide() 信号连接到deleteLater() 插槽来处理菜单的删除

    【讨论】:

      【解决方案4】:

      根据this bug看来这个问题将在Qt 4.8.0中得到解决

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-08-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-27
        相关资源
        最近更新 更多