Pregunta

Mi objetivo es crear un cliente pesado a la base de datos. Básicamente es todo acerca de la gestión de tres listas de datos.

Me gustaría cortar mi aplicación en capas desacoplados por lo que usar Modelo / Vista marco de Qt me parece natural.

  • ¿Cuándo debo crear instancias QSQL * Modelo?

Tengo que ser capaz de conectar / desconectar a / desde la base de datos varias veces (tengo elementos de menú para eso). No estoy feliz con la eliminación de un montón de modelos y la creación de ellos una vez más a todos los / desconexión de conexión.

¿Hay algún enfoque alternativo?

  • ¿Dónde debería crear instancias QSQL * Modelo?

No creo MainWindow o cualquier otra clase de interfaz gráfica de usuario relacionada se supone que mantenga el código como el siguiente:

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

Quiero desacoplar la interfaz gráfica de usuario de la estructura de datos. Alguna idea de cómo hacer eso?

  • ¿Cuándo y dónde debería unen mis puntos de vista a los modelos?

necesito para representar mis tres listas en una docena de formas. Si recrear los modelos cada vez que conectar / desconectar necesitaré para inyectar modelos de nueva creación en todos los puntos de vista de nuevo.

Sería muy bueno si pudiera hacer que sólo una vez, pero no tengo ni idea de cómo.

  • ¿Qué hacer con el método QSqlTableModel::select() desagradable?

Éste me saca de quicio. En contraste con otros modelos (por ejemplo QStringListModel, QFileSystemModel, etc.) donde los datos está listo para usar fuera de la caja, modelos derivados de QSqlTableModel son inútiles hasta que manualmente invocar su método select(). Antes de que la invocación del modelo es tan vacío como las vistas utilizando ese modelo; los datos de cabecera no se rellena o bien, por lo que la vista no tiene ni siquiera saber qué columnas qué tiene que hacer.

Como no puedo evitar select() invocación Me pregunto dónde debería decirlo para que se ajuste agradable? No creo MainWindow o cualquier otro clases relacionadas con GUI deben contener ese código.

  • El rendimiento y la robustez

No estoy feliz de reinicializar todo después de la reconexión db. Se tarda demasiado tiempo para hacer eso (me refiero durante la ejecución). También me gustaría para evitar choques durante el proceso de reconstrucción modelo como las vistas todavía pueden referirse a ellos.

¿No hay ninguna otra manera de configurar todo sola vez y reconexión mango con gracia?

¿Fue útil?

Solución

Me parece que la respuesta directa a todas estas preguntas es envolver todas las acciones relacionadas con la base de datos en una clase dedicada, y mantenga un puntero a una instancia de esta clase en su MainWindow / diálogo / lo que sea.

Un diseño posible podría ser algo como esto:

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;
}

Aquí, X e Y son sólo marcadores de posición para los tipos de consultas que tiene en su aplicación.

Se puede crear sus modelos en connectToDatabase() e invocar select() cuando se necesita nuevos datos en los métodos getModelForX / Y.

Por lo que yo sé, no se puede seguir usando las mismas instancias de modelo con diferentes conexiones de bases de datos, como QSqlTableModel y sus descendientes están obligados a una instancia QSqlDatabase. Usted necesita refrescar su opinión después de una conexión exitosa.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top