Как создать поле горячих клавиш в Qt


Как проще всего разрешить пользователю вводить комбинацию клавиш? Он будет в основном выглядеть как поле QLineEdit, но он будет принимать только комбинации клавиш.

Например, в Qt Designer уже есть что-то, где вы можете назначить ярлык для действия. Мое требование точно такое же. TIA

Изменить действие-назначение ярлыка

3 2

3 ответа:

Начиная с Qt 5.2, вы можете использовать QKeySequenceEdit для этой цели

Qt Creator на самом деле является открытым исходным кодом. Поэтому, если вы хотите точно знать, что делает этот диалог, Вы можете заглянуть внутрь и посмотреть, как они это делают.

Осуществления "изменить действие" диалог в библиотеке под названием "QtTools". Вот заголовок и исходный файл:

Actioneditor_p. h

Actioneditor.cpp

...но это выглядит немного косвенным, и загружается на сам движок формы. Вам придется копать некоторое время, чтобы добраться до той части, где он фактически захватывает последовательность ключей. Случайный просмотр sans debugger предполагает, что он QtKeySequenceEdit реализован в этих файлах:

Qtpropertybrowserutils_p. h

Qtpropertybrowserutils.cpp

Я нашел несколько альтернативных способов для достижения своей цели. Мне нужно 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) );
}

Этот вопрос был очень полезен в поиске решения.