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

Функция refreshPixmap перерисовывает график на внеэкранной пиксельной карте и обновляет изображение на экране. Мы изменяем размеры пиксельной карты на размеры виджета и заполняем ее цветом стертого виджета. Этот цвет является «темным» компонентом палитры из-за вызова функции setBackgroundRole в конструкторе Plotter. Если фон задается неоднородной кистью, в функции QPixmap::fill необходимо указать смещение в виджете, где будет заканчиваться пиксельная карта, чтобы правильно выравнить образец кисти. Здесь пиксельная карта соответствует всему виджету, поэтому мы задаем позицию (0, 0).

Затем мы создаем QPainter для вычерчивания диаграммы на пиксельной карте. Вызов initFrom устанавливает в рисовальщике перо, фон и шрифт такими же, как для виджета Plotter. Затем мы вызываем функции drawGrid и drawCurves, которые рисуют диаграмму. В конце мы вызываем функцию update для инициации события рисования всего виджета. Пиксельная карта копируется в виджет функцией paintEvent.

199 void Plotter::drawGrid(QPainter *painter)

200 {

201 QRect rect(Margin, Margin,

202 width - 2 * Margin, height - 2 * Margin);

203 if (!rect.isValid)

204 return;

205 PlotSettings settings = zoomStack[curZoom];

206 QPen quiteDark = palette.dark.color.light;

207 QPen light = palette.light.color;

208 for (int i = 0; i <= settings.numXTicks; ++i) {

209 int x = rect.left + (i * (rect.width - 1)

210 / settings.numXTicks);

211 double label = settings.minX + (i * settings.spanX

212 / settings.numXTicks);

213 painter->setPen(quiteDark);

214 painter->drawLine(x, rect.top, x, rect.bottom);

215 painter->setPen(light);

216 painter->drawLine(x, rect.bottom, x, rect.bottom + 5);

217 painter->drawText(x - 50, rect.bottom + 5, 100, 15,

218 Qt::AlignHCenter | Qt::AlignTop,

219 QString::number(label));

220 }

221 for (int j = 0; j <= settings.numVTicks; ++j) {

222 int y = rect.bottom - (j * (rect.height - 1)

223 / settings.numYTicks);

224 double label = settings.minY + (j * settings.spanY

225 / settings.numYTicks);

226 painter->setPen(quiteDark);

227 painter->drawLine(rect.left, у, rect.right, у);

228 painter->setPen(light);

229 painter->drawLine(rect.left - 5, y, rect.left, у);

230 painter->drawText(rect.left - Margin, у - 10, Margin - 5, 20,

231 Qt::AlignRight | Qt::AlignVCenter,

232 QString::number(label));

233 }

234 painter->drawRect(rect.adjusted(0, 0, -1, -1));

235 }

Функция drawGrid чертит сетку под кривыми и осями. Область для вычерчивания сетки задается прямоугольником rect. Если размеры виджета недостаточны для размещения графика, мы сразу возвращаем управление.

Первый цикл for проводит вертикальные линии сетки и отметки по оси x. Второй цикл for выводит горизонтальные линии и отметки по оси y. В конце мы рисуем прямоугольники по окаймляющей кромке. Функция drawText применяется для вывода числовых значений для отметок обеиз осей.

Вызовы функции drawText имеют следующий формат:

painter.drawText(x, у, ширина, высота, смещение, текст);

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