Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Model view controller Qt厚数据库客户机体系结构_Model View Controller_Qt_Architecture_Coding Style_Qtableview - Fatal编程技术网

Model view controller 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

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

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

  • 我应该何时创建QSql*模型实例
我需要能够多次连接/断开与数据库的连接(我有相应的菜单项)。我不喜欢删除一堆模型,然后在每次连接/断开连接时再次创建它们

有没有其他办法

  • 我应该在哪里创建QSql*模型实例
我不认为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;
}
我想将GUI与数据结构分离。有什么办法吗

  • 我应该在何时何地将视图绑定到模型
我需要用十几种方式来表示我的三个列表。如果每次连接/断开连接时都重新创建模型,则需要再次将新创建的模型注入所有视图

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

  • 如何处理讨厌的
    QSqlTableModel::select()
    方法
这个让我发疯。与其他模型(例如,
QStringListModel
QFileSystemModel
等)不同的是,数据可以开箱即用,从
QSqlTableModel
派生的模型在手动调用其
select()
方法之前是无用的。在调用之前,模型是空的,因此使用该模型的视图也是空的;标题数据也没有填充,因此视图甚至不知道必须呈现哪些列

由于我无法避免调用
select()
invocation,我想知道应该把它放在哪里,这样它才合适呢?我不认为MainWindow或任何其他与GUI相关的类应该包含该代码

  • 性能和鲁棒性
我不愿意在db重新连接时重新初始化所有内容。这样做需要太长时间(我的意思是在执行期间)。我还希望避免在模型重建过程中发生崩溃,因为视图可能仍然会引用它们


难道没有其他方法可以一次性设置所有操作并优雅地处理重新连接吗?

在我看来,所有这些问题的直接答案都是将所有与数据库相关的操作包装在一个专用类中,并在主窗口/对话框/其他任何地方保留指向此类实例的指针

一种可能的设计可能是这样的:

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。这有关系吗?是的,打开的查询无论如何都是无效的。