Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: Иволга от Август 04, 2016, 16:13



Название: Antialiasing в QGraphicsView.
Отправлено: Иволга от Август 04, 2016, 16:13
Использую тему. Всем хороша, но один минус (может, и больше, но я не нашла пока): линии нулевой толщины расплываются и утолщаются, причём везде по-разному. Мне же нужны максимально тонкие, везде одинаковые. Как это сделать? Отказаться от Antialiasing-а - не вариант.


Название: Re: Antialiasing в QGraphicsView.
Отправлено: Hrundel от Август 22, 2016, 13:02
тоньше чем 1 пиксель все-равно не будет. Антиалиас размазывает так или иначе на поворотах на 2 пикселя. А самый простой метод это опический обман - если толшина линии меньше 1 пикселя то отключают алиасинг и меняют цвет линии на более светлый. Но в значениях линия конечно получает реальный размер (eG: flaot 0.423523)


Название: Re: Antialiasing в QGraphicsView.
Отправлено: Old от Август 22, 2016, 14:11
Использую тему. Всем хороша, но один минус (может, и больше, но я не нашла пока): линии нулевой толщины расплываются и утолщаются, причём везде по-разному. Мне же нужны максимально тонкие, везде одинаковые. Как это сделать? Отказаться от Antialiasing-а - не вариант.
Попробуйте рисовать линии с помощью QPen с установленным void QPen::setCosmetic( true )


Название: Re: Antialiasing в QGraphicsView.
Отправлено: Иволга от Сентябрь 27, 2016, 15:01
Цитировать
Попробуйте рисовать линии с помощью QPen с установленным void QPen::setCosmetic( true )
Не помогает, к сожалению.  :(

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


Название: Re: Antialiasing в QGraphicsView.
Отправлено: GreatSnake от Сентябрь 27, 2016, 15:13
Не помогает, к сожалению.  :(
И не поможет, ибо АА применяется на всю отрисовку.
Единственно можно при отрисовке линий, угол которых кратен 90, АА отключать.


Название: Re: Antialiasing в QGraphicsView.
Отправлено: Иволга от Сентябрь 27, 2016, 15:22
Цитировать
Единственно можно при отрисовке линий, угол которых кратен 90, АА отключать.
Но я рисую-то в GraphicsScene, а АА относится к GraphicsView. Даже если я передам сцене указатель на него, это вряд ли поможет, т.к. GraphicsView покажет уже полностью отрисованную сцену, как я это понимаю.


Название: Re: Antialiasing в QGraphicsView.
Отправлено: Иволга от Сентябрь 27, 2016, 15:40
C RubberBand ситуация обратная - какое перо ни устанавливай, она всегда рисуется в 1 пиксел, и АА на неё не действует.


Название: Re: Antialiasing в QGraphicsView.
Отправлено: GreatSnake от Сентябрь 27, 2016, 17:07
Но я рисую-то в GraphicsScene, а АА относится к GraphicsView. Даже если я передам сцене указатель на него, это вряд ли поможет, т.к. GraphicsView покажет уже полностью отрисованную сцену, как я это понимаю.
АА относится к QPainter  ;)
В перегруженном QGraphicsItem::paint() это и делай.


Название: Re: Antialiasing в QGraphicsView.
Отправлено: Igors от Сентябрь 28, 2016, 07:55
Зато пользовательская рамка (RubberBand) рисуется так, как как надо - тонко и не размазывается. Антиалиасинг на неё почему-то не действует. Это потому, что она элемент стиля?
Так это прямоугольник, он и без всякого AA хорошо рисуется

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

Пробовали поиграться с QPen::setWidthF(qreal width) давая width 0.5 или 0.75 ? 


Название: Re: Antialiasing в QGraphicsView.
Отправлено: Иволга от Сентябрь 28, 2016, 08:29
Цитировать
Так это прямоугольник, он и без всякого AA хорошо рисуется
А у меня ортогональная сетка, и она размазывается.
Цитировать
Нет такой константы "максимально тонкие". Уменьшая альфу можно имитировать линии тоньше и тоньше, вплоть до полной невидимости.
"Максимально тонкие" - значит, 1 пиксел (тоньше быть не может), без альфы и везде одинаково.
Цитировать
Картинка "что не устраивает" была бы к месту
Прикрепила. Фиолетовые линии должны быть в 1 пиксел, а их размазывает на 2.
Цитировать
Пробовали поиграться с QPen::setWidthF(qreal width) давая width 0.5 или 0.75 ?
Попробовала. Не помогает.


Название: Re: Antialiasing в QGraphicsView.
Отправлено: Igors от Сентябрь 28, 2016, 09:33
А у меня ортогональная сетка, и она размазывается.
Если линии только вертикальные и горизонтальные - то выключите АА, отрисуйте их с толщиной 1 пиксель, а затем, если надо, опять включите АА. Если чем-то не устраивает - поясните почему "это не выход"

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


Название: Re: Antialiasing в QGraphicsView.
Отправлено: Иволга от Сентябрь 28, 2016, 09:47
Цитировать
Если линии только вертикальные и горизонтальные - то выключите АА, отрисуйте их с толщиной 1 пиксель, а затем, если надо, опять включите АА. Если чем-то не устраивает - поясните почему "это не выход"
Собственно, это мне уже предложили выше (с перегрузкой paint()), буду пробовать.


Название: Re: Antialiasing в QGraphicsView.
Отправлено: Иволга от Сентябрь 28, 2016, 10:34
Цитировать
В перегруженном QGraphicsItem::paint() это и делай.
Помогло. Спасибо. ;D