Жасмин Бланшет

Книги → QT 4: программирование GUI на С++ → Двойная буферизация

Если Plotter получает фокус, вывод фокусного прямоугольника выполняется с использованием функции drawPrimitive(), задающей стиль виджета, с передачей QStyle::PE_FrameFocusRect в качестве первого аргумента и объекта QStyleOptionFocusRect в качестве второго аргумента. Опции рисования фокусного прямоугольника наследуются от виджета Plotter (путем вызова initFrom()). Цвет фона должен задаваться явно.

Если при рисовании требуется использовать текущий стиль, мы можем либо непосредственно вызвать функцию QStyle, например

style()->drawPrimitive(QStyle::PE_FrameFocusRect, &option, &painter, this);

либо использовать QStylePainter вместо обычного QPainter (как мы это делали в Plotter), что делает рисование более удобным.

Функция QWidget::style() возвращает стиль, который будет использован для рисования виджета. В Qt стиль виджета является подклассом QStyle. Встроенными являются стили QWindowsStyle, QWindowsXPStyle, QMotifStyle, QCDEStyle, QMacStyle и OPlastiqueStyle. Все эти стили переопределяют виртуальные функции класса QStyle, чтобы обеспечить корректное рисование в стиле имитируемой платформы. Функция drawPrimitive() класса QStylePainter вызывает функцию класса QStyle с тем именем, которое используется для рисования таких «примитивов», как панели, кнопки и фокусные прямоугольники. Обычно все виджеты используют стиль приложения (QApplication::style()), но в любом виджете стиль может переопределяться с помощью функции QWidget::setStyle().

Путем создания подкласса QStyle можно определить пользовательский стиль. Это можно делать с целью придания отличительных стилевых особенностей одному какому-то приложению или группе из нескольких приложений. Хотя рекомендуется в целом придерживаться «родного» стиля выбранной платформы, Qt предлагает достаточно гибкие средства по управлению стилем тем, у кого большая фантазия.

Встроенные в Qt виджеты при рисовании самих себя почти полностью зависят от QStyle. Именно поэтому они выглядят естественно на всех платформах, поддерживаемых Qt. Пользовательские виджеты могут создаваться чувствительными к стилю либо путем применения QStyle (через QStylePainter) при рисовании самих себя, либо используя встроенные виджеты Qt в качестве дочерних. В Plotter мы используем оба подхода: фокусный прямоугольник рисуется с применением QStyle, а кнопки Zoom In и Zoom Out являются встроенными виджетами Qt.

085 void Plotter::resizeEvent(QResizeEvent * /* event */ )

086 {

087 int x= width() - (zoomInButton->width()

088 + zoomOutButton->width() + 10);

089 zoomInButton->move(x, 5);

090 zoomOutButton->move(x + zoomInButton->width() + 5, 5);

091 refreshPixmap();

092 }

При всяком изменении размера виджета Plotter Qt генерирует событие «изменение размера». Здесь мы переопределяем функцию resizeEvent() для размещения кнопок Zoom In и Zoom Out в верхнем правом углу виджета Plotter.

Мы располагаем кнопки Zoom In и Zoom Out рядом, отделяя их 5-пиксельным промежутком от верхнего и правого краев родительского виджета.

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

← предыдущая следующая →

Страницы раздела: 1 2 3 4 5 6 7 8 9 10 11 12 13

Публикация компанией Dropbox кода Zulip – средства общения для IT-разработчиков

20.11.2015
Одной из одобрительно встреченных программистами инициатив, реализующихся в рамках акции Hack Week, стала публикация исходного кода приложения Zulip – веб-приложения для общения между собой разработчиков в сфере IT-технологий.

Объединение ОС Android и Chrome

17.11.2015
Слухи об объединении двух крупнейших ОС компании Google, Android и Chrome, гуляют по Интернету уже более 5 лет, но до сих пор этого не случилось, хотя очевидно, что с течением времени эти ОС становятся всё более похожими: так, в последнее время появилось немало Android-устройств, к которым прилагаются клавиатуры, а Chrome OS «научилась» работать с сенсорными экранами.

Конференция Linux Piter 2015

15.11.2015
Уже почти через неделю в Санкт-Петербурге впервые в истории пройдёт конференция, посвящённая проблемам свободного программного обеспечения – Linux Piter 2015.