代码之家  ›  专栏  ›  技术社区  ›  Ihor Kaharlichenko

Qt厚数据库客户机体系结构

  •  2
  • Ihor Kaharlichenko  · 技术社区  · 14 年前

    我的目标是为数据库创建一个厚客户端。基本上,这都是关于管理三个数据列表。

    我想将我的应用程序分割成解耦的层,这样使用Qt的模型/视图框架对我来说就很自然了。

    • 我应该何时创建QSql*模型实例?

    有别的办法吗?

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

    我想将GUI与数据结构分离。你知道怎么做吗?

    • 何时何地将视图绑定到模型?

    我需要用多种方式来表达我的三份清单。如果每次连接/断开连接时都重新创建模型,则需要将新创建的模型再次注入到所有视图中。

    如果我能做一次就好了,但我不知道怎么做。

    • 怎么处理这些讨厌的东西 QSqlTableModel::select() 方法?

    QStringListModel , QFileSystemModel 等)在数据现成可用的情况下,从 QSqlTableModel select()

    因为我无法避免

    • 性能和鲁棒性

    我不乐意在db重新连接时重新初始化所有内容。这要花很长时间(我是说在执行期间)。我也希望在模型制作过程中避免碰撞,因为视图可能仍然会引用它们。

    难道没有其他方法可以把所有的东西都设置一次,然后优雅地处理重新连接吗?

    1 回复  |  直到 14 年前
        1
  •  1
  •   IgKh    14 年前

    可能的设计如下:

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

    在这里,X和Y只是应用程序中查询类型的占位符。

    您可以在中创建模型 connectToDatabase() 并调用 select()

    据我所知,您不能继续使用相同的模型实例和不同的数据库连接,因为 QSqlTableModel 它的死者必须 QSqlDatabase 实例。连接成功后,您需要刷新视图。