Контекстное меню панели задач Qt остается, когда приложение теряет фокус - PullRequest
5 голосов
/ 24 мая 2011

Я установил значок в системном трее для своего приложения и прикрепил к нему простое контекстное меню.Если я щелкну правой кнопкой мыши на значке, чтобы вызвать контекстное меню, он работает нормально.Если я затем щелкну где-нибудь, что теряет фокус приложения (например, в другом месте на панели задач или в другом приложении), контекстное меню не удаляется и при нажатии все равно вызывает правильное действие.Однако, если я нажимаю на главное приложение, контекстное меню исчезает, как и ожидалось.

Вот соответствующий код для создания иконки в трее и контекстного меню -

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, компилируется с Visual Studio 2010 Pro через плагин Qt - я не тестировал ни в одной другой ОС]

Я заметил это в документации API -

Примечание. Значок на панели задач не становится владельцем меню.Вы должны убедиться, что он удален в соответствующее время, например, путем создания меню с подходящим родительским объектом.

Если я использую

myTrayIconMenu = new QMenu( );

вместо

myTrayIconMenu = new QMenu( this );

контекстное меню удаляется, когда приложение теряет фокус.Но тогда мне нужно позаботиться об удалении контекстного меню вручную.

Как другие люди справились с этой ситуацией?

Ответы [ 4 ]

2 голосов
/ 11 октября 2012

Внедрение QSystemTrayIcon в ваш производный класс QApplication вместо некоторого 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 голосов
/ 25 мая 2011

Вы можете подключить сигнал aboutToHide() к слоту deleteLater(), чтобы обработать удаление меню

0 голосов
/ 23 ноября 2011

Похоже, что эта проблема будет решена в Qt 4.8.0 в соответствии с этой ошибкой

0 голосов
/ 24 мая 2011

Не могли бы вы сказать, какой компилятор вы используете? Я думаю, у меня тоже была эта проблема. Плюс некоторые другие проблемы, связанные со значками в трее (меню, в которых отображаются только тени, меню, застрявшие под панелью задач и т. Д.)

С тех пор, как я перешел с Mingw32 на компилятор Visual Studio 2008, он меня больше не беспокоил. Может быть, кто-то еще может уточнить это (так как я не эксперт по разработке Windows).

...