Model view controller Qt厚数据库客户机体系结构
我的目标是为数据库创建一个厚客户端。基本上,它是关于管理三个数据列表的 我想将我的应用程序分为解耦的层,这样使用Qt的模型/视图框架对我来说就很自然了Model view controller Qt厚数据库客户机体系结构,model-view-controller,qt,architecture,coding-style,qtableview,Model View Controller,Qt,Architecture,Coding Style,Qtableview,我的目标是为数据库创建一个厚客户端。基本上,它是关于管理三个数据列表的 我想将我的应用程序分为解耦的层,这样使用Qt的模型/视图框架对我来说就很自然了 我应该何时创建QSql*模型实例 我需要能够多次连接/断开与数据库的连接(我有相应的菜单项)。我不喜欢删除一堆模型,然后在每次连接/断开连接时再次创建它们 有没有其他办法 我应该在哪里创建QSql*模型实例 我不认为MainWindow或任何其他与GUI相关的类应该包含这样的代码: m_goodsModel->setRelation
- 我应该何时创建QSql*模型实例
- 我应该在哪里创建QSql*模型实例
m_goodsModel->setRelation(1, QSqlRelation("Level", "LevelId", "Name"));
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;
}
我想将GUI与数据结构分离。有什么办法吗
- 我应该在何时何地将视图绑定到模型
- 如何处理讨厌的
方法QSqlTableModel::select()
QStringListModel
,QFileSystemModel
等)不同的是,数据可以开箱即用,从QSqlTableModel
派生的模型在手动调用其select()
方法之前是无用的。在调用之前,模型是空的,因此使用该模型的视图也是空的;标题数据也没有填充,因此视图甚至不知道必须呈现哪些列
由于我无法避免调用select()
invocation,我想知道应该把它放在哪里,这样它才合适呢?我不认为MainWindow或任何其他与GUI相关的类应该包含该代码
- 性能和鲁棒性
难道没有其他方法可以一次性设置所有操作并优雅地处理重新连接吗?在我看来,所有这些问题的直接答案都是将所有与数据库相关的操作包装在一个专用类中,并在主窗口/对话框/其他任何地方保留指向此类实例的指针 一种可能的设计可能是这样的:
m_goodsModel->setRelation(1, QSqlRelation("Level", "LevelId", "Name"));
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只是应用程序中查询类型的占位符
当需要getModelForX/Y方法中的新数据时,可以在connectToDatabase()
中创建模型,并调用select()
据我所知,您不能继续使用具有不同数据库连接的相同模型实例,因为
QSqlTableModel
及其继承者绑定到QSqlDatabase
实例。成功连接后,您需要刷新视图。这基本上就是我所做的。但是这种方法并没有解决模型注入和重新创建的问题。我是否需要在每次连接后创建新模型,还是可以重用旧模型?如果我被迫重新创建模型,谁(即什么类/层)负责模型注入?您必须重新创建模型-在连接关闭后,模型将变得无效(请参阅)。注入模型的层是了解视图的层。可能是连接槽中的主窗口。事实上,我没有remove()
QSqlDatabase,我只是close()
it。这有关系吗?是的,打开的查询无论如何都是无效的。