Risposta breve
L'MVC di Qt si applica solo a una struttura dati . Quando si parla di un MVC applicazione non si deve pensare QAbstractItemModel
o QListView
.
Se si desidera un'architettura MVC per l'intero programma, Qt non dispone di un framework modello / visualizzazione così "enorme". Ma per ogni elenco / albero di dati nel tuo programma puoi usare l'approccio Qt MVC che ha effettivamente un controller nella sua vista. I dati sono all'interno o all'esterno del modello; questo dipende dal tipo di modello che si sta utilizzando (sottoclasse del proprio modello: probabilmente all'interno del modello; ad esempio QSqlTableModel: esterno (ma forse memorizzato nella cache) del modello). Per mettere insieme i tuoi modelli e le tue viste, usa le tue classi che implementano la logica di business .
Risposta lunga
Approccio e terminologia modello / visualizzazione di Qt:
Qt fornisce visualizzazioni semplici per i loro modelli. Hanno un controller integrato: selezionare, modificare e spostare gli elementi sono qualcosa che nella maggior parte dei casi un controller "controlla". Ovvero, interpretare l'input dell'utente (clic e spostamenti del mouse) e impartire i comandi appropriati al modello.
I modelli di Qt sono infatti modelli che hanno dati sottostanti. I modelli astratti ovviamente non contengono dati, poiché Qt non sa come archiviarli. Ma si estende una QAbstractItemModel alle proprie esigenze aggiungendo i vostri contenitori di dati alla sottoclasse e rendendo l'interfaccia modello di accesso ai dati. Quindi in effetti, e presumo che non ti piaccia, il problema è che devi programmare il modello, quindi il modo in cui i dati vengono acceduti e modificati nella tua struttura dati.
Nella terminologia MVC, il modello contiene sia i dati che la logica . In Qt, sta a te includere o meno parte della tua logica di business all'interno del tuo modello o metterla all'esterno, essendo una "vista" a sé stante. Non è nemmeno chiaro cosa si intende per logica: selezionare, rinominare e spostare elementi? => già implementato. Fare calcoli con loro? => Mettilo all'esterno o all'interno della sottoclasse del modello. Memorizzare o caricare dati da / a un file? => Inseriscilo nella sottoclasse del modello.
La mia opinione personale:
E 'molto difficile fornire una buona e sistema generico MV (C) per un programmatore. Poiché nella maggior parte dei casi i modelli sono semplici (ad es. Solo elenchi di stringhe), Qt fornisce anche un QStringListModel pronto per l'uso. Ma se i tuoi dati sono più complessi delle stringhe, sta a te decidere come rappresentare i dati tramite l'interfaccia di visualizzazione / modello Qt. Se hai, ad esempio, una struttura con 3 campi (diciamo persone con nome, età e sesso) potresti assegnare i 3 campi a 3 colonne diverse oa 3 ruoli diversi. Non mi piacciono entrambi gli approcci.
Penso che il framework modello / vista di Qt sia utile solo quando si desidera visualizzare strutture dati semplici . Diventa difficile da gestire se i dati sono di tipo personalizzato o strutturati non in un albero o in un elenco (ad esempio un grafico). Nella maggior parte dei casi, gli elenchi sono sufficienti e anche in alcuni casi un modello dovrebbe contenere una sola voce. Soprattutto se si desidera modellare una singola voce con attributi diversi (un'istanza di una classe), il framework modello / vista di Qt non è il modo giusto per separare la logica dall'interfaccia utente.
Per riassumere, penso che il framework di visualizzazione / modello di Qt sia utile se e solo se i tuoi dati vengono visualizzati da uno dei widget del visualizzatore di Qt . È totalmente inutile se stai per scrivere il tuo visualizzatore per un modello che contiene solo una voce, ad esempio le impostazioni dell'applicazione, o se i tuoi dati non sono di tipo stampabile.
Come ho usato il modello / vista Qt all'interno di un'applicazione (più grande)?
Una volta ho scritto (in un team) un'applicazione che utilizza più modelli Qt per gestire i dati. Abbiamo deciso di creare un DataRole
per contenere i dati effettivi che erano di un diverso tipo personalizzato per ogni diversa sottoclasse del modello. Abbiamo creato una classe di modello esterna chiamata Model
contenente tutti i diversi modelli Qt. Abbiamo anche creato una classe di visualizzazione esterna chiamata View
holding le finestre (widget) che sono collegate ai modelli all'interno Model
. Quindi questo approccio è un Qt MVC esteso, adattato alle nostre esigenze. Entrambe Model
e le View
classi stesse non hanno nulla a che fare con Qt MVC.
Dove abbiamo messo la logica ? Abbiamo creato classi che eseguivano i calcoli effettivi sui dati leggendo i dati dai modelli di origine (quando sono cambiati) e scrivendo i risultati nei modelli di destinazione. Dal punto di vista di Qt, queste classi logiche sarebbero viste, poiché si "connettono" ai modelli (non "vista" per l'utente, ma una "vista" per la parte logica di business dell'applicazione).
Dove sono i controllori ? Nella terminologia MVC originale, i controller interpretano l'input dell'utente (mouse e tastiera) e danno comandi al modello per eseguire l'azione richiesta. Poiché le viste Qt interpretano già l'input dell'utente come rinominare e spostare elementi, ciò non era necessario. Ma ciò di cui avevamo bisogno era un'interpretazione dell'interazione dell'utente che andasse oltre le visualizzazioni Qt.