Creare una nuova classe
Attualmente, il codice della feature di autocompletamento è incluso all'interno della classe UserModel.
L'interazione tra questi elementi, tuttavia, è limitata a due sole funzioni:
- Passare gli username al codice di autocompletamento tramite la Qlist Users;
- Comunicare con il codice QML tramite le chiamate alle nuove proprietà aggiunte alla classe UserModel.
Troppo poco per ammassare tanto codice in un'unica classe.
Anziché acquisire gli username dalla classe UserModel, è meglio ricaricarli direttamente attraverso una chiamata a getpwent.
La comunicazione con il codice QML, invece, deve essere impostata nella classe GreeterApp, che inizializza l'intero programma.
Sono in tutto 5 righe di codice:
$ grep utoCompletion GreeterApp.h GreeterApp.cpp GreeterApp.h: class AutoCompletion; GreeterApp.h: AutoCompletion *m_autoCompletion { nullptr }; GreeterApp.cpp:#include "AutoCompletion.h" GreeterApp.cpp: m_autoCompletion = new AutoCompletion(); GreeterApp.cpp: view->rootContext()->setContextProperty(QStringLiteral("autoCompletion"), m_autoCompletion);
Interessante, in particolare, l'ultima riga. Fa in modo che il codice QML riconosca la chiave autoCompletion per acccedere alle proprietà specifiche della nuova classe (Q_PROPRIETY).
Una classe deve contenere:
- Le proprietà di interazione; - Un costruttore di inizializzazione; - Le funzione specifiche che implementano la feature.
Nel nostro caso le proprietà sono le stesse già descritte in precedenza: auc,C'head e tail.
Il costruttore replica quello della classe Usermodel, ma ha un contenuto vuoto:
AutoCompletion::AutoCompletion(QObject *parent) : QAbstractListModel(parent), d(new AutoCompletionPrivate()) {}
La sua funzione è quella di preparare un puntatore a una classe di tipo QAbstractListModel, affinché (in futuro), l'autocompletamento si possa far carico di costruire dinamicamente la lista utenti, sostituendo l'implementazione statica della classe UserModel.
L'inizializzazione reale della classe AutoCompletion sarà invece delegata alla propretà auC e verrà invocata esclusivamente dai ...