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

на главную

Жанры

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));

235 }

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

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

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

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

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

236 void Plotter::drawCurves(QPainter *painter)

237 {

238 static const QColor colorForIds[6] = {

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

Изгой Проклятого Клана. Том 2

Пламенев Владимир
2. Изгой
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Изгой Проклятого Клана. Том 2

Монстр из прошлого тысячелетия

Еслер Андрей
5. Соприкосновение миров
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Монстр из прошлого тысячелетия

Наследник

Назимов Константин Геннадьевич
3. Травник
Фантастика:
фэнтези
6.80
рейтинг книги
Наследник

Развод в 45. От любви до ненависти

Гофман Крис
6. Развод
Любовные романы:
остросюжетные любовные романы
5.40
рейтинг книги
Развод в 45. От любви до ненависти

Русские дети (сборник)

Фрай Макс
Проза:
современная проза
5.60
рейтинг книги
Русские дети (сборник)

Боярышня Дуняша 2

Меллер Юлия Викторовна
2. Боярышня
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Боярышня Дуняша 2

Страж Кодекса

Романов Илья Николаевич
1. КО: Страж Кодекса
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Страж Кодекса

Глэрд IX: Легионы во Тьме

Владимиров Денис
9. Глэрд
Фантастика:
боевая фантастика
попаданцы
фэнтези
5.00
рейтинг книги
Глэрд IX: Легионы во Тьме

Кодекс Крови. Книга ХVI

Борзых М.
16. РОС: Кодекс Крови
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Кодекс Крови. Книга ХVI

Учитель из прошлого тысячелетия

Еслер Андрей
6. Соприкосновение миров
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Учитель из прошлого тысячелетия

Меткий стрелок. Том II

Вязовский Алексей
2. Меткий стрелок
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Меткий стрелок. Том II

Геном хищника. Книга пятая

Гарцевич Евгений Александрович
5. Я - Легенда!
Фантастика:
рпг
фэнтези
попаданцы
6.00
рейтинг книги
Геном хищника. Книга пятая

Украсть у президента

Гриньков Владимир Васильевич
Детективы:
триллеры
5.00
рейтинг книги
Украсть у президента

Наследник старого рода

Шелег Дмитрий Витальевич
1. Живой лёд
Фантастика:
фэнтези
8.19
рейтинг книги
Наследник старого рода