Russian Qt Forum
Ноябрь 26, 2024, 00:54 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Несоответствие в книге Макса Шлее «Qt 4».  (Прочитано 4184 раз)
Mr.X
Гость
« : Сентябрь 08, 2010, 11:46 »

Заметил несоответствие в книге Макса Шлее «Qt 4». Программа, приведенная в листингах 18.20 - 18.21 (страница 353) и на диске, выводит немного не то, что должна выводить согласно рисунку 18.22 книги. Интересно, чем это можно объяснить. Причем рисунок такой же и в его новой книге "Qt 4.5".
Рисунки приведены в приложении.
Текст программы следующий:
Код:
/* ======================================================================
**  main.cpp
** ======================================================================
**
** ======================================================================
**  Copyright (c) 2007 by Max Schlee
** ======================================================================
*/
#include <QtGui>

// ----------------------------------------------------------------------
QLabel* lbl(const QPainter::CompositionMode& mode)
{
    QLabel* plbl = new QLabel;
    plbl->setFixedSize(100, 100);

    QRect    rect(plbl->contentsRect());
    QPainter painter;

    QImage sourceImage(rect.size(), QImage::Format_ARGB32_Premultiplied);
    painter.begin(&sourceImage);
    painter.setRenderHint(QPainter::Antialiasing, true);
    painter.setBrush(QBrush(QColor(0, 255, 0)));
    painter.drawPolygon(QPolygon() << rect.bottomLeft()
                                   << QPoint(rect.center().x(), 0)
                                   << rect.bottomRight()
                       );
    painter.end();

    QImage resultImage(rect.size(), QImage::Format_ARGB32_Premultiplied);
    painter.begin(&resultImage);
    painter.setRenderHint(QPainter::Antialiasing, true);
    painter.setCompositionMode(QPainter::CompositionMode_SourceOver);
    painter.setPen(QPen(QColor(0, 255, 0), 4));
    painter.setBrush(QBrush(QColor(255, 0, 0)));
    painter.drawEllipse(rect);
    painter.setCompositionMode(mode);
    painter.drawImage(rect, sourceImage);
    painter.end();
    
    plbl->setPixmap(QPixmap::fromImage(resultImage));
    return plbl;
}


// ----------------------------------------------------------------------
int main(int argc, char** argv)
{
   QApplication app(argc, argv);
   QWidget      wgt;

   //Layout Setup
   QGridLayout* pgrd = new QGridLayout;
   pgrd->addWidget(lbl(QPainter::CompositionMode_Source), 0, 0);
   pgrd->addWidget(new QLabel("<CENTER>Source</CENTER>"), 1, 0);
   pgrd->addWidget(lbl(QPainter::CompositionMode_SourceOver), 0, 1);
   pgrd->addWidget(new QLabel("<CENTER>SourceOver</CENTER>"), 1, 1);
   pgrd->addWidget(lbl(QPainter::CompositionMode_SourceIn), 0, 2);
   pgrd->addWidget(new QLabel("<CENTER>SourceIn</CENTER>"), 1, 2);
   pgrd->addWidget(lbl(QPainter::CompositionMode_SourceOut), 0, 3);
   pgrd->addWidget(new QLabel("<CENTER>SourceOut</CENTER>"), 1, 3);
   pgrd->addWidget(lbl(QPainter::CompositionMode_SourceAtop), 0, 4);
   pgrd->addWidget(new QLabel("<CENTER>SourceAtop</CENTER>"), 1, 4);
   pgrd->addWidget(lbl(QPainter::CompositionMode_Clear), 0, 5);
   pgrd->addWidget(new QLabel("<CENTER>Clear</CENTER>"), 1, 5);
   pgrd->addWidget(lbl(QPainter::CompositionMode_Destination), 2, 0);
   pgrd->addWidget(new QLabel("<CENTER>Destination</CENTER>"), 3, 0);
   pgrd->addWidget(lbl(QPainter::CompositionMode_DestinationOver), 2, 1);
   pgrd->addWidget(new QLabel("<CENTER>DestinationOver</CENTER>"), 3, 1);
   pgrd->addWidget(lbl(QPainter::CompositionMode_DestinationIn), 2, 2);
   pgrd->addWidget(new QLabel("<CENTER>DestinationIn</CENTER>"), 3, 2);
   pgrd->addWidget(lbl(QPainter::CompositionMode_DestinationOut), 2, 3);
   pgrd->addWidget(new QLabel("<CENTER>DestinationOut</CENTER>"), 3, 3);
   pgrd->addWidget(lbl(QPainter::CompositionMode_DestinationAtop), 2, 4);
   pgrd->addWidget(new QLabel("<CENTER>DestinationAtop</CENTER>"), 3, 4);
   pgrd->addWidget(lbl(QPainter::CompositionMode_Xor), 2, 5);
   pgrd->addWidget(new QLabel("<CENTER>Xor</CENTER>"), 3, 5);
   wgt.setLayout(pgrd);

   wgt.show();

   return app.exec();
}
« Последнее редактирование: Сентябрь 08, 2010, 11:52 от Mr.X » Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #1 : Сентябрь 08, 2010, 12:28 »

