阅读QSqlTableModel文档,我看到了获取模型的两种方法:
QSqlTableModel *model = new QSqlTableModel(parentObject, database);
和
QSqlTableModel model;
在第二种情况下选择哪个数据库连接?我现在需要一个活动连接吗?
我尝试了第二种方法,让QSqlTableModel model
成为班级成员。
class MyClass {
QSqlTableModel model;
public:
MyClass(){}
public slots:
onDbConnected(){
model.setTable("employee");
bool b = model.select();
}
};
但是model.select()
以这种方式返回false
。
我是否应该这样做(在槽的主体中-不使模型成为类成员)?
QSqlTableModel *model = new QSqlTableModel(parentObject, database);
在第二种情况下选择哪个数据库连接?
选择默认的数据库连接。从QSqlTableModel
的构造器文档中,您可以看到,如果您不指定db
参数,它将默认为QSqlDatabase()
(这是一个空的无效QSqlDatabase
对象):
如果db无效,将使用默认的数据库连接。
在不指定connectionName参数的情况下调用QSqlDatabase::addDatabase()
定义默认连接。
此时是否需要一个活动连接?
两个表单都需要一个有效的数据库连接来供模型使用。您可以查看表模型示例,以获得如何使用该类的示例。
通常,必须在应用程序启动时设置数据库连接。之后,您可以在任何QSqlQuery
/QSqlQueryModel
/QSqlTableModel
中使用此连接…
我是否应该这样做(在槽的主体中-不使模型成为类成员)?
如果您的目标只是将参数传递给成员对象的构造函数,则不需要动态分配对象。这是一个通用的c++连接,你可以在MyClass
的构造函数中传递任何你需要的参数:
class MyClass {
QSqlTableModel model;
public:
MyClass(): model(this, QSqlDatabase::database("mydbconnection")){}
...
两种方法都可以。选择其中一个而不是另一个并不需要与select()
调用失败做任何事情。就我个人而言,如果真的不需要动态分配,我宁愿避免它。你可以看一下这个问题,做一个类似的比较。
model.select()
返回false
这里有一些建议可以帮助解决这个问题:
在构建
QSqlTableModel
之前检查数据库连接是否为open()
检查您在
setTable()
中没有提供错误的表名您可以使用
model.lastError()
获取有关错误的更多信息。qDebug() << model.lastError();