Details
-
Bug
-
Resolution: Done
-
P3: Somewhat important
-
5.15.0
-
None
-
-
ccc4f40946ccfc68d5580c9abfd9e2fb4565a608 (qt/qtquickcontrols2/dev)
Description
See the following example. Pressing Alt+O in "Foo" menu does not trigger the "Ok" action in menu, but triggers the "Oops" button action.
import QtQuick 2.12 import QtQuick.Window 2.12 import QtQuick.Controls 2.12 ApplicationWindow { width: 640 height: 480 title: qsTr("Hello World") visible: true onActiveFocusItemChanged: print("activeFocusItem", activeFocusItem) menuBar: MenuBar { Menu { title: qsTr("&Foo") Action { text: qsTr("&Ok") onTriggered: console.log("ok") } Menu { title: qsTr("&Sub") Action { text: qsTr("&Ok") onTriggered: console.log("ok") } } } } Button { text: "&Oops" onClicked: console.log("oops") } }
That's probably because a menu belonging to MenuBar is excluded from the isBlockedByPopup() test.
I believe this code tries to keep MenuBar shortcuts enabled while menu is open,
but it's wrong to unblock all shortcuts behind the active menu. Instead, I think
the active menu can be closed when Alt key is pressed, which is how widget QMenu handles Alt key:
#include <QtWidgets> #include <QDebug> int main(int argc, char *argv[]) { QApplication app(argc, argv); QObject::connect(&app, &QApplication::focusChanged, [](QWidget *oldWidget, QWidget *newWidget){ qDebug() << "focus changed from" << oldWidget << "to" << newWidget; }); QMainWindow mainWindow; auto fooMenu = mainWindow.menuBar()->addMenu(QObject::tr("&Foo")); auto fooOkAction = fooMenu->addAction(QObject::tr("&Ok")); QObject::connect(fooOkAction, &QAction::triggered, [](){ qDebug() << "Foo -> Ok triggered"; }); auto subMenu = fooMenu->addMenu(QObject::tr("&Sub")); auto subOkAction = subMenu->addAction(QObject::tr("&Ok")); QObject::connect(subOkAction, &QAction::triggered, [](){ qDebug() << "Foo -> Sub -> Ok triggered"; }); QWidget *centralWidget = new QWidget; mainWindow.setCentralWidget(centralWidget); QHBoxLayout *hBoxLayout = new QHBoxLayout(centralWidget); QPushButton *button = new QPushButton(QObject::tr("&Oops"), centralWidget); QObject::connect(button, &QPushButton::clicked, [](){ qDebug() << "Oops clicked"; }); hBoxLayout->addWidget(button); mainWindow.centralWidget()->setLayout(hBoxLayout); mainWindow.resize(400, 400); mainWindow.show(); return app.exec(); }