Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: Kurles от Октябрь 15, 2015, 14:56



Название: QQOpenGLWidget (Qt5.5.0, win32, mingw) + QPainter::drawLine = bug?
Отправлено: Kurles от Октябрь 15, 2015, 14:56
Доброго времени суток.

Есть приложение, написанное на Qt, версия 5.5.0, пробовал так же на свежей 5.5.1 и 5.4.2 (своя картография, основанная на тайлах).
Рисование происходит в методе paintGL(), без использования нативных OpenGL вызовов, только QPainter.
И вот в один прекрасный момент понадобилось на карте рисовать линии, для чего, не мудрствуя лукаво, был выбран QPainterPath + QPainter::drawPath. Но оказалось, что при рисовании некоторые линии вообще не рисуются, некоторые рисуются с не той толщиной линии, что задана в параметрах QPen. При замене drawPath на drawLine ситуация не изменилась.

Для демонстрации написал небольшое приложение, воспроизводящее баг (два виджета, один паинтер, при использовании обычного QWidget бага нет). Приложение во вложении.
Может есть какие пути решения этой проблемы без отказа от QOpenGLWidget, ибо реально разница в скорости значительная по сравнению с QWidget, может надо какие-то дополнительные телодвижения перед отрисовкой делать?


Название: Re: QQOpenGLWidget (Qt5.5.0, win32, mingw) + QPainter::drawLine = bug?
Отправлено: Racheengel от Октябрь 15, 2015, 15:05
Qt 5.5.0, Windows 7, MSVC 2015: не собралось из-за строчки glEnable(GL_MULTISAMPLE);

Закомментировал, собралось и вроде как работает. С одной лишь разницей - линия справа более толстая (на 1-2 пикселя), чем слева. Если значение в комбобоксе меньше 3 - линия слева вообще не видна.

Но - это конкретно на этой машине с конкретной видеокартой. С другими могут быть другие проблемы (например, как у вас).


Название: Re: QQOpenGLWidget (Qt5.5.0, win32, mingw) + QPainter::drawLine = bug?
Отправлено: Kurles от Октябрь 15, 2015, 15:22
Qt 5.5.0, Windows 7, MSVC 2015: не собралось из-за строчки glEnable(GL_MULTISAMPLE);

Закомментировал, собралось и вроде как работает. С одной лишь разницей - линия справа более толстая (на 1-2 пикселя), чем слева. Если значение в комбобоксе меньше 3 - линия слева вообще не видна.

Но - это конкретно на этой машине с конкретной видеокартой. С другими могут быть другие проблемы (например, как у вас).

Там в приложении можно с зажатой мышкой вьюпорт двигать, по умолчанию не видно проблемного участка.
Попробуйте всю кривую проследить с толщиной линии 3 и 4.


Название: Re: QQOpenGLWidget (Qt5.5.0, win32, mingw) + QPainter::drawLine = bug?
Отправлено: Kurles от Октябрь 15, 2015, 16:15
Поигрался еще с проблемой.

Дело в QPainter::translate.

перед рисованием делаю tanslate на QPoint(-42336200,-18989600) для паинтера - и вылезает данное поведение.
А если делать translate не для паинтера, а для QPainterPath, то рисуется всё нормально. Такие дела, явный баг.