Qt обробка натискань клавіш

QT: обробка натискань клавіш

Здавалося б, просте запитання. але викликав сьогодні питання. раз так, кину для пам'яті приклад.

В принципі, досить в своєму додатку (віджеті) успадкувати від QWidget і реалізувати в коді метод keyPressEvent - обробку подій від клавіатури.

Насправді, в QWidget є ще багато чого, просто Qt - НЕ Studio або Builder, не завжди потрібну подію "знаходиться в списку":

  • paintEvent () виникає, коли є необхідність в перемальовуванні віджета. Будь-віджет, що відображає призначений для користувача контент, повинен його реалізувати такий обробник. Перемальовування, що використовує QPainter. може відбуватися тільки в paintEvent () або у функціях, що викликаються з paintEvent ().
  • resizeEvent () виникає, коли віджет змінив розміри.
  • mousePressEvent () виникає, якщо натиснута кнопка миші в той момент, коли миша перебувала всередині віджета, або якщо він захоплений мишкою за допомогою grabMouse (). Натискання кнопки миші без відпускання - це фактично те ж саме, що і виклик grabMouse ().
  • mouseReleaseEvent () виникає, коли кнопка миші відпускається. Віджет отримає подія відпускання кнопки миші, якщо до цього він отримав подія натискання кнопки миші. Це означає, що Услі користувач натиснув кнопку миші всередині вашого віджета, потім перемістив мишку куди-небудь і там відпустив кнопку, то ваш віджет отримає подія відпускання миші. Існує один виняток: якщо при натисканні кнопки з'являється спливаюче меню, воно негайно перехопить події від миші.
  • mouseDoubleClickEvent () виникає, коли користувач двічі клацне по віджету. Якщо користувач використовував подвійне клацання, віджет отримає подія натискання кнопки, подія відпускання кнопки і на закінчення подія про другому клацанні (кілька подій про переміщення миші можуть прийти, якщо користувач під час операції не втримав мишку на місці). Неможливо відрізнити одинарний клацання від подвійного, поки не відбудеться другий клацання. Це одна з причин, чому багато книги про розробку користувальницького інтерфейсу рекомендують, щоб подвійне клацання був краще, ніж одинарний, при перемиканні між різними операціями.
У віджетів, які дозволяють введення з клавіатури, потрібно перевизначити трохи більше функцій:
  • keyPressEvent () виникає, коли клавіша була натиснута, і ще раз, коли клавіша утримується для автоповтора. За допомогою клавіші Tab і поєднання Shift + Tab передається віджету тільки якщо він не використовує механізм зміни фокусу. Для перехоплення натискання цих клавіш ви повинні перевизначити QWidget :: event ().
  • focusInEvent () виникає, коли віджет отримує фокус введення з клавіатури (якщо ви викликали setFocusPolicy ()). Добре написані віджети показують, що вони отримали фокус введення з клавіатури в ясній і простій формі.
  • focusOutEvent () виникає, коли віджет втрачає фокус введення з клавіатури.
Вам може знадобитися перевизначити кілька менш поширених обробників подій:
  • mouseMoveEvent () виникає, коли мишка переміщається з натиснутою кнопкою. Це може бути корисно при виконанні операції перетягування. Якщо ви викликали setMouseTracking (true). ви будете отримувати події переміщення миші, навіть якщо її кнопка не було натиснуто.
  • keyReleaseEvent () виникає, коли клавіша відпущена і поки вона натиснута (якщо це клавіша з автоповтор). В цьому випадку віджет отримає дві події про відпуску і натисканні клавіші для кожного повтору. За допомогою клавіші Tab і поєднання Shift + Tab передається віджету тільки якщо він не використовує механізм зміни фокусу. Для перехоплення натискання цих клавіш ви повинні перевизначити QWidget :: event ().
  • wheelEvent () виникає, якщо користувач обертає коліщатко миші в той час, як віджет отримав фокус.
  • enterEvent () виникає, коли мишка потрапляє в простір, займане віджетом на екрані (виключаючи простір, зайняте дочірніми віджетами).
  • leaveEvent () виникає, коли мишка залишає простір віджета. Коли мишка переходить в простір, займане дочірнім віджетом, подія leaveEvent () не відбувається.
  • moveEvent () виникає, коли віджет переміщується щодо свого батька.
  • closeEvent () виникає, коли користувач закриває віджет (або коли викликається функція close ()).

Ну є ще всяка екзотика, яку пропустимо.

А ось приклад. Віджет має мітку QLabel на весь свій вікно, а ми можемо вводити в неї з клавіатури ціле число, ставити перед ним знак "-" або "+", прати останній символ натисканням BackSpace або прати все натисканням Delete. Максимальна довжина введення обмежена 16 символами.

файл main.cpp
файл widget.h
файл widget.cpp

Схожі статті