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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QLinearGradient bugs?  (Прочитано 5485 раз)
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« : Март 16, 2010, 21:35 »

При использовании следующего кода
Код:
    const int w = 64 * 1024;
    QImage img(w, 1, QImage::Format_RGB32);
    QLinearGradient gradient(0, 0, img.width() - 1, 1);
    gradient.setColorAt(0, Qt::blue);
    gradient.setColorAt(1, Qt::red);
    QPainter painter(&img);
    painter.fillRect(img.rect(), gradient);
    img.save("test.png");
Нормальный градиент отрисовывается только для w < 32*1024. Иначе, заполняются градиентом только те точки, чья х-координата меньше 32*1024.
Кроме того, даже для для случаев с w < 32 * 1024, цвет крайней правой точки равен не 0xFF0000 (Qt::red), а 0хFD0001 (для w = 32 * 1024 - 1).
Qt 4.6.0, WinXP, MSVS и MinGW.
Записан
Rcus
Гость
« Ответ #1 : Март 17, 2010, 04:09 »

Все в порядке.
Цитировать
Limitations

If you are using coordinates with Qt's raster-based paint engine, it is important to note that, while coordinates greater than +/- 2^15 can be used, any painting performed with coordinates outside this range is not guaranteed to be shown; the drawing may be clipped. This is due to the use of short int in the implementation.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #2 : Март 17, 2010, 10:32 »

Остается 2 выхода - либо самому заполнять image градиентом либо тупо создать image (2^15 x 1) и залить его как делаете вы и уже потом scale-нуть этот image в image нужного вам размера. Для плавности переходов можно задействовать Qt::SmoothTransformation.
Записан

Qt 5.11/4.8.7 (X11/Win)
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #3 : Март 17, 2010, 19:41 »

Да я-то справлюсь и так. Просто как-то некрасиво получается - чем их short лимитирует? А по второй части вопроса мысли у кого-нибудь есть?
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #4 : Март 17, 2010, 20:04 »

Цитировать
Просто как-то некрасиво получается - чем их short лимитирует?
Мне тоже не понятно, т.к. для QImage тролли декларируют, что у них свой отдельный QPaintEngine, который по идее не должен быть завязан на оконную систему. Значит что-то не до конца сделали.

Цитировать
А по второй части вопроса мысли у кого-нибудь есть?
Похоже на баг либо на ошибку привидения. А для w = 32 * 1024 - 2 ?
Записан

Qt 5.11/4.8.7 (X11/Win)
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #5 : Март 17, 2010, 20:15 »

Похоже на баг либо на ошибку привидения. А для w = 32 * 1024 - 2 ?
Да по-фигу ей размер. Последний пиксель градиента все равно не равен тому, который задается в setColorAt(1, Qt::red)
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #6 : Март 18, 2010, 09:32 »

Имхо, точная передача цвета при градиенте не важна.
К тому же, опять-таки имхо, человеческий глаз различий между 0xFF0000 и 0хFD0001 не заметит.
Записан

Qt 5.11/4.8.7 (X11/Win)
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #7 : Март 18, 2010, 19:59 »

А не человеческий не глаз заметит? Я же заметил. Это что за подход такой - 2 приблизительно равно 3?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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