QSystemTrayIcon: handle submenus correctly
This fixes a bug when submenus are shown as simple actions when a platform system tray icon is used. To correctly handle submenus, we need to set platform menus on all submenus, and only then on a parent menu. Change-Id: If2bfcc703b938dbb14ba4b9aa810039ced07e946 Reviewed-by: Friedemann Kleint <Friedemann.Kleint@theqtcompany.com> Reviewed-by: Dimitrios Glentadakis <dglent@free.fr> Reviewed-by: Shawn Rutledge <shawn.rutledge@digia.com>
This commit is contained in:
parent
2b5df245d6
commit
03dc2b2e82
@ -37,6 +37,7 @@
|
||||
#ifndef QT_NO_SYSTEMTRAYICON
|
||||
|
||||
#include "qmenu.h"
|
||||
#include "qlist.h"
|
||||
#include "qevent.h"
|
||||
#include "qpoint.h"
|
||||
#include "qlabel.h"
|
||||
@ -704,11 +705,7 @@ void QSystemTrayIconPrivate::updateIcon_sys_qpa()
|
||||
void QSystemTrayIconPrivate::updateMenu_sys_qpa()
|
||||
{
|
||||
if (menu) {
|
||||
if (!menu->platformMenu()) {
|
||||
QPlatformMenu *platformMenu = qpa_sys->createMenu();
|
||||
if (platformMenu)
|
||||
menu->setPlatformMenu(platformMenu);
|
||||
}
|
||||
addPlatformMenu(menu);
|
||||
qpa_sys->updateMenu(menu->platformMenu());
|
||||
}
|
||||
}
|
||||
@ -741,6 +738,27 @@ void QSystemTrayIconPrivate::showMessage_sys_qpa(const QString &message,
|
||||
static_cast<QPlatformSystemTrayIcon::MessageIcon>(icon), msecs);
|
||||
}
|
||||
|
||||
void QSystemTrayIconPrivate::addPlatformMenu(QMenu *menu) const
|
||||
{
|
||||
if (menu->platformMenu())
|
||||
return; // The platform menu already exists.
|
||||
|
||||
// The recursion depth is the same as menu depth, so should not
|
||||
// be higher than 3 levels.
|
||||
QListIterator<QAction *> it(menu->actions());
|
||||
while (it.hasNext()) {
|
||||
QAction *action = it.next();
|
||||
if (action->menu())
|
||||
addPlatformMenu(action->menu());
|
||||
}
|
||||
|
||||
// This menu should be processed *after* its children, otherwise
|
||||
// setMenu() is not called on respective QPlatformMenuItems.
|
||||
QPlatformMenu *platformMenu = qpa_sys->createMenu();
|
||||
if (platformMenu)
|
||||
menu->setPlatformMenu(platformMenu);
|
||||
}
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
#endif // QT_NO_SYSTEMTRAYICON
|
||||
|
@ -99,6 +99,7 @@ private:
|
||||
void updateMenu_sys_qpa();
|
||||
QRect geometry_sys_qpa() const;
|
||||
void showMessage_sys_qpa(const QString &msg, const QString &title, QSystemTrayIcon::MessageIcon icon, int secs);
|
||||
void addPlatformMenu(QMenu *menu) const;
|
||||
};
|
||||
|
||||
class QBalloonTip : public QWidget
|
||||
|
Loading…
x
Reference in New Issue
Block a user