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 不要使用它自己的数据库实例,而是使用已经存在的数据库实例那里。
现在我的问题是:
- 如何在不同的 table 模型中使用同一个数据库?
- 在QML中构造class实例时是否有传递参数的方法?
最好的方法可能是在 C++ 中从控制器 class 设置数据库,正确地为该控制器提供一个(只读和常量)contactsModel 并公开控制器作为 QML 的单例。通过这种方式,您可以从 C++(您的业务逻辑所属的位置)设置数据库,同时您可以从 QML 访问您的数据。可能甚至不需要 属性 是 QAbstractItemModel* 之外的另一种类型,因此如果将来需要,您可以自由地将其修改为另一种模型类型,而不会影响您的 QML。这种解耦是可取的。
我正在创建一个应用程序,它使用 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 不要使用它自己的数据库实例,而是使用已经存在的数据库实例那里。
现在我的问题是:
- 如何在不同的 table 模型中使用同一个数据库?
- 在QML中构造class实例时是否有传递参数的方法?
最好的方法可能是在 C++ 中从控制器 class 设置数据库,正确地为该控制器提供一个(只读和常量)contactsModel 并公开控制器作为 QML 的单例。通过这种方式,您可以从 C++(您的业务逻辑所属的位置)设置数据库,同时您可以从 QML 访问您的数据。可能甚至不需要 属性 是 QAbstractItemModel* 之外的另一种类型,因此如果将来需要,您可以自由地将其修改为另一种模型类型,而不会影响您的 QML。这种解耦是可取的。