【问题标题】:Subclassing QSqlTableModel to setup database子类化 QSqlTableModel 来设置数据库
【发布时间】:2015-08-02 19:01:11
【问题描述】:

我正在尝试对 QSqlTableModel 进行子类化,以便构造函数设置模型所需的数据库。

我的代码看起来类似于:

MyClass::myClass( QObject* parent, QSqlDatabase data )
    :QSqlTableModel(parent, data)
{
    auto db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName(":memory:");
    if( !db.open() )
    {
        //Some debug info
    }
    if( !database().isOpen() )
    {
        // Some debug info that is called
    }
    qDebug() << database().connectionName();
    qDebug() << db.connectionName();
}

然后构造函数会输出:
""
"qt_sql_default_connection"

为什么两个数据库没有都连接到默认连接?

【问题讨论】:

    标签: qt qsqltablemodel qsqldatabase


    【解决方案1】:

    QSqlDatabase::addDatabase:

    警告:如果您添加与现有连接同名的连接 连接,新连接替换旧连接。如果你打电话给这个 函数不止一次,不指定connectionName,默认 连接将被替换。

    【讨论】:

    • 是的,这就是我想要的,但是调用 QSqlDatabase() 时似乎永远不会建立默认连接。
    • 如果你想让这两个连接到默认连接名,你需要这样做:auto db = QSqlDatabase::database();
    • 但为了让它访问 SQLite 数据库,我需要使用 addDatabase(根据我的示例),这也连接到默认数据库,问题是显然使用 myclass(this,QSqlDatabase::database()) 没有t 创建一个具有默认连接的数据库,但只创建一个具有无效数据库的数据库。
    • 我告诉过你要更改一行。为什么在地球上,你会改变什么?您添加数据库一次,然后使用QSqlDatabase::database 以便之后随时访问这个打开的数据库。
    • 因为我希望子类确保使用和设置 SQLite 数据库,而不是用户。但也许我应该将 addDatabase 添加到初始化或默认参数中......
    【解决方案2】:

    一旦讨论清楚了实际需要什么,答案就很简单了。 在声明中,我只需要使用
    myClass( QObject* parent = nullptr, QSqlDatabase data = QSqlDatabase::addDatabase( "QSQLITE" ) ); 而不是使用
    myClass( QObject* parent = nullptr, QSqlDatabase data = QSqlDatabase::database() ); 现在默认选项是打开一个 SQLite 数据库,如果需要,可以提供另一个数据库。 感谢 Amartel 的精彩讨论

    【讨论】:

      猜你喜欢
      • 2017-01-16
      • 2017-03-21
      • 2021-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-15
      • 2012-08-28
      相关资源
      最近更新 更多