Una de las decisiones mas significativas en el desarrollo de Llama CPP Launcher fue la migracion completa de wxWidgets a Qt6. Este post documenta el proceso, las razones y los resultados de este cambio arquitectonico.

¿Por que Migrar?

La version original del launcher utilizaba wxWidgets como framework de interfaz grafica. Aunque wxWidgets es un framework maduro y funcional, presenta limitaciones importantes para este tipo de aplicacion:

  • Estilo visual desactualizado — wxWidgets tiene un aspecto nativo que, aunque correcto, carece de la modernidad visual que Qt6 ofrece con sus temas y estilos personalizables
  • Limitaciones en widgets personalizados — La creacion de componentes personalizados como graficos de GPU en tiempo real es mas compleja en wxWidgets
  • Soporte para animaciones — Qt6 ofrece un sistema de animaciones integrado que facilita la creacion de interfaces fluidas
  • Ecosistema de herramientas — Qt Creator y las herramientas de desarrollo de Qt son superiores para depuracion y diseño de interfaces

La Decision: Qt6 Nativo

Se decidio por la Opcion B: reescritura completa a Qt6 nativo, no solo un cambio del backend. Esto significa:

  • Toda la interfaz fue reescrita desde cero con Qt Widgets y Qt Stylesheets
  • Sistema de senales y slots de Qt reemplazo el sistema de eventos de wxWidgets
  • Layouts de Qt reemplazaron los sizers de wxWidgets para un mejor control del posicionamiento
  • QStylesheets permitieron personalizacion visual avanzada

Componentes Migrados

ConfigManager

El primer componente migrado fue ConfigManager, responsable de persistir la configuracion de la aplicacion. Se mantuvo la logica de negocio pero se adapto a Qt6:

  • Uso de QSettings para persistencia nativa en Linux
  • Serializacion de configuraciones de modelos y servidores
  • Gestion de rutas de carpetas para escaneo de modelos

ProcessManager

El gestor de procesos fue completamente reescrito para aprovechar las capacidades de Qt6:

  • QProcess para gestion de procesos del servidor con mejor control de E/S
  • Senales y slots para comunicacion asincrona entre componentes
  • QTimer para monitoreo periodico del estado de los procesos

GpuMonitor y GpuGraph

Los componentes de monitorizacion de GPU fueron recreados con Qt6:

  • QCustomPlot o implementacion personalizada con QPainter para graficos en tiempo real
  • QTimer para actualizacion periodica de estadisticas
  • Modelo-Vista de Qt para separacion de datos y presentacion

MainWindow

La ventana principal fue disenada desde cero con Qt6:

  • QMainWindow como base con barra de herramientas y statusBar
  • QSplitter para paneles redimensionables
  • QTabWidget para organizar funcionalidades
  • QStylesheets para tema visual personalizado

Desafios de la Migracion

Paradigma de Eventos

El cambio mas fundamental fue pasar del modelo de eventos de wxWidgets al sistema de senales y slots de Qt6:

  • wxWidgets: Event tables con macros BEGIN_EVENT_TABLE
  • Qt6: Conexiones explicitas con QObject::connect() o la sintaxis moderna con lambdas

Gestion de Memoria

Qt6 tiene un sistema de ownership diferente:

  • Parent-child ownership — Los widgets hijos son automaticamente eliminados por el padre
  • QPointer — Punteros seguros que se invalidan al destruir el objeto apuntado
  • deleteLater() — Eliminacion segura en el hilo de eventos

Layouts vs Sizers

Aunque ambos sistemas cumplen la misma funcion, tienen filosofias diferentes:

  • wxWidgets Sizers — Mas explicitos, control manual de proporciones
  • Qt Layouts — Mas automaticos, mejor manejo de responsividad

Resultados de la Migracion

Mejoras Visuales

  • Interfaz moderna — Qt6 permite estilos CSS-like con QStylesheets
  • Temas personalizables — Cambio entre tema claro y oscuro sin recompilar
  • Animaciones fluidas — Transiciones suaves entre estados de la interfaz

Mejoras Tecnicas

  • Mejor rendimiento — Qt6 es mas eficiente en rendering y gestion de eventos
  • Depuracion avanzada — Qt Creator ofrece herramientas superiores de depuracion
  • Documentacion extensa — Qt6 tiene una de las mejores documentaciones del ecosistema C++

Preparacion para el Futuro

  • Portabilidad mejorada — Qt6 facilita futuros ports a Windows y macOS
  • Escalabilidad — El sistema de componentes de Qt6 facilita agregar nuevas funcionalidades
  • Comunidad activa — Qt6 tiene una comunidad grande y activa para soporte

Lecciones Aprendidas

  • Planificar la migracion — No intentar migrar todo a la vez; hacerlo componente por componente
  • Preservar la logica de negocio — La logica de procesos y configuracion se mantiene, solo cambia la capa de presentacion
  • Probar continuamente — Cada componente migrado debe probarse individualmente antes de integrar
  • Aprovechar Qt6 al maximo — No solo replicar wxWidgets en Qt6; usar las capacidades nativas de Qt

Conclus

La migracion a Qt6 fue una decision acertada que modernizo significativamente Llama CPP Launcher. Aunque el esfuerzo fue considerable — una reescritura completa de la interfaz — los beneficios en terminos de experiencia visual, rendimiento y mantenibilidad justifican plenamente la inversion.

Este proceso demuestra que a veces es necesario dar un paso atras para dar dos adelante, especialmente cuando el framework actual limita el potencial del proyecto.