QT表模型示例

Qt Table Model Example

本文关键字:模型 QT      更新时间:2023-10-16

我正在看qt示例"表模型示例"

在该示例中,连接的createConnection()方法。h包含以下代码:

static bool createConnection()
{
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName(":memory:");
    if (!db.open()) {...

我在代码中重复了此示例。我不明白这2件事。

  1. 局部变量db在createConnection()函数末尾被破坏(请参见RAII)。由于我的数据库不需要初始化,也不使用" DB"变量,因此我看不出为什么需要此代码。但是,如果删除它,我的程序将无法从现有数据库中读取。我希望DB的破坏将关闭数据库并使其无法使用。但是,由于我不触摸数据库变量,为什么需要创建它,然后在访问数据库之前被销毁?由于我在任何地方都不使用DB变量,并且在调用代码之前被破坏了,因此我看不出为什么我需要调用createConnection()函数。另一方面,我看不到如何打开数据库并导致可变破坏具有例外安全RAII代码。

  2. 我永远不会让db.open()失败。如果我没有数据库,它会创建它,然后打开一个空白。如果我确实有数据库,它将打开它。我有一个数据库,如果出于任何原因无法打开,我不想创建它,我想要一个错误,因为某些事情是严重的错误。打开空白数据库只对我来说是麻烦。我该如何处理这种情况?

我是QT的新手,但在C 方面非常有经验。这个代码对我来说毫无意义。我希望DB变量的寿命是开放数据库的寿命。如示例中所述,我看不到该代码没有资源泄漏。据我所知,初始化DB可以打开某种全球资源,即使在DB变量被破坏导致泄漏后,它也可以保持打开状态。

这很令人困惑。

thx。

h os tile

这只是一个小例子。

  1. QSqlDatabase::addDatabase("QSQLITE");将创建默认连接,任何后续查询都不会明确命名另一个连接。范围范围内将不会破坏连接。在此示例中,createConnection()将用于初始化inmemory数据库。该连接可以在以后使用QSqlDatabase::database()检索。在标准应用中,一个人可能会将QSqlDatabase db作为类成员保持。

  2. 使用Inmemory DB仅创建一个空的DB,就像用于基于SQLite-File的DB一样。如果要检查现有文件(db),请使用QFile::exists(QString path)

如果要打开许多数据库(QSqlDatabase::addDatabase("QSQLITE","anotherConnectionName");上使用不同的连接名称,您将有泄漏。否则,您只是在覆盖默认数据库连接。Qapplication本身将保持连接。可以使用QSqlDatabase::removeDatabase();

QSqlDatabase是一个相当奇怪的类。阅读其文档。连接持续存在,QSqlDatabase是它的手柄。命名连接,addDatabase返回具有给定名称的连接,如果不存在,则可以选择创建它。您可以拥有任何数量的QSqlDatabase对象表示一个连接。

由于SQLITE内存数据库是特定于您的流程的,因此在您要求时不创建它几乎没有意义。您提前创建它的唯一方法是从您的过程中直接使用SQLite API。这些数据库不持续。这里的行为非常明智。