Назначение клавиш быстрого доступа

Клавиши быстрого доступа (иногда их также называют "горячими" клавишами) позволяют установить фокус ввода с помощью нажатия специальной клавиши (например, <Alt> или <Ctrl>) и какой-либо дополнительной клавиши. Если после нажатия клавиш быстрого доступа в фокусе окажется кнопка (или пункт меню), то она будет нажата.

Чтобы задать клавиши быстрого доступа следует в тексте надписи указать символ & перед буквой. В этом случае буква, перед которой указан символ &, будет подчеркнута, что является подсказкой пользователю. При одновременном нажатии клавиши <Alt> и подчеркнутой буквы компонент окажется в фокусе ввода. Некоторые компоненты, например, текстовое поле, не имеют надписи. Чтобы задать клавиши быстрого доступа для таких компонентов необходимо отдельно создать надпись и связать ее с компонентом с помощью метода setBuddy() из класса QLabel. Прототип метода:

void setBuddy(QWidget *buddy)

Если же создание надписи не представляется возможным, то можно воспользоваться следующими методами из класса QWidget:

  • grabShortcut() — регистрирует клавиши быстрого доступа и возвращает идентификатор, с помощью которого можно управлять ими в дальнейшем. Прототип метода:
int grabShortcut(const QKeySequence &key,
       Qt::ShortcutContext context = Qt::WindowShortcut)

В параметре key указывается экземпляр класса QKeySequence. Создать экземпляр этого класса для комбинации <Alt>+<E> можно, например, так:

QKeySequence::mnemonic("&e")
QKeySequence("Alt+e")
QKeySequence(Qt::ALT | Qt::Key_E)

В параметре context можно указать константы Qt::WidgetShortcut, Qt::WidgetWithChildrenShortcut, Qt::WindowShortcut (значение по умолчанию) и Qt::ApplicationShortcut ;

  • releaseShortcut() — удаляет комбинацию с идентификатором id. Прототип метода:
void releaseShortcut(int id)
  • setShortcutEnabled() — если в качестве параметра enable указано значение true (значение по умолчанию), то клавиши быстрого доступа с идентификатором id разрешены. Значение false запрещает использование клавиш быстрого доступа. Прототип метода:
void setShortcutEnabled(int id, bool enable = true)

При нажатии клавиш быстрого доступа генерируется событие QEvent::Shortcut, которое можно обработать в методе event(). Через параметр доступен экземпляр класса QShortcutEvent, который содержит следующие методы:

  • shortcutId() — возвращает идентификатор комбинации клавиш. Прототип метода:
int shortcutId() const
  • isAmbiguous() — возвращает значение true, если событие отправлено сразу нескольким компонентам, и false — в противном случае. Прототип метода:
bool isAmbiguous() const
  • key() — возвращает экземпляр класса QKeySequence. Прототип метода:
const QKeySequence &key() const

Создадим окно с надписью, двумя однострочными текстовыми полями и кнопкой. Для первого текстового поля назначим комбинацию клавиш (<Alt>+<В>) через надпись, а для второго поля (<Alt>+<Е>) — с помощью метода grabShortcut(). Для кнопки назначим комбинацию клавиш (<Alt>+<У>) обычным образом через надпись на кнопке. Содержимое файла mylineedit.h приведено в листинге 4.35, файла mylineedit.cpp — в листинге 4.36, файла widget.h — в листинге 4.37, файла widget.cpp — в листинге 4.38, а файла main.cpp — в листинге 4.39.

Листинг 4.35. Содержимое файла mylineedit.h

#ifndef MYLINEEDIT_H
#define MYLINEEDIT_H

#include <QWidget>
#include <QLineEdit>
#include <QShortcutEvent>

class MyLineEdit : public QLineEdit
{
   Q_OBJECT
public:
   MyLineEdit(QWidget *parent=nullptr);
protected:
   bool event(QEvent *e) override;
public:
   int id;
};

#endif // MYLINEEDIT_H

Листинг 4.36. Содержимое файла mylineedit.cpp

#include "mylineedit.h"

MyLineEdit::MyLineEdit(QWidget *parent)
   : QLineEdit(parent), id(-1)
{}

bool MyLineEdit::event(QEvent *e)
{
   if (e->type() == QEvent::Shortcut) {
      QShortcutEvent *s = static_cast<QShortcutEvent*>(e);
      if (id == s->shortcutId()) {
         setFocus(Qt::ShortcutFocusReason);
         return true;
      }
   }
   return QLineEdit::event(e);
}

Листинг 4.37. Содержимое файла widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QApplication>
#include <QWidget>
#include <QLabel>
#include <QPushButton>
#include <QVBoxLayout>
#include "mylineedit.h"

class Widget : public QWidget
{
   Q_OBJECT

public:
   Widget(QWidget *parent=nullptr);
   ~Widget();
private slots:
   void on_btn1_clicked();
private:
   QLabel *label;
   QLineEdit *line1;
   MyLineEdit *line2;
   QPushButton *btn1;
   QVBoxLayout *vbox;
};
#endif // WIDGET_H

Листинг 4.38. Содержимое файла widget.cpp

#include "widget.h"

Widget::Widget(QWidget *parent)
   : QWidget(parent)
{
   label = new QLabel("Устано&вить фокус на поле 1");
   line1 = new QLineEdit();
   label->setBuddy(line1);
   line2 = new MyLineEdit();
   line2->id = line2->grabShortcut(QKeySequence::mnemonic("&е"));
   btn1 = new QPushButton("&Убрать фокус с поля 1");
   vbox = new QVBoxLayout();
   vbox->addWidget(label);
   vbox->addWidget(line1);
   vbox->addWidget(line2);
   vbox->addWidget(btn1);
   setLayout(vbox);
   QObject::connect(btn1, SIGNAL(clicked()),
                    this, SLOT(on_btn1_clicked()));
}

void Widget::on_btn1_clicked()
{
   line1->clearFocus();
}

Widget::~Widget() {}

Листинг 4.39. Содержимое файла main.cpp

#include "widget.h"

int main(int argc, char *argv[])
{
   QApplication app(argc, argv);
   Widget window;
   window.setWindowTitle("Назначение клавиш быстрого доступа");
   window.resize(350, 150);
   window.show();
   return app.exec();
}

Помимо рассмотренных способов для назначения клавиш быстрого доступа можно воспользоваться классом QShortcut. В этом случае назначение клавиш для первого текстового поля будет выглядеть так:

// widget.h
QShortcut *shortcut;
// widget.cpp
line1 = new QLineEdit();
shortcut = new QShortcut(QKeySequence::mnemonic("&ф"), this);
shortcut->setContext(Qt::WindowShortcut);
QObject::connect(shortcut, SIGNAL(activated()),
                 line1, SLOT(setFocus()));

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

// widget.h
QAction *action;
// widget.cpp
line1 = new QLineEdit();
action = new QAction(this);
action->setShortcut(QKeySequence::mnemonic("&ф"));
QObject::connect(action, SIGNAL(triggered()),
                 line1, SLOT(setFocus()));
addAction(action);

Учебник C++ (Qt Creator и MinGW)
Учебник C++ (Qt Creator и MinGW) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов