【问题标题】:c++/Qt: How to get a reference to database in the MainWindow class?c++/Qt:如何在 MainWindow 类中获取对数据库的引用?
【发布时间】:2016-03-04 07:59:27
【问题描述】:

在Qt-creator中,我在一个名为databaseManager的类中创建了SQLite数据库,如下:

QString DatabaseManager::open_db()
{
    QSqlDatabase db;
    QString path = "/Users/me/Documents/workspace/Muasaa/";
    db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName(path+"Database v.1");
    if (db.open()){
        return "Database is created, open, and ready ...";
    } else {
        return db.lastError().text();
    }
}

然后我在MainWindow类的头文件中定义如下:

Public:
   DatabaseManager *db_manager;

在源文件中,我这样称呼它:

db_manager->open_db();

创建并打开数据库。

但是,我想使用对同一数据库的引用,以便在 MainWindow 源文件中的许多函数中使用它。我该怎么做?!

【问题讨论】:

    标签: c++ database qt sqlite qt-creator


    【解决方案1】:

    QSqlDatabase db 变量移动到你的类头中,并添加一个获取它的方法。只要您创建databaseManager 类的实例并在MainWindow 中维护指向它的指针,您就可以检索它。

    【讨论】:

    • 如果我将QSqlDatabase db 移动到头文件,应用程序退出 程序意外结束 !?
    【解决方案2】:

    QSqlDatabase::database() 是一个返回 QSqlDatabase 的静态函数。 如果您有多个数据库,则必须在 addDatabase() 和 database() 中提供连接名称

    【讨论】:

    • 我只有一个数据库,我想在 MainWindow 类中使用它。我想使用 QSqlTableModel 在我的 GUI 中显示它。
    • 在您的 MainWindow 类中使用 QSqlDatabase db = QSqlDatabase::database()。这表示您使用 addDatabase() 建立的连接的数据库。我建议阅读文档和一些示例程序。
    【解决方案3】:

    也许设计解决方案会有所帮助?

    无论您的目标是什么,请考虑将您的 DatabaseManager 类转换为 Singleton。这样您就可以在所有 gui 类中使用您的管理器。类似DatabaseManager::instance()->your_method()

    优点:

    • 您确定以正确的方式管理连接

    • 构建问题的机会更少

    顺便说一句,我不确定,但您的程序崩溃可能是由于在初始化之前使用了 db_manager 指针,可能是在插槽中,或者(更有可能)是内部连接错误。您是否在尽可能少的示例中检查了相同的连接属性?

    【讨论】:

    • QSqlDatabase::addDatabase(...) 和 QSqlDatabase::database(...) 是静态函数,如果你研究文档你会发现数据库连接的内部列表已经是一个单身人士。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-01
    • 1970-01-01
    • 2015-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-11
    相关资源
    最近更新 更多