Domanda

Il mio obiettivo è quello di creare un client di spessore al database. Fondamentalmente è tutto su come gestire tre liste dei dati.

Vorrei tagliare la mia applicazione in strati disaccoppiati in modo da utilizzare Qt Model / View quadro sembra naturale per me.

  • Quando devo creare istanze QSQL * modello?

ho bisogno di essere in grado di collegare / scollegare da / per le diverse volte di database (ho le voci di menu per questo). Io non sono felice con l'eliminazione di una serie di modelli e la loro creazione, ancora una volta su ogni connessione / disconnessione.

Esiste un approccio alternativo?

  • Dove devo creare istanze QSQL * modello?

Non credo MainWindow o qualsiasi altra classe GUI relativo è dovuto tenere il codice in questo modo:

m_goodsModel->setRelation(1, QSqlRelation("Level", "LevelId", "Name"));

Voglio disaccoppiare l'interfaccia grafica dalla struttura dati. Delle idee come farlo?

  • Quando e dove dovrei legano le mie opinioni a modelli?

Ho bisogno di rappresentare i miei tre liste in una dozzina di modi. Se io ricreare i modelli ogni volta che mi collego / scollegare ho bisogno di iniettare nuovi modelli creati in tutti i punti di vista di nuovo.

Sarebbe bello se potessi farlo solo una volta, ma non ho idea di come.

  • Cosa fare con il metodo QSqlTableModel::select() brutto?

Questo uno mi fa impazzire. A differenza di altri modelli (ad esempio QStringListModel, QFileSystemModel, etc.) in cui i dati sono pronti per usare fuori dalla scatola, modelli derivati ??da QSqlTableModel sono inutili fino manualmente invocare il loro metodo select(). Prima che invocazione il modello è così vuoto come le viste che utilizzano tale modello; i dati di intestazione non viene popolata né, quindi la vista non sa nemmeno quali colonne ha a rendering.

Non posso evitare di select() invocazione Mi chiedo dove dovrei metterla in modo che si adatti bello? Non credo MainWindow o qualsiasi altre classi GUI legati dovrebbe contenere quel codice.

  • Prestazioni e robustezza

Non sono felice di reinizializzare tutto su db riconnessione. Ci vuole troppo tempo per farlo (mi riferisco durante l'esecuzione). Mi piacerebbe anche al fine di evitare incidenti durante il processo di ricreazione modello come i punti di vista possono ancora fare riferimento a loro.

Non c'è nessun altro modo per impostare tutto solo una volta e maniglia riconnessione con grazia?

È stato utile?

Soluzione

Mi sembra che la risposta dritto in avanti a tutte queste domande è quello di avvolgere tutte le azioni correlate di database in una classe dedicata, e tenere un puntatore a un'istanza di questa classe nel vostro MainWindow / Dialog / qualunque cosa.

Un progetto possibile potrebbe essere qualcosa di simile:

class DatabaseAccess : public QObject
{
       Q_OBJECT
    public:
       void connectToDatabase(const QString & hostname, const QString & db, const QString & user, const QString & password);
       void disconnectFromDatabse();

       QAbstractItemModel * getModelForX();
       QAbstractItemModel * getModelForY();

    private:
       QSqlTableModel * modelForX;
       QSqlRelationalTableModel * modelForY;
}

Qui, X e Y sono solo segnaposto per i tipi di query che avete nella vostra applicazione.

È possibile creare i modelli in connectToDatabase() e invocare select() quando hai bisogno di dati freschi nei metodi getModelForX / Y.

Per quanto ne so, non si può continuare ad usare le stesse istanze di modello con diverse connessioni al database, come QSqlTableModel ed i suoi discendenti sono tenuti ad un'istanza QSqlDatabase. Avrete bisogno di aggiornare il tuo parere dopo una connessione riuscita.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top