Чтение онлайн

на главную - закладки

Жанры

QT 4: программирование GUI на С++

Саммерфилд Марк

Шрифт:

Слот увеличивает на единицу значение curZoom для перехода на один уровень вглубь стека масштабов изображения, включает или выключает кнопку Zoom In взависимости от возможности дальнейшего увеличения изображения и включает и показывает кнопку Zoom Out. И вновь мы вызываем refreshPixmap для использования построителем графиков настроек самого последнего масштаба изображения.

051 void Plotter::setCurveData(int id, const QVector<QPointF> &data)

052 {

053 curveMap[id] = data;

054 refreshPixmap;

055 }

Функция setCurveData устанавливает

данные для кривой с заданным идентификатором. Если в curveMap уже имеется кривая с таким идентификатором, ее данные заменяются новыми значениями; в противном случае просто добавляется новая кривая. Переменная—член curveMap имеет тип QMap<int, QVector<QPointF> >.

056 void Plotter::clearCurve(int id)

057 {

058 curveMap.remove(id);

059 refreshPixmap;

060 }

Функция clearCurve удаляет заданную кривую из curveMap.

061 QSize Plotter::minimumSizeHint const

062 {

063 return QSize(6 * Margin, 4 * Margin);

064 }

Функция minimumSizeHint напоминает sizeHint; в то время как функция sizeHint устанавливает идеальный размер виджета, minimumSizeHint задает идеальный минимальный размер виджета. Менеджер компоновки никогда не станет задавать виджету размеры ниже идеального минимального размера.

Мы возвращаем значение 300 × 200 (поскольку Margin равен 50) для того, чтобы можно было разместить окаймляющую кромку по всем четырем сторонам и обеспечить некоторое пространство для самого графика. При меньших размерах считается, что график будет слишком мал и бесполезен.

065 QSize Plotter::sizeHint const

066 {

067 return QSize(12 * Margin, 8 * Margin);

068 }

В функции sizeHint мы возвращаем «идеальный» размер относительно константы Margin, причем горизонтальный и вертикальный компоненты этого размера составляют ту же самую приятную для глаза пропорцию 3:2, которую мы использовали для minimumSizeHint.

Мы завершаем рассмотрение открытых функций и слотов построителя графиков Plotter. Теперь давайте рассмотрим защищенные обработчики событий.

069 void Plotter::paintEvent(QPaintEvent * /* event */)

070 {

071 QStylePainter painter(this);

072 painter.drawPixmap(0, 0, pixmap);

073 if (rubberBandIsShown) {

074 painter.setPen(palette.light.color);

075 painter.drawRect(rubberBandRect.normalized

076 .adjusted(0, 0, -1, -1));

077 }

078 if (hasFocus) {

079 QStyleOptionFocusRect option;

080 option.initFrom(this);

081 option.backgroundColor = palette.dark.color;

082 painter.drawPrimitive(QStyle::PE_FrameFocusRect, option);

083 }

084 }

Обычно все действия по рисованию выполняются функцией paintEvent. Но в данном случае вся диаграмма уже нарисована

функцией refreshPixmap, и поэтому мы можем воспроизвести весь график, просто копируя пиксельную карту в виджет в позицию (0, 0).

Если резиновая лента должна быть видимой, мы рисуем ее поверх графика. Мы используем светлый («light») компонент из текущей цветовой группы виджета в качестве цвета пера для обеспечения хорошего контраста с темным («dark») фоном. Следует отметить, что мы рисуем непосредственно на виджете, оставляя нетронутым внеэкранное изображение на пиксельной карте. Вызов QRect::normalized гарантирует наличие положительных значений ширины и высоты прямоугольника резиновой ленты (выполняя обмен значений координат при необходимости), а вызов adjusted уменьшает размер прямоугольника на один пиксель, позволяя вывести на экран его контур шириной в один пиксель.

Если 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.

Поделиться:
Популярные книги

Газлайтер. Том 8

Володин Григорий
8. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 8

На Ларэде

Кронос Александр
3. Лэрн
Фантастика:
фэнтези
героическая фантастика
стимпанк
5.00
рейтинг книги
На Ларэде

Охота на попаданку. Бракованная жена

Герр Ольга
Любовные романы:
любовно-фантастические романы
5.60
рейтинг книги
Охота на попаданку. Бракованная жена

Кай из рода красных драконов

Бэд Кристиан
1. Красная кость
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Кай из рода красных драконов

Хозяйка Проклятой Пустоши. Книга 2

Белецкая Наталья
2. Хозяйка Проклятой Пустоши
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Хозяйка Проклятой Пустоши. Книга 2

Безумный Макс. Поручик Империи

Ланцов Михаил Алексеевич
1. Безумный Макс
Фантастика:
героическая фантастика
альтернативная история
7.64
рейтинг книги
Безумный Макс. Поручик Империи

Потусторонний. Книга 2

Погуляй Юрий Александрович
2. Господин Артемьев
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Потусторонний. Книга 2

Чапаев и пустота

Пелевин Виктор Олегович
Проза:
современная проза
8.39
рейтинг книги
Чапаев и пустота

Солнечный корт

Сакавич Нора
4. Все ради игры
Фантастика:
зарубежная фантастика
5.00
рейтинг книги
Солнечный корт

Лютая

Шёпот Светлана Богдановна
Любовные романы:
любовно-фантастические романы
6.40
рейтинг книги
Лютая

Ведьмак (большой сборник)

Сапковский Анджей
Ведьмак
Фантастика:
фэнтези
9.29
рейтинг книги
Ведьмак (большой сборник)

Наследие Маозари 4

Панежин Евгений
4. Наследие Маозари
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Наследие Маозари 4

Ученик

Губарев Алексей
1. Тай Фун
Фантастика:
фэнтези
5.00
рейтинг книги
Ученик

Начальник милиции. Книга 5

Дамиров Рафаэль
5. Начальник милиции
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Начальник милиции. Книга 5