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

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

Жанры

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

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

Шрифт:

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

42 void IconEditor::paintEvent(QPaintEvent *event)

43 {

44 QPainter painter(this);

45 if (zoom >= 3) {

46 painter.setPen(palette.foreground.color);

47 for (int i = 0; i <= image.width; ++i)

48 painter.drawLine(zoom * i, 0,

49 zoom * i, zoom * image.height);

50 for (int j = 0; j <= image.height; ++j)

51 painter.drawLine(0, zoom * j,

52 zoom * image.width, zoom * j);

53 }

54 for (int i = 0; i < image.width; ++i) {

55 for (int j = 0; j < image.height; ++j) {

56 QRect rect = pixelRect(i, j);

57 if (!event->region.intersect(rect).isEmpty) {

58 QColor color = QColor::fromRgba(image.pixel(i, j));

59 painter.fillRect(rect, color);

60 }

61 }

62 }

63 }

Мы

начинаем с построения объекта QPainter нашего виджета. Если масштабный коэффициент равен или больше 3, мы вычерчиваем с помощью функции QPainter::drawLine горизонтальные и вертикальные линии сетки.

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

painter.drawLine(x1, y1, x2, y2);

где (x1, y1) задает положение одного конца линии и (x2, y2) задает положение другого конца линии. Существует перегруженный вариант функции, которая принимает два объекта типа QPoint вместо четырех целых чисел.

Пиксель в верхнем левом углу виджета Qt имеет координаты (0, 0), а пиксель в нижнем правом углу имеет координаты (width — 1, height — 1). Это напоминает обычную декартовскую систему координат, но только перевернутую сверху вниз. Мы можем изменить систему координат в QPainter, трансформируя ее такими способами, как смещение, масштабирование, вращение и отсечение. Эти вопросы рассматриваются в главе 8 («Графика 2D и 3D»).

Рис. 5.3. Вычерчивание линии при помощи QPainter.

Перед вызовом в QPainter функции drawLine мы устанавливаем цвет линии, используя функцию setPen. Мы могли бы жестко запрограммировать цвет (например, черный или серый), но лучше использовать палитру виджета.

Каждый виджет имеет палитру, которая определяет назначение цветов. Например, предусмотрен цвет фона виджетов (обычно светло—серый) и цвет текста на этом фоне (обычно черный). По умолчанию палитра виджета адаптирована под схему цветов оконной системы. Используя цвета из палитры, мы обеспечим в IconEditor учет пользовательских настроек.

Палитра виджета состоит из трех цветовых групп: активной, неактивной и нерабочей. Цветовая группа выбирается в зависимости от текущего состояния виджета:

• группа Active используется для виджетов текущего активного окна;

• группа Inactive используется виджетами

других окон;

• группа Disabled используется отключенными виджетами любого окна.

Функция QWidget::palette возвращает палитру виджета в виде объекта QPalette. Цветовые группы определяются как элементы перечисления типа QPalette::QColorGroup. Удобная функция QWidget::colorGroup возвращает правильную цветовую группу текущего состояния виджета, и поэтому нам редко придется выбирать цвет непосредственно из палитры.

Когда нам нужно получить соответствующую кисть или цвет для рисования, правильный подход связан с применением текущей палитры, полученной функцией QWidget::palette, и соответствующей ролевой функции, например QPalette::foreground. Каждая ролевая функция возвращает кисть, что обычно и требуется, однако если нам нужен только цвет, его можно извлечь из кисти, как мы это делали в paintEvent. По умолчанию возвращаемые кисти соответствуют состоянию виджета, поэтому нам не надо указывать цветовую группу.

Функция paintEvent завершает рисование изображения. Вызов IconEditor::pixelRect возвращает QRect, который определяет область перерисовки. Мы не выдаем пиксели, которые попадают за пределы данной области, обеспечивая простую оптимизацию.

Рис. 5.4. Вычерчивание прямоугольника при помощи QPainter.

Мы вызываем QPainter::fillRect для вывода на экран масштабируемого пикселя. QPainter::fillRect принимает QRect и QBrush. Передавая QColor в качестве кисти, мы обеспечиваем равномерное заполнение области.

64 QRect IconEditor::pixelRect(int i, int j) const

65 {

66 if (zoom >= 3) {

67 return QRect(zoom * i + 1, zoom * j + 1, zoom - 1, zoom - 1);

68 } else {

69 return QRect(zoom * i, zoom * j, zoom, zoom);

70 }

71 }

Функция pixelRect возвращает объект QRect, который может использоваться функцией QPainter::fillRect. Параметры i и j являются координатами пикселя в QImage, а не в виджете. Если коэффициент масштабирования равен 1, обе системы координат будут полностью совпадать.

Конструктор QRect имеет синтаксис QRect(x, у, width, height), где (x, у) являются координатами верхнего левого угла прямоугольника, a width и height являются размерами прямоугольника (шириной и высотой). Если коэффициент масштабирования равен не менее 3, мы уменьшаем размеры прямоугольника на один пиксель по горизонтали и по вертикали, чтобы не загораживать линии сетки.

72 void IconEditor::mousePressEvent(QMouseEvent *event)

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

Стеллар. Трибут

Прокофьев Роман Юрьевич
2. Стеллар
Фантастика:
боевая фантастика
рпг
8.75
рейтинг книги
Стеллар. Трибут

Его огонь горит для меня. Том 2

Муратова Ульяна
2. Мир Карастели
Фантастика:
юмористическая фантастика
5.40
рейтинг книги
Его огонь горит для меня. Том 2

На границе империй. Том 9. Часть 4

INDIGO
17. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 4

Наследник

Кулаков Алексей Иванович
1. Рюрикова кровь
Фантастика:
научная фантастика
попаданцы
альтернативная история
8.69
рейтинг книги
Наследник

Совершенно несекретно

Иванов Дмитрий
15. Девяностые
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Совершенно несекретно

Ваше Сиятельство 2

Моури Эрли
2. Ваше Сиятельство
Фантастика:
фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Ваше Сиятельство 2

Прометей: каменный век II

Рави Ивар
2. Прометей
Фантастика:
альтернативная история
7.40
рейтинг книги
Прометей: каменный век II

Единственная для темного эльфа 3

Мазарин Ан
3. Мир Верея. Драконья невеста
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Единственная для темного эльфа 3

Жандарм

Семин Никита
1. Жандарм
Фантастика:
попаданцы
альтернативная история
аниме
4.11
рейтинг книги
Жандарм

Долгий путь домой

Русич Антон
Вселенная EVE Online
Фантастика:
космическая фантастика
попаданцы
6.20
рейтинг книги
Долгий путь домой

Прогрессор поневоле

Распопов Дмитрий Викторович
2. Фараон
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Прогрессор поневоле

Наследие Маозари 6

Панежин Евгений
6. Наследие Маозари
Фантастика:
попаданцы
постапокалипсис
рпг
фэнтези
эпическая фантастика
5.00
рейтинг книги
Наследие Маозари 6

Я еще не барон

Дрейк Сириус
1. Дорогой барон!
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Я еще не барон

Лолита

Набоков Владимир Владимирович
Проза:
классическая проза
современная проза
8.05
рейтинг книги
Лолита