Слот 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 }