Как программно установить фокус на элемент QMenu

Что я хочу сделать с этим фрагментом кода, так это установить фокус на QMenu Item программно. Но ни QMenu::setActiveAction(), ни QMenu::popup() не работают. Как я могу это сделать?

#include <QApplication>
#include <QMainWindow>
#include <QMenuBar>

int main(int argc, char **argv)
{
    QApplication app(argc, argv);
    QMainWindow *window = new QMainWindow();

    window->setWindowTitle(QString::fromUtf8("Test:QMenu"));
    window->resize(336, 227);

    QAction *newAct = new QAction("&New",window);
    QAction *openAct = new QAction("&Open",window);
    QAction *saveAct = new QAction("&Save",window);

    QMenu *fileMenu;

    fileMenu = window->menuBar()->addMenu("&File");
    fileMenu->addAction(newAct);
    fileMenu->addAction(openAct);
    fileMenu->addAction(saveAct);

    window->show();

    fileMenu->popup(QPoint(10,10));

    return app.exec();
}

person manmatha    schedule 12.04.2013    source источник


Ответы (1)


Элементы QMenu не являются «фокусируемыми», как другие виджеты. И, собственно, не должны, потому что то, что вы хотите, не является общепринятой практикой их использования.

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

Кроме того, что будет более приятно для пользователя, чтобы выбрать пункт меню по умолчанию, вы можете генерировать события кнопок с узкими клавишами после отображения всплывающего окна. Это работает в Windows, но не уверен в других ОС.

person Max Go    schedule 12.04.2013
comment
На самом деле одним из требований к программному обеспечению является то, что в качестве пользовательского устройства ввода будет использоваться только клавиатура. В этом отношении ваше первое предложение не помогает. И ваше второе предложение мне непонятно. Будет полезно, если вы объясните этот момент. - person manmatha; 12.04.2013
comment
Попробуйте нажать правую кнопку мыши, чтобы открыть всплывающее меню в браузере. После появления меню попробуйте нажать узкие клавиши вверх/вниз на клавиатуре. Вы увидите, что выбранный пункт меню прыгает, поэтому вы можете грамматически генерировать события нажатия, чтобы выбрать нужный пункт. - person Max Go; 15.04.2013