# 4.2. Создание собственного элемента просмотра

Теперь, когда вы получили общее представление о предоставляемых возможностях, можно заметить, что для большинства задач уже существуют элементы, которые могут быть использованы самостоятельно или объединены с другими. KMail и сам KDevelop - хорошие примеры использования библиотечных элементов для отображения данных.

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

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

Повторим для полноты подлежащие переопределению методы:

a) События клавиатуры -- клавиши TAB и Shift-TAB :

изменяет фокус ввода с клавиатуры с текущего элемента на следующий элемент в порядке изменения фокусов. Фокус может быть установлен для элемента вызовом `setFocusPolicy()`. Изменение фокуса обрабатывается следующими обработчиками событий: :

- `virtual void focusInEvent ( QFocusEvent * )`

- `virtual void focusOutEvent ( QFocusEvent * )`

b) другой ввод с клавиатуры:

- `virtual void keyPressEvent ( QKeyEvent * )`

- `virtual void keyReleaseEvent ( QKeyEvent * )`

c) перемещение мыши:

- `virtual void mouseMoveEvent ( QMouseEvent * )`

- `virtual void enterEvent ( QEvent * )`

- `virtual void leaveEvent ( QEvent * )`

d) нажатие кнопок мыши:

- `virtual void mousePressEvent ( QMouseEvent * )`

- `virtual void mouseReleaseEvent ( QMouseEvent * )`

- `virtual void mouseDoubleClickEvent ( QMouseEvent * )`

e) события окна, содержащего элемент:

- `virtual void moveEvent ( QMoveEvent * )`

- `virtual void resizeEvent ( QResizeEvent * )`

- `virtual void closeEvent ( QCloseEvent * )`

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

1. объявляйте ваши виртуальные методы как virtual в секции protected. Это позволит переиспользовать код при наследовании и обеспечит логическую целостность;

2. не включайте в текст программы, реализующей обработку событий, непосредственно (hard-code) ничего такого, что может конфигурироваться. Это в основном относится к событиям клавиатуры, которые реализуются через горячие клавиши и состоят в вызове функций. Данное замечание касается даже текстовой обработки! (Вообразите себе, что множество пользователей привыкли к своему любимому текстовому редактору. Если горячие клавиши конфигурируются, то они смогут использовать привычные для себя настройки);

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