БлогNot. QT: обработка нажатий клавиш

Помощь дата->рейтинг Поиск Почта RSS канал Статистика nickolay.info Домой

QT: обработка нажатий клавиш

Казалось бы, обычный вопрос... но вызвал сегодня вопросы, раз так, кину для памяти пример.

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

На самом деле, в QWidget есть ещё много чего, просто Qt - не Studio или Builder, не всегда нужное событие "находится в списке":

У виджетов, которые разрешают ввод с клавиатуры, нужно переопределить немного больше функций:

Вам может потребоваться переопределить несколько менее распространенных обработчиков событий:

Ну есть ещё всякая экзотика, которую пропустим.

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

Файл main.cpp
#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.setWindowTitle("KeyPress Demo");
    w.resize(300,100);
    w.setFixedSize(300,100);
    w.show();
    return a.exec();
}
Файл widget.h
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QGridLayout>
#include <QLabel>
#include <QKeyEvent>
#include <Qt>

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = 0);

private:
    QGridLayout *myLayout;
    QLabel *label1;
protected:
   virtual void keyPressEvent(QKeyEvent *event);
};

#endif // WIDGET_H
Файл widget.cpp
#include "widget.h"

Widget::Widget(QWidget *parent) :  QWidget(parent)
{
    label1 = new QLabel("");
    label1->setStyleSheet("font-size: 30px");
    myLayout = new QGridLayout;
    myLayout->addWidget(label1, 0, 0, 1, 1);
    setLayout(myLayout);
}

void Widget::keyPressEvent(QKeyEvent *event) {
 QString oldText = label1->text();
 int key=event->key();//event->key() - целочисленный код клавиши
 QString str = QString(QChar(key));
 if (key>=Qt::Key_0 && key<=Qt::Key_9) { //Цифровые клавиши 0..9
  label1->setText(oldText+str);
 }
 else if (key==Qt::Key_Backspace) { //BackSpace стирает символ
  label1->setText(oldText.left(oldText.length()-1));
 }
 else if (key==Qt::Key_Delete) { //Delete стирает всё
  label1->setText("");
 }
 else if (key==Qt::Key_Plus || key==Qt::Key_Minus) {
  if (oldText.startsWith("-") || oldText.startsWith("+"))
   oldText = oldText.right(oldText.length()-1);
  label1->setText(str+oldText);
 }
 oldText = label1->text();
 if (oldText.length()>=16) //ограничение на длину вводимой строки
  label1->setText(oldText.left(16));
}

 Скачать этот проект QT5 в архиве .zip, развернуть, не создавая новой папки (2 Кб)

Этот пример лишь иллюстрирует обработку события, для фильтрации ввода в текстовые поля лучше применять валидаторы.


теги: c++ памятка qt

комментарии (0)

18.04.2015, 22:06; рейтинг: 22254

  свежие записипоиск по блогукомментироватьстатистика

Наверх Яндекс.Метрика
© PerS
вход