Вход/Регистрация
QT 4: программирование GUI на С++
вернуться

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

Шрифт:

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.

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

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

  • Читать дальше
  • 1
  • ...
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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