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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Antialiasing в QGraphicsView.  (Прочитано 9623 раз)
Иволга
Чайник
*
Offline Offline

Сообщений: 58



Просмотр профиля
« : Август 04, 2016, 16:13 »

Использую тему. Всем хороша, но один минус (может, и больше, но я не нашла пока): линии нулевой толщины расплываются и утолщаются, причём везде по-разному. Мне же нужны максимально тонкие, везде одинаковые. Как это сделать? Отказаться от Antialiasing-а - не вариант.
Записан
Hrundel
Гость
« Ответ #1 : Август 22, 2016, 13:02 »

тоньше чем 1 пиксель все-равно не будет. Антиалиас размазывает так или иначе на поворотах на 2 пикселя. А самый простой метод это опический обман - если толшина линии меньше 1 пикселя то отключают алиасинг и меняют цвет линии на более светлый. Но в значениях линия конечно получает реальный размер (eG: flaot 0.423523)
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #2 : Август 22, 2016, 14:11 »

Использую тему. Всем хороша, но один минус (может, и больше, но я не нашла пока): линии нулевой толщины расплываются и утолщаются, причём везде по-разному. Мне же нужны максимально тонкие, везде одинаковые. Как это сделать? Отказаться от Antialiasing-а - не вариант.
Попробуйте рисовать линии с помощью QPen с установленным void QPen::setCosmetic( true )
Записан
Иволга
Чайник
*
Offline Offline

Сообщений: 58



Просмотр профиля
« Ответ #3 : Сентябрь 27, 2016, 15:01 »

Цитировать
Попробуйте рисовать линии с помощью QPen с установленным void QPen::setCosmetic( true )
Не помогает, к сожалению.  Грустный

Зато пользовательская рамка (RubberBand) рисуется так, как как надо - тонко и не размазывается. Антиалиасинг на неё почему-то не действует. Это потому, что она элемент стиля?
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #4 : Сентябрь 27, 2016, 15:13 »

Не помогает, к сожалению.  Грустный
И не поможет, ибо АА применяется на всю отрисовку.
Единственно можно при отрисовке линий, угол которых кратен 90, АА отключать.
Записан

Qt 5.11/4.8.7 (X11/Win)
Иволга
Чайник
*
Offline Offline

Сообщений: 58



Просмотр профиля
« Ответ #5 : Сентябрь 27, 2016, 15:22 »

Цитировать
Единственно можно при отрисовке линий, угол которых кратен 90, АА отключать.
Но я рисую-то в GraphicsScene, а АА относится к GraphicsView. Даже если я передам сцене указатель на него, это вряд ли поможет, т.к. GraphicsView покажет уже полностью отрисованную сцену, как я это понимаю.
Записан
Иволга
Чайник
*
Offline Offline

Сообщений: 58



Просмотр профиля
« Ответ #6 : Сентябрь 27, 2016, 15:40 »

C RubberBand ситуация обратная - какое перо ни устанавливай, она всегда рисуется в 1 пиксел, и АА на неё не действует.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #7 : Сентябрь 27, 2016, 17:07 »

Но я рисую-то в GraphicsScene, а АА относится к GraphicsView. Даже если я передам сцене указатель на него, это вряд ли поможет, т.к. GraphicsView покажет уже полностью отрисованную сцену, как я это понимаю.
АА относится к QPainter  Подмигивающий
В перегруженном QGraphicsItem::paint() это и делай.
Записан

Qt 5.11/4.8.7 (X11/Win)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Сентябрь 28, 2016, 07:55 »

Зато пользовательская рамка (RubberBand) рисуется так, как как надо - тонко и не размазывается. Антиалиасинг на неё почему-то не действует. Это потому, что она элемент стиля?
Так это прямоугольник, он и без всякого AA хорошо рисуется

Мне же нужны максимально тонкие, везде одинаковые.
Нет такой константы "максимально тонкие". Уменьшая альфу можно имитировать линии тоньше и тоньше, вплоть до полной невидимости. Также одна и та же линия смотрится очень разно при разных цветах фона и самой линии. Картинка "что не устраивает" была бы к месту

Пробовали поиграться с QPen::setWidthF(qreal width) давая width 0.5 или 0.75 ? 
Записан
Иволга
Чайник
*
Offline Offline

Сообщений: 58



Просмотр профиля
« Ответ #9 : Сентябрь 28, 2016, 08:29 »

Цитировать
Так это прямоугольник, он и без всякого AA хорошо рисуется
А у меня ортогональная сетка, и она размазывается.
Цитировать
Нет такой константы "максимально тонкие". Уменьшая альфу можно имитировать линии тоньше и тоньше, вплоть до полной невидимости.
"Максимально тонкие" - значит, 1 пиксел (тоньше быть не может), без альфы и везде одинаково.
Цитировать
Картинка "что не устраивает" была бы к месту
Прикрепила. Фиолетовые линии должны быть в 1 пиксел, а их размазывает на 2.
Цитировать
Пробовали поиграться с QPen::setWidthF(qreal width) давая width 0.5 или 0.75 ?
Попробовала. Не помогает.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #10 : Сентябрь 28, 2016, 09:33 »

А у меня ортогональная сетка, и она размазывается.
Если линии только вертикальные и горизонтальные - то выключите АА, отрисуйте их с толщиной 1 пиксель, а затем, если надо, опять включите АА. Если чем-то не устраивает - поясните почему "это не выход"

"Максимально тонкие" - значит, 1 пиксел (тоньше быть не может), без альфы и везде одинаково.
В программировании не все согласуется с житейским здравым смыслом, напр
Код
C++ (Qt)
if (a != a) {   // такого быть не может !!
..
Очень даже может, да еще и разными способами  Улыбающийся
Записан
Иволга
Чайник
*
Offline Offline

Сообщений: 58



Просмотр профиля
« Ответ #11 : Сентябрь 28, 2016, 09:47 »

Цитировать
Если линии только вертикальные и горизонтальные - то выключите АА, отрисуйте их с толщиной 1 пиксель, а затем, если надо, опять включите АА. Если чем-то не устраивает - поясните почему "это не выход"
Собственно, это мне уже предложили выше (с перегрузкой paint()), буду пробовать.
Записан
Иволга
Чайник
*
Offline Offline

Сообщений: 58



Просмотр профиля
« Ответ #12 : Сентябрь 28, 2016, 10:34 »

Цитировать
В перегруженном QGraphicsItem::paint() это и делай.
Помогло. Спасибо. Смеющийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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