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

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

Жанры

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

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

Шрифт:

QRgb red = qRgba(255, 0, 0, 255);

или так (поскольку этот цвет непрозрачен):

QRgb red = qRgb(255, 0, 0);

Тип QRgb просто синоним типа unsigned int, созданный с помощью директивы typedef, a qRgb и qRgba являются встроенными функциями (то есть со спецификатором inline), которые преобразуют свои аргументы в 32-битовое целое число. Допускается также запись

QRgb red = 0xFFFF0000;

где первые FF соответствуют альфа—компоненту, а вторые FF — красному компоненту. В конструкторе класса IconEditor

мы делаем QImage прозрачным, используя 0 в качестве значения альфа—компонента.

В Qt для хранения цветов предусмотрено два типа: QRgb и QColor. В то время как QRgb всего лишь определяется в QImage ключевым словом typedef для представления пикселей 32-битовым значением, QColor является классом, который имеет много полезных функций и широко используется в Qt для хранения цветов. В виджете IconEditor мы используем QRgb только при работе с QImage; мы применяем QColor во всех остальных случаях, включая свойство цвет пера penColor.

13 QSize IconEditor::sizeHint const

14 {

15 QSize size = zoom * image.size;

16 if (zoom >= 3)

17 size += QSize(1, 1);

18 return size;

19 }

Функция sizeHint класса QWidget переопределяется и возвращает «идеальный» размер виджета. Здесь мы размер изображения умножаем на масштабный коэффициент и в случае, когда масштабный коэффициент равен или больше 3, добавляем еще один пиксель по каждому направлению для размещения сетки. (Мы не показываем сетку при масштабном коэффициенте 1 или 2, поскольку в этом случае едва ли найдется место для пикселей пиктограммы.)

Идеальный размер виджета играет очень заметную роль при размещении виджетов. Менеджеры компоновки Qt стараются максимально учесть идеальный размер виджета при размещении дочерних виджетов. Для того чтобы IconEditor был удобен для менеджера компоновки, он должен сообщить свой правдоподобный идеальный размер.

Кроме идеального размера виджет имеет «политику размера», которая говорит системе компоновки о желательности или нежелательности его растяжения или сжатия. Вызывая в конструкторе функцию setSizePolicy со значением QSizePolicy::Minimum в качестве горизонтальной и вертикальной политики, мы указываем менеджеру компоновки, который отвечает за размещение этого виджета, на то, что идеальный размер является фактически его минимальным размером. Другими словами, при необходимости виджет может растягиваться, но он никогда не должен сжиматься до размеров меньших, чем идеальный. Политику размера можно изменять в Qt Designer путем установки свойства виджета sizePolicy. Смысл различной политики размеров объясняется в главе 6 («Управление компоновкой»).

20 void IconEditor::setPenColor(const QColor &newColor)

21 {

22 curColor = newColor;

23 }

Функция setPenColor устанавливает текущий цвет пера. Этот цвет будет использоваться при выводе на экран новых пикселей.

24 void IconEditor::setIconImage(const QImage &newImage)

25 {

26 if (newImage != image) {

27 image = newImage.convertToFormat(QImage::Format_ARGB32);

28 update;

29 updateGeometry;

30 }

31 }

Функция setIconImage

задает изображение для редактирования. Мы вызываем convertToFormat для установки 32-битовой глубины изображения с альфа—буфером, если это еще не сделано. В дальнейшем везде мы будем предполагать, что изображение хранится в 32-битовых элементах типа ARGB.

После установки переменной image мы вызываем функцию QWidget::update для принудительной перерисовки виджета с новым изображением. Затем мы вызываем QWidget::updateGeometry, чтобы сообщить всем содержащим этот виджет менеджерам компоновки об изменении идеального размера виджета. Размещение виджета затем будет автоматически адаптировано к его новому идеальному размеру.

32 void IconEditor::setZoomFactor(int newZoom)

33 {

34 if (newZoom < 1)

35 newZoom = 1;

36 if (newZoom != zoom) {

37 zoom = newZoom;

38 update;

39 updateGeometry;

40 }

41 }

Функция setZoomFactor устанавливает масштабный коэффициент изображения. Для предотвращения деления на нуль мы корректируем всякое значение, меньшее, чем 1. Мы опять вызываем функции update и updateGeometry для перерисовки виджета и уведомления всех менеджеров компоновки об изменении идеального размера.

Функции penColor, iconImage и zoomFactor реализуются в заголовочном файле как встроенные функции.

Теперь мы рассмотрим программный код функции paintEvent. Эта функция играет очень важную роль в классе IconEditor. Она вызывается всякий раз, когда требуется перерисовать виджет. Используемая по умолчанию ее реализация в QWidget ничего не делает, оставляя виджет пустым.

Так же как рассмотренная нами в главе 3 функция closeEvent, функция paintEvent является обработчиком события. В Qt предусмотрено много других обработчиков событий, каждый из которых относится к определенному типу события. Обработка событий подробно рассматривается в главе 7 .

Существует множество ситуаций, когда генерируется событие рисования (paint) и вызывается функция paintEvent:

• при первоначальном выводе на экран виджета система автоматически генерирует событие рисования, чтобы виджет нарисовал сам себя;

• при изменении размеров виджета система генерирует событие рисования;

• если виджет перекрывается другим окном и затем вновь оказывается видимым, генерируется событие рисования для областей, которые закрывались (если только система управления окнами не сохранит закрытую область).

Мы можем также принудительно сгенерировать событие рисования путем вызова функции QWidget::update или QWidget::repaint. Различие между этими функциями следующее: repaint приводит к немедленной перерисовке, а функция update просто передает событие рисования в очередь событий, обрабатываемых Qt. (Обе функции ничего не будут делать, если виджет невидим на экране.) Если update вызывается несколько раз, Qt из нескольких следующих друг за другом событий рисования делает одно событие для предотвращения мерцания. В классе IconEditor мы всегда используем функцию update.

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

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

Прокофьев Роман Юрьевич
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
рейтинг книги
Лолита