На этом шаге рассмотрим создание собственных стилей в Qt.
Каждый виджет имеет указатель на объект стиля QStyle. Его можно получить вызовом метода QWidget::style(). Виджеты вызывают методы QStyle в различных ситуациях: при наступлении событий мыши, при событиях перерисовки, при вызове метода sizeHint() менеджером компоновки и т. д.
Собственные стили обычно создаются наследованием встроенного стиля Qt и перезаписью некоторых методов. Поэтому прежде чем реализовывать свой собственный стиль, нужно решить, какой из классов стилей унаследовать. Можно унаследовать и сам класс QStyle, переопределив необходимые методы. Но это потребует гораздо больше усилий, чем при наследовании класса, уже обладающего необходимыми свойствами. Воспользовавшись подобным классом, вам потребуется перезаписать лишь несколько методов, в которых будут реализованы все необходимые отличия.
Класс QStyle — это абстрактный класс, который является интерфейсом для реализации стилей. Для рисования элементов управления вам, в основном, придется иметь дело со следующими методами, определяемыми классом QStyle:
Каждый из указанных ранее методов для рисования принимает специальный идентификатор, который сообщает о том, что должно быть сделано. Для передачи дополнительной информации предусмотрен параметр QStyleOption. Все данные этого класса определены как public, т. е. можно напрямую обращаться к атрибуту:
В большинстве случаев вам не понадобится больше информации, чем предоставляется классом QStyleOption. Но если вы создаете не только свой собственный стиль, но и свои собственные виджеты, то, унаследовав класс QStyleOption, можете передавать любую дополнительную информацию, необходимую для ваших виджетов. Добавьте в унаследованный класс необходимые атрибуты и не забудьте позаботиться о типе и версии. Например:
class MyStyleOptionProgress : public QStyleOption { enum {Type = SO_ProgressBar}; enum {Version = 1}; int nMaximum; int nMinimum; int nProgress; QString str; Qt::Alignment textAlignment; };
На следующем шаге рассмотрим методы рисования простых элементов управления в Qt.