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

на главную - закладки

Жанры

QT 4: программирование GUI на С++

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

Шрифт:

06 update;

07 }

Если пользователь щелкает по этому виджету, мы находим ближайшую метку, используя тонкую, но эффективную математическую формулу, а результат идет на установку новой продолжительности таймера. Затем мы генерируем событие перерисовки. Метка, по которой щелкнул пользователь, теперь будет располагаться сверху поворотного диска и будет поворачиваться против часовой стрелки до тех пор, пока не будет достигнуто значение 0.

01 void OvenTimer::paintEvent(QPaintEvent * /* event */)

02 {

03 QPainter painter(this);

04 painter.setRenderHint(QPainter::Antialiasing, true);

05 int side = qMin(width, height);

06 painter.setViewport((width - side) / 2, (height - side) / 2,

07 side, side);

08 painter.setWindow(-50, -50, 100, 100);

09 draw(&painter);

10 }

B paintEvent мы

устанавливаем область отображения на максимальный квадрат, который можно разместить внутри виджета, и мы устанавливаем окно на прямоугольник (—50, —50, 100, 100), то есть на прямоугольник с размерами 100 × 100, который покрывает пространство от точки (—50, —50) до точки (+50, +50). Шаблонная функция qMin возвращает наименьшее из двух значений аргументов. Затем мы вызываем функцию draw для фактического вывода рисунка на экран.

Рис. 8.10. Вид виджета OvenTimer при трех различных размерах.

Если область отображения не была бы квадратом, таймер духовки принял бы форму эллипса, когда форма виджета перестанет быть квадратной после изменения его размеров. Чтобы избежать такой деформации, мы должны устанавливать область отображения и окно на прямоугольник с одинаковым соотношением сторон.

Теперь давайте рассмотрим программный код рисования:

01 void OvenTimer::draw(QPainter *painter)

02 {

03 static const int triangle[3][2] = {

04 { -2, -49 }, { +2, -49 }, { 0, -47 }

05 };

10 QPen thickPen(palette.foreground, 1.5);

11 QPen thinPen(palette.foreground, 0.5);

12 QColor niceBlue(150, 150, 200);

13 painter->setPen(thinPen);

14 painter->setBrush(palette.foreground);

15 painter->drawPolygon(QPolygon(3, &triangle[0][0]));

Мы начинаем с отображения маленького треугольника в позиции 0 в верхней части виджета. Этот треугольник задается в программе тремя фиксированными координатами, и мы используем функцию drawPolygon для его воспроизведения.

Одно из удобств применения механизма «окно—область отображения» заключается в том, что мы можем при программировании в командах рисования жестко задавать координаты точек и тем не менее добиваться необходимого изменения размеров.

16 QConicalGradient coneGradient(0, 0, -90.0);

17 coneGradient.setColorAt(0.0, Qt::darkGray);

18 coneGradient.setColorAt(0.2, niceBlue);

19 coneGradient.setColorAt(0.5, Qt::white);

20 coneGradient.setColorAt(1.0, Qt::darkGray);

21 painter->setBrush(coneGradient);

22 painter->drawEllipse(-46, -46, 92, 92);

Мы

рисуем внешнюю окружность и заполняем ее, используя конический градиент. Центр градиента находится в точке (0, 0), а его угол равен —90°.

23 QRadialGradient haloGradient(0, 0, 20, 0, 0);

24 haloGradient.setColorAt(0.0, Qt::lightGray);

25 haloGradient.setColorAt(0.8, Qt::darkGray);

26 haloGradient.setColorAt(0.9, Qt::white);

27 haloGradient.setColorAt(1.0, Qt::black);

28 painter->setPen(Qt::NoPen);

29 painter->setBrush(haloGradient);

30 painter->drawEllipse(-20, -20, 40, 40);

Мы заполняем внутреннюю окружность, используя радиальный градиент. Центр и фокус градиента располагаются в точке (0, 0). Радиус градиента равен 20.

31 QLinearGradient knobGradient(-7, -25, 7, -25);

32 knobGradient.setColorAt(0.0, Qt::black);

33 knobGradient.setColorAt(0.2, niceBlue);

34 knobGradient.setColorAt(0.3, Qt::lightGray);

35 knobGradient.setColorAt(0.8, Qt::white);

36 knobGradient.setColorAt(1.0, Qt::black);

37 painter->rotate(duration * DegreesPerSecond);

38 painter->setBrush(knobGradient);

39 painter->setPen(thinPen);

40 painter->drawRoundRect(-7, -25, 14, 50, 150, 50);

41 for (int i = 0; i <= MaxMinutes; ++i) {

42 if (i % 5 == 0) {

43 painter->setPen(thickPen);

44 painter->drawLine(0, -41, 0, -44);

45 painter->drawText(-15, -41, 30, 25,

46 Qt::AlignHCenter | Qt::AlignTop,

47 QString::number(i));

48 } else {

49 painter->setPen(thinPen);

50 painter->drawLine(0, -42, 0, -44);

51 }

52 painter->rotate(-DegreesPerMinute);

53 }

54 }

Мы вызываем функцию rotate для поворота системы координат рисовальщика. В старой системе координат нулевая отметка находилась сверху; теперь нулевая отметка перемещается для установки соответствующего времени, которое остается до срабатывания таймера. После каждого поворота мы снова рисуем ручку таймера, поскольку его ориентация зависит от угла поворота.

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

Жена со скидкой, или Случайный брак

Ардова Алиса
Любовные романы:
любовно-фантастические романы
8.15
рейтинг книги
Жена со скидкой, или Случайный брак

Осколки маски

Метельский Николай Александрович
7. Унесенный ветром
Фантастика:
боевая фантастика
альтернативная история
6.71
рейтинг книги
Осколки маски

Мастер 4

Чащин Валерий
4. Мастер
Фантастика:
героическая фантастика
боевая фантастика
попаданцы
5.00
рейтинг книги
Мастер 4

Горизонт Вечности

Вайс Александр
11. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
космоопера
5.00
рейтинг книги
Горизонт Вечности

Потомок бога 3

Решетов Евгений Валерьевич
3. Локки
Фантастика:
аниме
фэнтези
5.00
рейтинг книги
Потомок бога 3

Запечатанный во тьме. Том 1. Тысячи лет кача

NikL
1. Хроники Арнея
Фантастика:
уся
эпическая фантастика
фэнтези
5.00
рейтинг книги
Запечатанный во тьме. Том 1. Тысячи лет кача

Путь

Yagger Егор
Фантастика:
космическая фантастика
4.25
рейтинг книги
Путь

Ученик. Книга третья

Первухин Андрей Евгеньевич
3. Ученик
Фантастика:
фэнтези
7.64
рейтинг книги
Ученик. Книга третья

Хозяин Теней 5

Петров Максим Николаевич
5. Безбожник
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Хозяин Теней 5

Я не царь. Книга XXIV

Дрейк Сириус
24. Дорогой барон!
Фантастика:
юмористическое фэнтези
аниме
попаданцы
5.00
рейтинг книги
Я не царь. Книга XXIV

Сильнейший Столп Империи. Книга 5

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

Кодекс Охотника. Книга XXII

Винокуров Юрий
22. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Кодекс Охотника. Книга XXII

Чевенгур

Платонов Андрей Платонович
Проза:
советская классическая проза
6.75
рейтинг книги
Чевенгур

Новые горизонты

Лисина Александра
5. Гибрид
Фантастика:
попаданцы
технофэнтези
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Новые горизонты