Вход/Регистрация
QT 4: программирование GUI на С++
вернуться

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

Шрифт:

Наиболее распространенное применение колесико мышки получило для продвижения по полосе прокрутки. При использовании нами QScrollArea (рассматривается в главе 6 ) с полосами прокрутки QScrollArea автоматически управляет событиями колесика мышки и нам не приходится самим переопределять функцию wheelEvent.

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

181 void Plotter::updateRubberBandRegion

182 {

183 QRect rect = rubberBandRect.normalized;

184 update(rect.left, rect.top, rect.width, 1);

185 update(rect.left, rect.top, 1, rect.height);

186 update(rect.left, rect.bottom, rect.width, 1);

187 update(rect.right, rect.top, 1, rect.height);

188 }

Функция updateRubberBand вызывается из mousePressEvent, mouseMoveEvent и mouseReleaseEvent для стирания или перерисовки резиновой ленты. Она состоит из четырех вызовов функции update, которая устанавливает в очередь событие рисования для четырех небольших прямоугольных областей, составляющих изображение резиновой ленты (две вертикальные и две горизонтальные линии). Для рисования резиновой ленты в Qt предусмотрен класс QRubberBand, однако в нашем случае ручное кодирование обеспечило более тонкое управление.

189 void Plotter::refreshPixmap

190 {

191 pixmap = QPixmap(size);

192 pixmap.fill(this, 0, 0);

193 QPainter painter(&pixmap);

194 painter.initFrom(this);

195 drawGrid(&painter);

196 drawCurves(&painter);

197 update;

198 }

Функция 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));

  • Читать дальше
  • 1
  • ...
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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