domenica 16 ottobre 2011

Aggiunta di un item ad una combobox solo se questo non e' gia' presente

Un argomento che capita di discutere spesso e' come fare ad iterare fra gli elementi di una combo box, ed eventualmente selezionarne uno o aggiungerlo qualora non sia gia' presente. Ecco la mia personale soluzione.

venerdì 14 ottobre 2011

Se ne va un genio

int main(int argc, char** argv){
    printf("Bye Bye World!");
}

Mentre il mondo è ancora intento a compiangere Steve Jobbs un altro grande genio dell'informatica ci ha lasciati, in modo piu' silenzioso e discreto.
Non è finito sulla bocca di tutti, e molti pensano che non sia finito nemmeno nelle case di tutti. Eppure gli addetti ai lavori sanno che ormai ogni appliance si basa su una sua idea in particolare: Unix.

Grazie di tutto Dennis!


mercoledì 12 ottobre 2011

Qt: Login Dialog con selezione di username da una lista

Ho realizzato una dialog per effettuare il login utente. La dialog in questione consente di inserire username e password manualmente, ma permette anche di specificare una lista di username fra i quali scegliere (es. per lista di utenti prelevata da un database o da impostazioni salvate in precedenza).
Di seguito uno screenshot della dialog, e qui si trova il codice di implementazione.

lunedì 10 ottobre 2011

Qt: centrare una finestra nello schermo

In questo articolo sul Wiki Qt illustro come si possa centrare e dimensionare automaticamente una window sullo schermo. L'esempio in particolare centra e imposta al 90% dello spazio disponibile sullo schermo corrente la finestra. Occorre prestare attenzione all'uso dello schermo corrente (sistemi multischermo e/o multidesktop) e al fatto che la dimensione disponibile non include le eventuali barre/dock visualizzate. Ne consegue che nell'esempio riportato il 90% non è relativo all'intera superficie disegnabile, ma a quella principale del desktop.

venerdì 7 ottobre 2011

PgDay 2011: sempre piu' vicino!

Manca ormai poco piu' di un mese al nuovo PgDay, il quinto, che torna dopo due anni nella sua sede storica di Prato. Sono disponibili i banner per i blog, quindi se si vuole pubblicizzare l'evento non si ha che da incollare uno dei banner disponibili sul proprio sito.

mercoledì 5 ottobre 2011

QPushButton & QAction

Con rammarico e stupore ho scoperto che in Qt i pulsanti QPushButton non possono essere collegati a delle azioni QAction. La cosa è abbastanza strana perche' grosso modo in ogni toolkit grafico che conosco i pulsanti sono configurabili tramite delle azioni. Ovviare al problema non è particolarmente complesso:
  • si definisce una estensione di QPushButton
  • si implementa un metodo per associare al pulsante l'azione e si configura il pulsante di conseguenza
  • si collega ogni evento di modifica dell'azione all'aggiornamento del pulsante
  • si collega l'evento di click del pulsante al trigger dell'azione.
Il codice completo del pulsante, che ho chiamato ActionButton lo si può trovare nel wiki ufficiale Qt.

sabato 1 ottobre 2011

Qt: reboot automatico dell'applicazione

Una delle cose molto comode che il framework Eclipse RCP fornisce out-of-the-box è la capacità di riavviare automaticamente una applicazione. Qt non fornisce nulla del genere, ma non è difficile implementare un meccanismo per il reboot. In questo articolo sul Wiki ufficiale descrivo come implementare efficacemente il reboot. I passi fondamentali sono:
  1. creare una costante che sia associata al valore di uscita reboot
  2. modificare il  ciclo di vita dell'applicazione (main) affinche' usi un loop per processare l'applicazione. Il loop non termina fino a che il valore di uscita dell'applicazione non e' diverso dal valore di reboot.
  3. creare uno slot (ad esempio nella propria main window) per effettuare il reboot.
  4. creare una azione per gestire il reboot e connetterla allo slot di cui sopra.
Il nuovo ciclo main (punto 2) risulta quindi simile al seguente:

int main(int argc, char *argv[])
{
    int currentExitCode = 0;

    do{
        QApplication a(argc, argv);
        MainWindow w;
        w.show();
        currentExitCode = a.exec();

    }while( currentExitCode == MainWindow::EXIT_CODE_REBOOT );

    return currentExitCode;

}

ove ovviamente EXIT_CODE_REBOOT e' la costante definita ed opportunamente inizializzata. La MainWindow avra' uno slot (punto 3) simile al seguente:

void MainWindow::slotReboot()
{
    qDebug() << "Performing application reboot..";
    qApp->exit( MainWindow::EXIT_CODE_REBOOT );
}

e l'azione (punto 4) che gestisce il reboot sara' come la seguente:

    actionReboot = new QAction( this );
    actionReboot->setText( tr("Restart") );
    actionReboot->setIcon( QIcon(":/actions/img/reboot.png" ) );
    actionReboot->setStatusTip( tr("Restarts the application") );
    connect( actionReboot,
             SIGNAL(triggered()),
             this,
             SLOT(slotReboot()) );