Archive for the ‘Qt’ Category

h1

Desactivar botón “Siguiente” en QWizard

25 enero 2010

En el trabajo estoy desarrollando una aplicación de escritorio que necesita generar una base de datos con Hibernate y los índices de los datos asociados para Hibernate Search, además de ciertas entradas mediante la API Preferences de Java. Como ejecutarlo mediante un script en una aplicación de escritorio da una apariencia un poco cutre 🙂 decidí crear un instalador mediante la clase QWizard de QtJambi. En una de las pantallas se mostraba la típica lista de avances y quería desactivar el botón Siguiente hasta que terminase el proceso. Al principio pensé que mediante el método setEnabled(false) del botón sería suficiente pero no surtía ningún efecto, la solución final es más o menos igual de sencilla: reimplementar el método QWizardPage.isComplete() fijando su retorno mediante una variable booleana. En resumen:

class InstallPage extends QWizardPage {
    private boolean complete;

    @Override
    public boolean isComplete() {
        return complete;
    }

    public void install() {
        // ejecutar los pasos de la instalación
        complete = true;
    }
}

Para volver a activar el botón, en este caso sí funciona el método setEnabled(true).

Anuncios
h1

QtJambi y JUnit (UnsatisfiedLinkError)

6 enero 2010

En el trabajo estoy desarrollando una aplicación con QtJambi, y además de la interfaz, parte del núcleo hace uso de ello para enviar señales con notificaciones de progreso al procesar unos archivos. Al intentar pasar las pruebas de JUnit sobre esta parte recibía siempre la misma excepción:

Exception in thread "main" java.lang.UnsatisfiedLinkError: com.trolltech.qt.internal.QtJambiInternal.fetchSignal(Lcom/trolltech/qt/internal/QSignalEmitterInternal;Ljava/lang/reflect/Field;)Lcom/trolltech/qt/internal/QSignalEmitterInternal$AbstractSignalInternal;

En la lista de correo de QtJambi descubrí algo que debía ser evidente: antes de lanzar las pruebas debía invocar a QApplication.initialize(new String[]{}) (se crea un nuevo array porque no se reciben parámetros explícitos a través de un main). Incluyendo esto en el método setUpBeforeClass ya funcionó todo perfectamente.