Создание собственных виджетов

При разработке приложений с графическим интерфейсом может возникнуть необходимость создать собственные виджеты - элементы управления с дополнительной функциональностью или иным дизайном, либо принципиально отличающиеся от стандартных виджетов. Например, при разработке какой-либо игры, игровое поле может быть целиком отдельным виджетом, изменяющим свой вид по ходу игры.

Для создания собственных виджетов необходимо создать класс, унаследованный от класса QWidget (для разработки виджета "с нуля"), или на базе какого-либо другого класса виджетов (QPushButton, QLineEdit, QSlider и т.д.), если хочется изменить функциональность стандартного класса. Мы рассмотрим процесс создания виджета на базе класса QWidget. Этот виджет может содержать внутри себя и другие виджеты и менеджеры компоновки.

При разработке виджета необходимо реализовать следующее:

  1. Как будет выглядеть виджет на экране?
  2. Как виджет будет реагировать на действия пользователя - нажатие клавиш или действия мыши.

Для этого необходимо реализовать обработчики событий - специальные методы (имеющие строго оговоренные названия), которые будут автоматически вызываться при возникновении событий. Все обработчики событий в качестве параметра принимают указатель на объект специального класса, производного от класса QEvent - эти объекты используются для передачи информации о возникших событиях. Например, в этих объектах может сохраняться информация о том, какая клавиша была нажата (класс QKeyEvent) или о том, в какой позиции находится курсор мыши (класс QMouseEvent) и т.д.

Подробней о системе событий в документации.

Примеры возможных обработчиков событий, которые могут быть определены, следующие:

Пример объявления собственного виджета с некоторыми обработчиками событий (файл widget.h):

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

class Widget : public QWidget
{
    Q_OBJECT
private:
    // Здесь можно объявить члены класса для хранения данных

public:
    Widget(QWidget *parent = 0);

    ~Widget(){}

    void paintEvent(QPaintEvent *event);
    void keyPressEvent(QKeyEvent *event);
    void keyReleaseEvent(QKeyEvent *event);

signals:
    // Здесь можно описать сигналы, отправляемые виджетом

public slots:
   // Здесь можно описать слоты виджета
};

#endif // COUNTER_H

Реализацию конструктора, деструктора, обработчиков событий, слотов и прочих методов необходимо сделать в файле widget.cpp.