Estoy desarrollando una aplicación que realiza la adquisición y el trazado de datos, con una frecuencia de actualización objetivo de 60FPS.
Uso un QTreeWidget con 4 columnas para contener la información de las señales. Según el valor actual de cada señal, el QTreeWidgetItem asociado debe actualizar el color de fuente y el fondo. Esta actualización se realiza solo si QTreeWidgetItem está visible.
Hay una congelación clara cuando ocurren las actualizaciones (32 señales visibles en el GIF), y he determinado que la congelación es causada por este código:
if new_background_color is None:
if self._background_color!= self.background(0).color():
self.setBackground(0, self._background_color)
self.setBackground(1, self._background_color)
self.setBackground(2, self._background_color)
self.setBackground(3, self._background_color)
else:
if new_background_color!= self.background(0).color():
self.setBackground(0, new_background_color)
self.setBackground(1, new_background_color)
self.setBackground(2, new_background_color)
self.setBackground(3, new_background_color)
if new_font_color is None:
if self.signal.color!= self.foreground(0).color():
self.setForeground(0, self.signal.color)
self.setForeground(1, self.signal.color)
self.setForeground(2, self.signal.color)
self.setForeground(3, self.signal.color)
else:
if new_font_color!= self.foreground(0).color():
self.setForeground(0, new_font_color)
self.setForeground(1, new_font_color)
self.setForeground(2, new_font_color)
self.setForeground(3, new_font_color)
Como referencia, la trama es fluida cuando deshabilito el fragmento de código anterior
¿Por qué son tan caras esas funciones? ¿Hay alguna alternativa más rápida?
Solución del problema
Lo que realmente sucedió fue que la señal QTreeWidget.itemChanged se conectó a una función que solo debería haber manejado los cambios de estado de verificación, pero los cambios en primer plano y en segundo plano también se trataron de la misma manera, lo que generó ciclos de CPU desperdiciados.
No hay comentarios.:
Publicar un comentario