Il dialogo: differenze tra le versioni
(→refuso) |
m (→aggiornamento link dopo la prima revisione) |
||
(7 versioni intermedie di uno stesso utente non sono mostrate) | |||
Riga 1: | Riga 1: | ||
==Come funziona il lato C++== | ==Come funziona il lato C++== | ||
+ | |||
+ | Per ogni richiesta dello script qml, è necessaria una risposta in codice C++. | ||
+ | |||
+ | Nel nostro caso, il dialogo si sviluppa all'interno della classe UserModel, contenuta nei file [https://github.com/cloc3/sddm/blob/autoCompletion-v1/src/greeter/UserModel.h UserModel.h] e [https://github.com/cloc3/sddm/blob/autoCompletion-v1/src/greeter/UserModel.cpp UserModel.cpp]. | ||
+ | |||
+ | Questa classe, infatti, viene lanciata all'avvio del greeter, accede al file /etc/passwd tramite il programma di libreria getpwent e costruisce la lista utenti nella classe UserModelPrivate. | ||
+ | |||
+ | Per sincronizzare il dialogo con il codice qml è necessario creare tre nuove [http://doc.qt.io/qt-5/properties.html Q_PROPERTY]: | ||
+ | |||
+ | 42 Q_PROPERTY(int initAutoCompletion READ initAutoCompletion CONSTANT) | ||
+ | 43 Q_PROPERTY(QString tail READ tail WRITE setTail) | ||
+ | 44 Q_PROPERTY(QString head READ head WRITE setHead) | ||
+ | |||
+ | Per ciascuna Q_PROPERTY deve esistere ''almeno'' un metodo in lettura che restituisce una risposta con il formato opportuno (int oppure QString).<br> | ||
+ | La proprietà '''initAutoCompletion''', ad esempio, è una variabile ''costante'' in sola lettura, che viene invocata una sola volta e restituisce il valore zero.<br> | ||
+ | Volendo, potrebbe restituire un valore numerico indicativo di un particolare stato di uscita. | ||
+ | |||
+ | Le variabili '''head''' e '''tail''', invece, hanno una funzione più complessa, che non ammette una uscita costante. | ||
+ | 290 QString UserModel::tail() {return privateTail;} | ||
+ | 291 QString UserModel::head() {return privateHead;} | ||
+ | 292 void UserModel::setTail(QString tail) {return;} | ||
+ | 293 void UserModel::setHead(QString inputString) { | ||
+ | 294 QChar inputChar=inputString.at(0); | ||
+ | ... un sacco di codice | ||
+ | 326 } | ||
+ | |||
+ | il metodo '''head''' e il metodo '''tail''' permettono al programma qml di leggere il contenuto corrente delle variabili private ''privateHead'' e '' privateTail'', che viene aggiornato ad ogni nuovo inserimento di una lettera nel campo degli username.<br> | ||
+ | Il metodo '''setTail''' è una chiamata fake, necessaria per indurre l'ambiente qt a trattare '''head''' come un parametro variabile e non come una costante. | ||
+ | |||
+ | Il metodo '''setHead''' si fa carico del lavoro grosso.<br> | ||
+ | Infatti, acquisisce il nuovo carattere in ingresso, aggiorna il contenuto della variabile '''head''', cioè il valore corrente della chiave di ricerca e gestisce la funzione di completamento, al termine della quale viene aggiornato il valore di ''privateTail''. | ||
[[Una_patch_ad_SDDM| torna all'indice]] | [[Una_patch_ad_SDDM| torna all'indice]] |
Versione attuale delle 00:06, 16 ago 2016
Come funziona il lato C++
Per ogni richiesta dello script qml, è necessaria una risposta in codice C++.
Nel nostro caso, il dialogo si sviluppa all'interno della classe UserModel, contenuta nei file UserModel.h e UserModel.cpp.
Questa classe, infatti, viene lanciata all'avvio del greeter, accede al file /etc/passwd tramite il programma di libreria getpwent e costruisce la lista utenti nella classe UserModelPrivate.
Per sincronizzare il dialogo con il codice qml è necessario creare tre nuove Q_PROPERTY:
42 Q_PROPERTY(int initAutoCompletion READ initAutoCompletion CONSTANT) 43 Q_PROPERTY(QString tail READ tail WRITE setTail) 44 Q_PROPERTY(QString head READ head WRITE setHead)
Per ciascuna Q_PROPERTY deve esistere almeno un metodo in lettura che restituisce una risposta con il formato opportuno (int oppure QString).
La proprietà initAutoCompletion, ad esempio, è una variabile costante in sola lettura, che viene invocata una sola volta e restituisce il valore zero.
Volendo, potrebbe restituire un valore numerico indicativo di un particolare stato di uscita.
Le variabili head e tail, invece, hanno una funzione più complessa, che non ammette una uscita costante.
290 QString UserModel::tail() {return privateTail;} 291 QString UserModel::head() {return privateHead;} 292 void UserModel::setTail(QString tail) {return;} 293 void UserModel::setHead(QString inputString) { 294 QChar inputChar=inputString.at(0); ... un sacco di codice 326 }
il metodo head e il metodo tail permettono al programma qml di leggere il contenuto corrente delle variabili private privateHead e privateTail, che viene aggiornato ad ogni nuovo inserimento di una lettera nel campo degli username.
Il metodo setTail è una chiamata fake, necessaria per indurre l'ambiente qt a trattare head come un parametro variabile e non come una costante.
Il metodo setHead si fa carico del lavoro grosso.
Infatti, acquisisce il nuovo carattere in ingresso, aggiorna il contenuto della variabile head, cioè il valore corrente della chiave di ricerca e gestisce la funzione di completamento, al termine della quale viene aggiornato il valore di privateTail.