просто книга чёрно-белая, а так всё одинаково
Записан

Юра.
Sancho_s_rancho
Гость
« Ответ #2 : Сентябрь 08, 2010, 12:58 »

просто книга чёрно-белая, а так всё одинаково
Скриншот в приложении показывает, что не одинаково.
Записан
Mr.X
Гость
« Ответ #3 : Сентябрь 08, 2010, 14:05 »

Что-то я вообще ничего не пойму. Вот я запустил демонстрационную программу Composition Modes из Examples and Demos, так здесь в режиме SourceIn отображается целиком объект Destination (цветок), а объект Source (эллипс) отображается только внутри объекта Destination (картинку см. в приложении).
В Ассистенте же в документации к enum QPainter::CompositionMode на картинке (см. приложение) показано, что в этом же режиме SourceIn, объект Source также отображается только внутри объекта Destination, а объект Destination вообще не отображается.
В выводе же сабжевой программы (см. картинку в приложении к первому сообщению темы) в этом же режиме SourceIn отображается объект Source (треугольник) целиком, а объект Destination (красный круг) вообще не отображается, если не считать его белой тени на белом фоне.
Т.е. все эти три источника показывают разное и противоречат друг другу.
Как это все можно объяснить?
« Последнее редактирование: Сентябрь 08, 2010, 14:32 от Mr.X » Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #4 : Сентябрь 08, 2010, 15:07 »

>>Скриншот в приложении показывает, что не одинаково.
скриншот показывает, что всё одинаково. Абсолютно всё!
Также он показывает, что преобразование из цвета в ЧБ было максимально говённым.
Вот если смотреть сюда внимательно, то видно красный треугольник в красном круге:
« Последнее редактирование: Сентябрь 08, 2010, 15:12 от lit-uriy » Записан

Юра.
Mr.X
Гость
« Ответ #5 : Сентябрь 08, 2010, 15:26 »

>>Скриншот в приложении показывает, что не одинаково.
скриншот показывает, что всё одинаково. Абсолютно всё!
Также он показывает, что преобразование из цвета в ЧБ было максимально говённым.
Вот если смотреть сюда внимательно, то видно красный треугольник в красном круге:

Ну дак ясно и видно, что в режиме SourceIn на цветном рисунке треугольник выведен целиком, а на черно-белом обрезан по кругу. Это видно и по черным границам треугольника, что от цветопередачи не зависит.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #6 : Сентябрь 08, 2010, 16:46 »

на цветном видно границу белого круга по которой ЧБ обрезано.
Записан

Юра.
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.079 секунд. Запросов: 23.