Uploaded image for project: 'Qt'
  1. Qt
  2. QTBUG-86276

QtQuick.Controls 2 Menu does not override other &mnemonic key shortcuts

    XMLWordPrintable

Details

    • Bug
    • Resolution: Done
    • P3: Somewhat important
    • 6.1.0 RC
    • 5.15.0
    • Quick: Controls 2
    • None
    • Linux/X11
    • 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.

      https://code.qt.io/cgit/qt/qtquickcontrols2.git/tree/src/quicktemplates2/qquickshortcutcontext.cpp?h=v5.15.0#n60

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

      Attachments

        For Gerrit Dashboard: QTBUG-86276
        # Subject Branch Project Status CR V

        Activity

          People

            qt.team.quick.subscriptions Qt Quick and Widgets Team
            jirauser52013 user-c858f (Inactive)
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: