Чтобы связать нажатия клавиш с действиями, QShortCut несет ответственность.
Класс QShortcut предоставляет способ подключения сочетаний клавиш к механизму сигналов и слотов Qt, чтобы объекты могли быть проинформированы о выполнении сочетания клавиш. Ярлык можно настроить так, чтобы он содержал все нажатия клавиш, необходимые для описания сочетания клавиш, включая состояния клавиш-модификаторов, таких как Shift, Ctrl и Alt.
В некоторых виджетах использование «&» перед символом автоматически создает мнемонику (ярлык) для этого символа, например. «Выход» создаст сочетание клавиш Alt+X (используйте «&&», чтобы отобразить фактический амперсанд). Виджет может потреблять и выполнять действие с заданным ярлыком. В X11 амперсанд отображаться не будет, а символ будет подчеркнут. В Windows ярлыки обычно не отображаются, пока пользователь не нажмет клавишу Alt, но пользователь может изменить эту настройку. На Mac ярлыки по умолчанию отключены. Вызовите qt_set_sequence_auto_mnemonic(), чтобы включить их. Однако, поскольку мнемонические сокращения не соответствуют рекомендациям Aqua, Qt не будет отображать подчеркнутый символ сокращения.
Для приложений, использующих меню, может быть удобнее использовать вспомогательные функции, предоставленные в классе QMenu, для назначения сочетаний клавиш элементам меню по мере их создания. В качестве альтернативы ярлыки могут быть связаны с другими типами действий в классе QAction.
Самый простой способ создать ярлык для определенного виджета — создать ярлык с последовательностью клавиш. Например:
shortcut = new QShortcut(QKeySequence(tr("Ctrl+O", "File|Open")),
parent);
Когда пользователь набирает последовательность клавиш для данного ярлыка, генерируется сигнал активированного() ярлыка. (В случае двусмысленности генерируется сигнал activeAmbiguously().) Ярлык "прослушивается" циклом обработки событий Qt, когда родительский виджет ярлыка получает события.
Небольшой образец testQDockWidgetShortCut.cc
:
#include <QtWidgets>
int main(int argc, char **argv)
{
qDebug() << "Qt Version:" << QT_VERSION_STR;
QApplication app(argc, argv);
// setup GUI
QMainWindow qMainWin;
QDockWidget qDockB("Panel B");
qDockB.setAllowedAreas(Qt::AllDockWidgetAreas);
qMainWin.addDockWidget(Qt::RightDockWidgetArea, &qDockB);
qDockB.hide();
// a window action to show dock on [A]
QAction qCmdShowDockB(&qMainWin);
qCmdShowDockB.setShortcut(QKeySequence("A"));
qMainWin.addAction(&qCmdShowDockB);
// a window action to hide dock on [B]
QAction qCmdHideDockB(&qMainWin);
qCmdHideDockB.setShortcut(QKeySequence("B"));
qMainWin.addAction(&qCmdHideDockB);
// a button to toggle dock B
QPushButton qBtn(
"Show/Hide Panel B\n"
"[A] ... Show Panel B\n"
"[B] ... Hide Panel B\n"
"[Ctrl+B] ... Toggle Panel B");
qBtn.setShortcut(QKeySequence("Ctrl+B"));
qMainWin.setCentralWidget(&qBtn);
qMainWin.show();
// install signal handlers
QAction *pQCmd = qDockB.toggleViewAction();
QObject::connect(&qBtn, &QPushButton::clicked, pQCmd, &QAction::trigger);
QObject::connect(&qCmdShowDockB, &QAction::triggered, &qDockB, &QDockWidget::show);
QObject::connect(&qCmdHideDockB, &QAction::triggered, &qDockB, &QDockWidget::hide);
// runtime loop
return app.exec();
}
Минимальный файл проекта testQDockWidgetShortCut.pro
:
SOURCES = testQDockWidgetShortCut.cc
QT += widgets
Скомпилировано и протестировано на cygwin64:
$ qmake-qt5 testQDockWidgetShortCut.pro
$ make && ./testQDockWidgetShortCut
g++ -c -fno-keep-inline-dllexport -D_GNU_SOURCE -pipe -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I. -isystem /usr/include/qt5 -isystem /usr/include/qt5/QtWidgets -isystem /usr/include/qt5/QtGui -isystem /usr/include/qt5/QtCore -I. -I/usr/lib/qt5/mkspecs/cygwin-g++ -o testQDockWidgetShortCut.o testQDockWidgetShortCut.cc
g++ -o testQDockWidgetShortCut.exe testQDockWidgetShortCut.o -lQt5Widgets -lQt5Gui -lQt5Core -lGL -lpthread
Qt Version: 5.9.4
![Снимок testQDockWidgetShortCut в X11 (с панелью B)](https:// i.stack.imgur.com/pFXBx.png)
Скомпилировано протестировано в VS2017 и Qt5.13.0:
Qt Version: 5.13.0
![Снимок testQDockWidgetShortCut в Windows 10 (с панелью B)](https:/ /i.stack.imgur.com/n7lKJ.png)
(В обоих случаях я протестировал все предлагаемые сочетания клавиш: A, B, Ctrl+B, а также как нажатие кнопки.)
Интересно, что OP утверждает
Но после небольшого исследования я не нашел подходящего решения.
Возможно, это было бы проще с термином «горячая клавиша» или «горячая клавиша». В противном случае ОП должен был что-то найти, например.
SO: Как установить сочетание клавиш с тремя клавишами с двумя модификаторами клавиш в Qt?
который я считал возможным дубликатом.
person
Scheff's Cat
schedule
23.07.2019
QDockWidget::toggleViewAction()
тоже может быть интересным. - person vahancho   schedule 23.07.2019