Russian Qt Forum
Ноябрь 01, 2024, 05:36
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
2D и 3D графика
>
Перекрытие элементов в QPainterPath
Страниц: [
1
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Перекрытие элементов в QPainterPath (Прочитано 5103 раз)
skaz54
Новичок
Offline
Сообщений: 14
Перекрытие элементов в QPainterPath
«
:
Декабрь 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
Сообщений: 1025
Re: Перекрытие элементов в QPainterPath
«
Ответ #1 :
Декабрь 06, 2012, 12:05 »
Сталкивался с подобным, установка флагов ничем не помогла, дырки остаются - скорее всего баг Qt
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Перекрытие элементов в QPainterPath
«
Ответ #2 :
Декабрь 06, 2012, 13:44 »
Вообще в любой системе если контур само-пересекается, дырки должны быть, это нормально, на это даже рассчитывают. Есть правила (fillRule) по которым определяется что заливать а что нет. Предъявите скриншот, посмотрим
Записан
skaz54
Новичок
Offline
Сообщений: 14
Re: Перекрытие элементов в QPainterPath
«
Ответ #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
Сообщений: 11445
Re: Перекрытие элементов в QPainterPath
«
Ответ #4 :
Декабрь 06, 2012, 16:00 »
Цитата: skaz54 от Декабрь 05, 2012, 08:13
Возьмем пример из 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
Сообщений: 14
Re: Перекрытие элементов в QPainterPath
«
Ответ #5 :
Декабрь 06, 2012, 17:26 »
Спасибо
Записан
Страниц: [
1
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...