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

ЖАНРЫ

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

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

Шрифт:

Вызов в конце функции setPlotSettings завершает инициализацию.

022 void Plotter::setPlotSettings(const PlotSettings &settings)

023 {

024 zoomStack.clear;

025 zoomStack.append(settings);

026 curZoom = 0;

027 zoomInButton->hide;

028 zoomOutButton->hide;

029 refreshPixmap;

030 }

Функция setPlotSettings устанавливает настройки PlotSettings для отображения

графика. Ее вызывает конструктор Plotter, и она может также вызываться пользователями класса. Построитель кривых начинает работу с принятого по умолчанию масштаба изображения. Каждый раз, когда пользователь увеличивает изображение, создается новый экземпляр PlotSettings, который затем помещается в стек масштабов изображения. Этот стек масштабов изображений представлен двумя переменными—членами:

zoomStack содержит настройки для различных масштабов изображения в объекте QVector<PlotSettings>;

curZoom содержит индекс текущего элемента PlotSettings стека zoomStack.

После вызова функции setPlotSettings в стеке масштабов изображений будет находиться только один элемент, а кнопки Zoom In и Zoom Out будут скрыты. Эти кнопки не будут видны на экране до тех пор, пока мы не вызовем для них функцию show в слотах zoomIn и zoomOut. (Обычно для показа всех дочерних виджетов достаточно вызвать функцию show для виджета верхнего уровня. Но когда мы явным образом вызываем для дочернего виджета функцию hide, этот виджет будет скрыт до вызова для него функции show.)

Вызов функции refreshPixmap необходим для обновления изображения на экране. Обычно мы вызываем функцию update, но здесь мы поступаем немного по-другому, потому что хотим иметь пиксельную карту QPixmap постоянно в обновленном состоянии. После регенерации пиксельной карты функция refreshPixmap вызывает update для помещения пиксельной карты на виджет.

031 void Plotter::zoomOut

032 {

033 if (curZoom > 0) {

034 --curZoom;

035 zoomOutButton->setEnabled(curZoom > 0);

036 zoomInButton->setEnabled(true);

037 zoomInButton->show;

038 refreshPixmap;

039 }

040 }

Слот zoomOut уменьшает масштаб диаграммы, если она отображена крупным планом. Он уменьшает на единицу текущий масштаб изображения и включает или выключает кнопку ZoomOut, в зависимости от возможности дальнейшего уменьшения диаграммы. Кнопка Zoom In включается и отображается на экране, а изображение диаграммы обновляется посредством вызова функции refreshPixmap.

041 void Plotter::zoomIn

042 {

043 zoomInButton->setEnabled(curZoom< zoomStack.count - 1);

044 if (curZoom < zoomStack.count - 1) {

045 ++curZoom;

046 zoomOutButton->setEnabled(true);

047 zoomOutButton->show;

048 refreshPixmap;

049 }

050 }

Если пользователь

сначала увеличил изображение, а затем вновь его уменьшил, настройки PlotSettings для следующего масштаба изображения уже будут в стеке масштабов изображения, и мы можем увеличить его. (В противном случае можно все же увеличить изображение при помощи резиновой ленты.)

Слот увеличивает на единицу значение 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

Поделиться с друзьями: