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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QQOpenGLWidget (Qt5.5.0, win32, mingw) + QPainter::drawLine = bug?  (Прочитано 3317 раз)
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« : Октябрь 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, может надо какие-то дополнительные телодвижения перед отрисовкой делать?
Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #1 : Октябрь 15, 2015, 15:05 »

Qt 5.5.0, Windows 7, MSVC 2015: не собралось из-за строчки glEnable(GL_MULTISAMPLE);

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

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

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« Ответ #2 : Октябрь 15, 2015, 15:22 »

Qt 5.5.0, Windows 7, MSVC 2015: не собралось из-за строчки glEnable(GL_MULTISAMPLE);

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

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

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

Код
C++ (Qt)
while(!asleep()) sheep++;
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« Ответ #3 : Октябрь 15, 2015, 16:15 »

Поигрался еще с проблемой.

Дело в QPainter::translate.

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

Код
C++ (Qt)
while(!asleep()) sheep++;
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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