Qt добавляет сочетание клавиш без меню в QMainWindow

У меня есть собственный виджет, который расширяет QMainWindow. Там я добавляю несколько QAction в строку меню вместе с сочетаниями клавиш для каждого, и они работают нормально. Теперь я хочу удалить некоторые из этих действий из строки меню, но я хочу оставить ярлыки включенными (пользователь может узнать о доступности ярлыков из диалогового окна Справка). Поэтому сначала я решил, что сделаю действия невидимыми.

Это не сработало, поэтому я думаю, что действие не может быть невидимым, если ярлыки должны работать. Поэтому я добавил его в главное окно, но они все равно не работают. Любая идея, как мне заставить это работать? Вот мой код. Все, что должно произойти, есть в методе someMethod.

class MyWidget: public QMainWindow {
    public:
        MyWidget();

};

MyWidget::MyWidget() {
    QAction *myAct = new QAction(tr("&Some Text"), this);
    fNextmyActPageAct->setShortcut(QKeySequence(Qt::Key_Right));
    myAct->setVisible(false); //adding this does not work
    connect(myAct, SIGNAL(triggered()), this, SLOT(someMethod()));

    ...

    QMenu *someMenu = menuBar()->addMenu(tr("&Some Menu"));
    someMenu->addAction(myAct); //this works, the option shows up in the menu 'Some Menu' and the shortcut works
    this->addAction(myAct); //does not work

}

person SexyBeast    schedule 22.11.2014    source источник


Ответы (2)


Я протестировал этот код, и он отлично работает:

QAction* myAct = new QAction(this);
myAct->setShortcut(Qt::Key_Right);
connect(myAct, SIGNAL(triggered()), this, SLOT(someMethod()));
this->addAction(myAct);

Не добавляйте QAction в панель меню.

person Ali Mofrad    schedule 22.11.2014
comment
Эм, нет, не работает. И я этого не ожидал, ты не делаешь ничего другого, чем я. - person SexyBeast; 22.11.2014
comment
Я протестировал этот код, и я уверен, что он работает. используйте эти 4 строки только в новом проекте для теста. - person Ali Mofrad; 22.11.2014
comment
Я использовал это. Единственная разница между вашим и моим кодом заключается в том, что вы не добавляли текст во время инициализации, а использовали ярлык напрямую, а не заключали его в QkeySequence. Ни один из них не должен иметь никакого значения. Тем не менее я пытался, но это не работает. - person SexyBeast; 22.11.2014
comment
Нет кода, который явно не устанавливает фокус на виджет, я пробую ярлык после того, как щелкнул виджет. Таким образом, щелчок должен естественным образом сместить фокус на виджет, но он все еще не работает. - person SexyBeast; 22.11.2014
comment
@Cupidvogel Извините, но я должен был спросить: вы определили someMethod () как общедоступный слот? - person Ali Mofrad; 22.11.2014

Вы можете использовать QShortcut и передать ключ, целевой виджет и соответствующий слот в качестве параметров его конструктору. Просто поместите это в конструктор MyWidget :

QShortcut * shortcut = new QShortcut(QKeySequence(Qt::Key_Right),this,SLOT(someMethod()));
shortcut->setAutoRepeat(false);
person Nejat    schedule 22.11.2014
comment
Это работает для меня. Возможно, это потому, что вы также используете ту же клавишу для действия. Попробуйте изменить клавишу, чтобы проверить, работает ли она, или удалите сочетание клавиш для действия. - person Nejat; 22.11.2014
comment
Нет, полностью закомментировал часть действия, все еще не работает. Я проклят.. :( - person SexyBeast; 22.11.2014
comment
Ваш виджет должен быть сфокусирован, чтобы ярлык мог действовать. У вашего виджета есть фокус, когда вы нажимаете клавишу? - person Nejat; 22.11.2014
comment
Я не писал никакого кода для установки фокуса на виджет при явном нажатии. Нужно ли мне это делать? Я думал, что нажатие на виджет автоматически устанавливает фокус на виджете. Как мне это сделать? - person SexyBeast; 22.11.2014
comment
Если вы нажмете на виджет, он получит фокус. - person Nejat; 22.11.2014
comment
Да, у меня все в порядке, прежде чем я попробую ярлык. Все равно не работает.. - person SexyBeast; 22.11.2014