Теперь, когда вы получили общее представление о предоставляемых возможностях, можно заметить, что для большинства задач уже существуют элементы, которые могут быть использованы самостоятельно или объединены с другими. 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 * )
Когда вы переопределяете эти функции, вы должны учесть некоторые моменты, чтобы избежать ошибок, которые сделают невозможным изменение поведения элементов в дальнейшем:
объявляйте ваши виртуальные методы как virtual в секции protected. Это позволит переиспользовать код при наследовании и обеспечит логическую целостность;
не включайте в текст программы, реализующей обработку событий, непосредственно (hard-code) ничего такого, что может конфигурироваться. Это в основном относится к событиям клавиатуры, которые реализуются через горячие клавиши и состоят в вызове функций. Данное замечание касается даже текстовой обработки! (Вообразите себе, что множество пользователей привыкли к своему любимому текстовому редактору. Если горячие клавиши конфигурируются, то они смогут использовать привычные для себя настройки);
передавайте сигналы, генерируемые при подсветке пунктов меню, главному элементу, чтобы обеспечить подсказки в строке статуса.