QSqlTableModel:构建后更改数据库

QSqlTableModel: change database after constructing

我正在创建一个应用程序,它使用 QSqlDatabase 和 QSqlTableModel 从 SQLite 数据库文件中插入和保留数据。

正在MyApplication中创建数据库实例:

MyApplication.h

#include <QSqlDatabase>

// ...

class MyApplication
{
public:
    // ....
private:
    QSqlDatabase _database;
};

MyApplication.cpp

MyApplication::start()
{
    // ...
    _database = QSqlDatabase::database();
    // ...
}

对于数据模型处理,我使用了重载的 class QSqlTableModel:

SqlContactModel.h

#include <QSqlTableModel>

class SqlContactModel : public QSqlTableModel
{
public:
    // ...

    void setDatabase(const QSqlDatabase& database) { _database = database };

private:
    QSqlDatabase _database;
};

SqlContactModel重载了data()roleNames()等典型方法

我的 SqlContactModel 实例在 QML 中使用,因此我在我的 main.cpp 中创建实例如下:

main.cpp

int main()
{
    // ...
    qmlRegisterType<SqlContactModel>("io.taibsu.qxmt", 1, 0, "SqlContactModel");
}

现在由于它是通过 qmlRegisterType 创建的,我无法在构造函数中传递任何参数来在 SqlContactModel.

中设置不同的数据库

我需要将不同的数据库传递给它,因为我正在使用多个不同的重载 QSqlTableModel classes(例如,另一个 class 被称为 SqlConversationModel 并且应该使用在 MyApplication).

中使用的相同 _database 实例

现在有两种方法可以解决这个问题:要么通过 QML 以某种方式将数据库传递给我的 SqlTableModel 子classes,要么找到另一种方法告诉 TableModel 不要使用它自己的数据库实例,而是使用已经存在的数据库实例那里。

现在我的问题是:

  1. 如何在不同的 table 模型中使用同一个数据库?
  2. 在QML中构造class实例时是否有传递参数的方法?

最好的方法可能是在 C++ 中从控制器 class 设置数据库,正确地为该控制器提供一个(只读和常量)contactsModel 并公开控制器作为 QML 的单例。通过这种方式,您可以从 C++(您的业务逻辑所属的位置)设置数据库,同时您可以从 QML 访问您的数据。可能甚至不需要 属性 是 QAbstractItemModel* 之外的另一种类型,因此如果将来需要,您可以自由地将其修改为另一种模型类型,而不会影响您的 QML。这种解耦是可取的。