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

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

Жанры

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)

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

Бастард Императора. Том 13

Орлов Андрей Юрьевич
13. Бастард Императора
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Бастард Императора. Том 13

Точка Бифуркации IV

Смит Дейлор
4. ТБ
Фантастика:
героическая фантастика
городское фэнтези
попаданцы
5.00
рейтинг книги
Точка Бифуркации IV

Глава рода

Шелег Дмитрий Витальевич
5. Живой лёд
Фантастика:
боевая фантастика
6.55
рейтинг книги
Глава рода

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

Винокуров Юрий
19. Кодекс Охотника
Фантастика:
фэнтези
5.00
рейтинг книги
Кодекс Охотника. Книга XIX

Древесный маг Орловского княжества 3

Павлов Игорь Васильевич
3. Орловское княжество
Фантастика:
аниме
сказочная фантастика
фэнтези
попаданцы
гаремник
5.00
рейтинг книги
Древесный маг Орловского княжества 3

Лекарь Империи

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

Пламенев. Книга 3-7

Карелин Сергей Витальевич
Пламенев
Фантастика:
аниме
уся
фэнтези
сянься
5.00
рейтинг книги
Пламенев. Книга 3-7

Неучтенный элемент. Том 2

NikL
2. Антимаг. Вне системы
Фантастика:
городское фэнтези
фэнтези
5.00
рейтинг книги
Неучтенный элемент. Том 2

Газлайтер. Том 9

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

Наследник

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

Белые погоны

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

Я спас СССР! том 2

Вязовский Алексей
2. Я спас СССР
Фантастика:
альтернативная история
5.62
рейтинг книги
Я спас СССР! том 2

На границе империй. Том 2

INDIGO
2. Фортуна дама переменчивая
Фантастика:
космическая фантастика
7.35
рейтинг книги
На границе империй. Том 2

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

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