В настоящее время я работаю над простой CAD-подобной программой для рисования с использованием Qt и openGL.
Что я делаю, так это то, что я веду список объектов, который находится на холсте. paintGL()
Функция — просто перебирать список и отображать объекты один за другим.
объекты подаются в список через слот drawObject(Object obj)
в котором есть update()
функция для планирования события обновления для обновления сцены.
Теперь я хочу сделать некоторые линии резинкой:
После выбора одной конечной точки линии, всякий раз, когда я перемещаю курсор, mouseMoveEvent()
срабатывает, и он будет генерировать объект для линии и испускать сигнал drawObject(Object)
слот. слот стирает старую линию, рисуя xor, а также рисуя новую линию в режиме xor.
Что я ожидаю, так это то, что каждый раз, когда мышь перемещается, новый объект отображается на сцене. Однако это не так. Например, если я двигаю мышь
быстро, затем перед тем, как функция update () фактически обновит сцену, сработало несколько событий mouseMove, и кажется, что эти события никогда не обрабатываются, то есть объекты соответствия никогда не отправляются на экран. На самом деле программа делает то, что после быстрого перетаскивания резиновой ленты на экране остается много случайных артефактов.
Похоже, это связано с тем, что функция update () класса QOpenGLWidget генерирует событие, информирующее виджет о необходимости перерисовки позднее для повышения производительности.
Во время написания этого вопроса я обнаружил repaint()
функция, которая делает немедленное обновление. Однако отставание довольно существенное: когда я быстро двигаю мышь, линия резиновой ленты не следует.
Итак, мой вопрос, как реализовать рисунок с резинкой, чтобы он мог воспользоваться механизмом update () для повышения производительности, не имея таких глюков на экране?
Я искал вокруг этого, но я мог найти одну статью, рассказывающую об этой быстро движущейся мышке.
Заранее спасибо!
Задача ещё не решена.