Название: Перекрытие элементов в QPainterPath Отправлено: skaz54 от Декабрь 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) не работает - в месте пересечения элементов остается "дырка" В чем здесь дело - разобраться не могу. Помогите. Заранее спасибо. Название: Re: Перекрытие элементов в QPainterPath Отправлено: Fregloin от Декабрь 06, 2012, 12:05 Сталкивался с подобным, установка флагов ничем не помогла, дырки остаются - скорее всего баг Qt
Название: Re: Перекрытие элементов в QPainterPath Отправлено: Igors от Декабрь 06, 2012, 13:44 Вообще в любой системе если контур само-пересекается, дырки должны быть, это нормально, на это даже рассчитывают. Есть правила (fillRule) по которым определяется что заливать а что нет. Предъявите скриншот, посмотрим
Название: Re: Перекрытие элементов в QPainterPath Отправлено: skaz54 от Декабрь 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 Название: Re: Перекрытие элементов в QPainterPath Отправлено: Igors от Декабрь 06, 2012, 16:00 Возьмем пример из Qt PainterPath в Examples. Так эта замена не эквивалентна - Вы изменили направление обхода. addElipse использует clockwise, arcTo = counter-clockwise. Тот же эффект будет если в исходном примере 360 замените на -360Все работает, как написано, но если заменить строчки 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) не работает - в месте пересечения элементов остается "дырка" Если никакие дырки не нужны - просто создавайте/рисуйте каждый path отдельно Название: Re: Перекрытие элементов в QPainterPath Отправлено: skaz54 от Декабрь 06, 2012, 17:26 Спасибо
|