Как создать поле горячих клавиш в Qt
Как проще всего разрешить пользователю вводить комбинацию клавиш?
Он будет в основном выглядеть как поле QLineEdit
, но он будет принимать только комбинации клавиш.
Например, в Qt Designer уже есть что-то, где вы можете назначить ярлык для действия. Мое требование точно такое же. TIA
3 ответа:
Начиная с Qt 5.2, вы можете использовать QKeySequenceEdit для этой цели
Qt Creator на самом деле является открытым исходным кодом. Поэтому, если вы хотите точно знать, что делает этот диалог, Вы можете заглянуть внутрь и посмотреть, как они это делают.
Осуществления "изменить действие" диалог в библиотеке под названием "QtTools". Вот заголовок и исходный файл:
...но это выглядит немного косвенным, и загружается на сам движок формы. Вам придется копать некоторое время, чтобы добраться до той части, где он фактически захватывает последовательность ключей. Случайный просмотр sans debugger предполагает, что он
QtKeySequenceEdit
реализован в этих файлах:
Я нашел несколько альтернативных способов для достижения своей цели. Мне нужно
QLineEdit
подобное поле ввода, которое будет захватывать комбинации клавиш, соответствующие следующим форматам:Самый простой способ сделать это-подклассировать
- Alt + Ctrl + Shift+X
- Alt + Ctrl+X
- Alt + Shift+X
- Ctrl + Shift+X
QLineEdit
и повторно реализовать функциюkeyPressEvent( QKeyEvent * event )
. Мой заголовочный файл и cpp-файл выглядят следующим образом. Любой может манипулировать логикой внутриkeyPressEvent
, чтобы удовлетворить их требование.QLineEditHotKey.h
#include <QLineEdit> class QLineEditHotKey: public QLineEdit { public: QLineEditHotKey( QWidget* pParent = NULL); ~QLineEditHotKey(){} protected: void keyPressEvent ( QKeyEvent * event ); };
QLineEditHotKey.cpp
QLineEditHotKey::QLineEditHotKey(QWidget* pParent):QLineEdit(pParent) { } void QLineEditHotKey::keyPressEvent( QKeyEvent * event ) { int keyInt = event->key(); Qt::Key key = static_cast<Qt::Key>(keyInt); // Handle unknown keys if( key == Qt::Key_unknown ) return; // Pressing Esc or Backspace will clear the content if( key == Qt::Key_Escape || key == Qt::Key_Backspace ) { setText(NULL); return; } // Empty means a special key like F5, Delete, Home etc if( event->text().isEmpty() ) return; // Checking for key combinations Qt::KeyboardModifiers modifiers = event->modifiers(); if(modifiers.testFlag(Qt::NoModifier)) return; if(modifiers.testFlag(Qt::ShiftModifier)) keyInt += Qt::SHIFT; if(modifiers.testFlag(Qt::ControlModifier)) keyInt += Qt::CTRL; if(modifiers.testFlag(Qt::AltModifier)) keyInt += Qt::ALT; setText( QKeySequence(keyInt).toString(QKeySequence::NativeText) ); }