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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Перекрытие элементов в QPainterPath  (Прочитано 5111 раз)
skaz54
Новичок

Offline Offline

Сообщений: 14


Просмотр профиля
« : Декабрь 05, 2012, 08:13 »

Здравствуйте.

На QPainterPath добавляю несколько элементов. Иногда они могут пересекаться.
Чтобы общая область так же была прорисована устанавливаю для QPainterPath значение setFillRule в значение Qt::WindingFill.
Все вроде работает.

Возьмем пример из Qt PainterPath в Examples.
Все работает, как написано, но если заменить строчки

    groupPath.moveTo(60.0, 40.0);
    groupPath.arcTo(20.0, 20.0, 40.0, 40.0, 0.0, 360.0);



на строку

    groupPath.addEllipse(20, 20, 40, 40);

После замены строк значение setFillRule(Qt::WindingFill) не работает - в месте пересечения элементов остается "дырка"

В чем здесь дело - разобраться не могу.

Помогите.
Заранее спасибо.
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #1 : Декабрь 06, 2012, 12:05 »

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

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Декабрь 06, 2012, 13:44 »

Вообще в любой системе если контур само-пересекается, дырки должны быть, это нормально, на это даже рассчитывают. Есть правила (fillRule) по которым определяется что заливать а что нет. Предъявите скриншот, посмотрим
Записан
skaz54
Новичок

Offline Offline

Сообщений: 14


Просмотр профиля
« Ответ #3 : Декабрь 06, 2012, 14:58 »

Показываю скриншоты (по порядку).
1. Исходный код примера - значение параметра fillRule = OddEvenFill. Во втором и третьем ряду третья колонка наблюдается "дыра" в месте перекрытия элементов.

2. Исходный код примера - значение параметра fillRule = WindingFill. Во втором и третьем ряду третья колонка наблюдается отсутствие "дыр" в месте перекрытия элементов.

3. Модифицированный код примера - строки
groupPath.moveTo(60.0, 40.0);
groupPath.arcTo(20.0, 20.0, 40.0, 40.0, 0.0, 360.0);

заменил на строку
groupPath.addEllipse(20, 20, 40, 40);
Изменения касаются третьего элемента во второй строке. Значение параметра fillRule = OddEvenFill. Во втором и третьем ряду третья колонка наблюдается "дыра" в месте перекрытия элементов.

4. Модифицированный код примера. Значение параметра fillRule = WindingFill. Во втором ряду третья колонка "дыра" осталась. В третьем ряду третья колонка "дыра"отсутствует.

Windows XP, QT 4.7
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Декабрь 06, 2012, 16:00 »

Возьмем пример из Qt PainterPath в Examples.
Все работает, как написано, но если заменить строчки

    groupPath.moveTo(60.0, 40.0);
    groupPath.arcTo(20.0, 20.0, 40.0, 40.0, 0.0, 360.0);



на строку

    groupPath.addEllipse(20, 20, 40, 40);

После замены строк значение setFillRule(Qt::WindingFill) не работает - в месте пересечения элементов остается "дырка"
Так эта замена не эквивалентна - Вы изменили направление обхода. addElipse использует clockwise, arcTo =  counter-clockwise. Тот же эффект будет если в исходном примере 360 замените на -360

Если никакие дырки не нужны - просто создавайте/рисуйте каждый path отдельно
« Последнее редактирование: Декабрь 06, 2012, 16:04 от Igors » Записан
skaz54
Новичок

Offline Offline

Сообщений: 14


Просмотр профиля
« Ответ #5 : Декабрь 06, 2012, 17:26 »

Спасибо
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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