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.""" """Initialize pygfx with Qt widget."""
try: try:
import pygfx as gfx import pygfx as gfx
from rendercanvas.qt import RenderCanvas from rendercanvas.qt import RenderWidget
from PySide6.QtWidgets import QVBoxLayout 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._renderer = gfx.renderers.WgpuRenderer(self._canvas)
self._scene = gfx.Scene() self._scene = gfx.Scene()
@@ -112,6 +112,8 @@ class PygfxRenderer(Renderer):
layout.setContentsMargins(0, 0, 0, 0) layout.setContentsMargins(0, 0, 0, 0)
layout.addWidget(self._canvas) layout.addWidget(self._canvas)
self._canvas.request_draw(self._animate)
self._setup_picking() self._setup_picking()
self._initialized = True self._initialized = True
@@ -124,6 +126,11 @@ class PygfxRenderer(Renderer):
traceback.print_exc() traceback.print_exc()
return False 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: def _setup_lighting(self) -> None:
"""Setup scene lighting.""" """Setup scene lighting."""
import pygfx as gfx import pygfx as gfx
@@ -394,7 +401,6 @@ class PygfxRenderer(Renderer):
def render(self) -> None: def render(self) -> None:
"""Trigger a render.""" """Trigger a render."""
if self._initialized: if self._initialized:
self._renderer.render(self._scene, self._camera)
self._canvas.request_draw() self._canvas.request_draw()
def on_pick(self, callback: Callable[[Any], None]) -> None: def on_pick(self, callback: Callable[[Any], None]) -> None: