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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QPainter::drawPixmap - похоже конкретный Баг?  (Прочитано 8207 раз)
spectre71
Гость
« : Декабрь 09, 2009, 11:51 »

Код
C++ (Qt)
 QPixmap Pixmap(10, 10);
 QPainter Painter(Pixmap);
 
 Painter.fillRect(Pixmap.rect(), Qt::green); // GREEN 10*10
 
 Painter.fillRect(QRect(0,0,1,10), Qt::red); // RED 1*10 + GREEN 9*10
 
 painter.drawPixmap(QRect(1,0,9,10), *pixmap, QRect(0,0,9,10)); // QT BUG
 
 

Последняя отрисовка должна дать квадрат - RED 2*10 + GREEN 8*10.
Однако это правильно работает при debug сборке.
При release сборке мы получаем квадрат - RED 10*10

Windows XP
Qt 4.6
Qt Creator 1.3.0
mingw qcc

Записан
Rcus
Гость
« Ответ #1 : Декабрь 09, 2009, 12:26 »

Что-то у меня парсер не переваривает painter и *pixmap. И все равно использовать QPixmap на котором активен QPainter в качестве источника нельзя, плохо что Q_ASSERT'а на это нет.
Записан
spectre71
Гость
« Ответ #2 : Декабрь 09, 2009, 12:29 »

Что-то у меня парсер не переваривает painter и *pixmap. И все равно использовать QPixmap на котором активен QPainter в качестве источника нельзя, плохо что Q_ASSERT'а на это нет.


Код
C++ (Qt)
 QPixmap Pixmap(10, 10);
 QPainter Painter(Pixmap);
 
 Painter.fillRect(Pixmap.rect(), Qt::green); // GREEN 10*10
 
 Painter.fillRect(QRect(0,0,1,10), Qt::red); // RED 1*10 + GREEN 9*10
 
 Painter.drawPixmap(QRect(1,0,9,10), *Pixmap, QRect(0,0,9,10)); // QT BUG

Почему нельзя? В доке это где-то есть?
« Последнее редактирование: Декабрь 09, 2009, 12:32 от Spectre » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Декабрь 09, 2009, 13:24 »

Я так понял 2 painter'а (Painter и painter). Первый рисует в pixmap, второй ее выводит. Если так то интересно проверить:
Код
C++ (Qt)
QPixmap Pixmap(10, 10);
if (1) {
 QPainter Painter(Pixmap);
 
 Painter.fillRect(Pixmap.rect(), Qt::green); // GREEN 10*10
 
 Painter.fillRect(QRect(0,0,1,10), Qt::red); // RED 1*10 + GREEN 9*10
}
painter.drawPixmap(QRect(1,0,9,10), *pixmap, QRect(0,0,9,10)); // QT BUG
 
Записан
spectre71
Гость
« Ответ #4 : Декабрь 09, 2009, 13:39 »

Я так понял 2 painter'а (Painter и painter). Первый рисует в pixmap, второй ее выводит. Если так то интересно проверить:
Нет паинтер один! (в первом примере была ошибка (Painter, painter) - во втором я ее исправил)
И девайс на котором рисуем и источник один и тот же Pixmap.
Задача которая решается - пермещение участка Pixmap внутри него.


Записан
spectre71
Гость
« Ответ #5 : Декабрь 11, 2009, 05:01 »

Ну что, так это Qt-ный баг?
Есть не согласные?
Записан
Rcus
Гость
« Ответ #6 : Декабрь 11, 2009, 06:07 »

Не согласен, фигню хотите - копируйте участок и накладывайте после.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Декабрь 11, 2009, 06:38 »

Код
C++ (Qt)
 QPixmap Pixmap(10, 10);
 QPainter Painter(Pixmap);
  Painter.fillRect(Pixmap.rect(), Qt::green); // заливаем квадрат 10х10 зеленым - ясно
 
 Painter.fillRect(QRect(0,0,1,10), Qt::red); // слева рисуем вертикальную красную полосу в 1 пиксель
 
 Painter.drawPixmap(QRect(1,0,9,10), *Pixmap, QRect(0,0,9,10)); // ???
 
А вот последняя строка непонятно что делает. Если цель - сдвиг/скролл, то QRect должны быть равны по размерам. И что куда копируется? Получается: взяли квадрат (без правой линии), и вписали его в прямоугольник на 1 пиксель меньше? Какой-то мутный сдвиг:)
« Последнее редактирование: Декабрь 11, 2009, 06:50 от Igors » Записан
spectre71
Гость
« Ответ #8 : Декабрь 11, 2009, 06:44 »

Не согласен, фигню хотите - копируйте участок и накладывайте после.

Очень не оптимально:
- участок может быть очень большой
- дополнительное выделение памяти
- гораздо медленние
Так что это не фигня, особенно в случае частого повторения данной операции!
Записан
spectre71
Гость
« Ответ #9 : Декабрь 11, 2009, 06:48 »

Painter.drawPixmap(QRect(1,0,9,10), *Pixmap, QRect(0,0,9,10)); // Непонимающий
А вот последняя строка непонятно что делает. Если цель - сдвиг/скролл, то QRect должны быть равны по размерам. И что куда копируется? Получается: взяли квадрат (без правой линии), и вписали его в прямоугольник на 1 пиксель меньше? Какой-то мутный сдвиг:)
Смотри внимательнее они и равны по размерам 9x10 - QRect(1,0,9,10), QRect(0,0,9,10)
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #10 : Декабрь 11, 2009, 07:25 »

Попутал (привык left, top, right, bottom Улыбающийся) Но на Mac такого нет, слева 2 красных пикселя (как в debug, так и в release). На всякий случай вот полный текст.

Код:
void Widget::paintEvent ( QPaintEvent * )  
{
QPixmap pm(10, 10);
if (1) {
QPainter painter(&pm);
painter.fillRect(QRect(0, 0, 10, 10), Qt::green);
painter.fillRect(QRect(0, 0, 1, 10), Qt::red);
painter.drawPixmap(QRect(1, 0, 9, 10), pm, QRect(0, 0, 9, 10));
}
QPainter painter(this);
painter.drawPixmap(QRect(0, 0, 10, 10), pm, QRect(0, 0, 10, 10));
}
Записан
spectre71
Гость
« Ответ #11 : Декабрь 11, 2009, 07:40 »

Попутал (привык left, top, right, bottom Улыбающийся) Но на Mac такого нет, слева 2 красных пикселя (как в debug, так и в release). На всякий случай вот полный текст.

Код:
...

Вполне возможно. Проявление данной ошибки может зависить от компилятора, оптимимизации, ...
Это ошибка подобная той которая получается при копирование области памяти в случае пересечения диапазонов если использовать memcpu вместо memmove.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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