fix: use RenderWidget and add animation callback for camera controls

- Change from RenderCanvas to RenderWidget for embedded Qt widget
- Add _animate() callback for canvas.request_draw()
- Update render() to use request_draw() for continuous rendering
- This enables OrbitController to work properly with mouse events
This commit is contained in:
bklronin
2026-03-14 09:12:12 +01:00
parent 75d4820292
commit 7091f530ee
+9 -3
View File
@@ -92,10 +92,10 @@ class PygfxRenderer(Renderer):
"""Initialize pygfx with Qt widget."""
try:
import pygfx as gfx
from rendercanvas.qt import RenderCanvas
from rendercanvas.qt import RenderWidget
from PySide6.QtWidgets import QVBoxLayout
self._canvas = RenderCanvas(parent=parent_widget)
self._canvas = RenderWidget(parent=parent_widget)
self._renderer = gfx.renderers.WgpuRenderer(self._canvas)
self._scene = gfx.Scene()
@@ -112,6 +112,8 @@ class PygfxRenderer(Renderer):
layout.setContentsMargins(0, 0, 0, 0)
layout.addWidget(self._canvas)
self._canvas.request_draw(self._animate)
self._setup_picking()
self._initialized = True
@@ -124,6 +126,11 @@ class PygfxRenderer(Renderer):
traceback.print_exc()
return False
def _animate(self):
"""Animation callback for the canvas."""
if self._initialized:
self._renderer.render(self._scene, self._camera)
def _setup_lighting(self) -> None:
"""Setup scene lighting."""
import pygfx as gfx
@@ -394,7 +401,6 @@ class PygfxRenderer(Renderer):
def render(self) -> None:
"""Trigger a render."""
if self._initialized:
self._renderer.render(self._scene, self._camera)
self._canvas.request_draw()
def on_pick(self, callback: Callable[[Any], None]) -> None: