Читаем QT 4: программирование GUI на С++ полностью

Слот 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 &data)

052 {

053 curveMap[id] = data;

054 refreshPixmap;

055 }

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

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 }

Перейти на страницу:
Нет соединения с сервером, попробуйте зайти чуть позже