1

我有一个关于在 Qt 中使用数据库的问题。

在其他语言中,我会做一些事情,比如在主类中创建一个数据库,并将这个数据库的指针传递给其他类以使用。

我一直在玩Qt,似乎如果我在主类中初始化一个数据库,那么我可以在任何其他类中编写和执行一个查询,它将使用这个数据库,我有点困惑,因为似乎有没有参考数据库。

有人可以为我解释一下吗:)

这是在 MainWindow.cpp 中实例化的数据库类

#include "database.h"

Database::Database()
{
    Connect();
}

void Database::Connect()
{
    db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("mydatabase­.dat");

    if(db.open()){
        qDebug() << "Connected";
    }
    else
    {
         qDebug() << "Not Connected";
    }
}

bool Database::SetupTables()
{
    QSqlQuery qry;

    qry.exec("CREATE TABLE patients ( patient_id INT, firstname VARCHAR(100), lastname VARCHAR(100) );  ");

    return true;
}

这是我创建的一个名为 PatientList 的窗口(小部件)

#include "patientlist.h"
#include "ui_patientlist.h"
#include "database.h"
#include <QtSql>
#include <QtDebug>

PatientList::PatientList(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::PatientList)
{
    ui->setupUi(this);

    QSqlQuery qry;
    if(qry.exec("SELECT patient_id,firstname,lastname FROM patients")){
        qDebug() << "Success";
    }
    else
    {
        qDebug() << "Error";
    }

}

PatientList::~PatientList()
{
    delete ui;
}

这一切都很好,但我只是觉得我做错了什么,因为我没有提到在 MainWindow.cpp 中创建的数据库

4

2 回答 2

2

来自QSqlDatabase上的 Qt 文档:

连接以其自己的名称而闻名,而不是其连接到的数据库的名称。您可以与一个数据库建立多个连接。QSqlDatabase 还支持默认连接的概念,即未命名连接。要创建默认连接,请不要在调用 addDatabase() 时传递连接名称参数。随后,当您调用任何采用连接名称参数的静态成员函数时,如果您不传递连接名称参数,则假定默认连接。

好吧,我认为这说明了一切。注意 QSqlDatabase 不能直接实例化。直接创建 QSqlDatabase 实例只会产生无效连接。显然 QSqlDatabase 只是到实际连接对象的链接(可能是静态分配的)。由于许多应用程序可能只使用一个数据库连接,因此默认选择一个链接。

我不确定这是基于每个应用程序还是每个线程完成的。

于 2013-05-01T05:45:13.577 回答
0

好吧,看不到你的 main 会很困难,但看起来 QSqlQuery 足够聪明,可以选择你的“默认”数据库。看这里:

http://qt-project.org/doc/qt-4.8/qsqlquery.html#QSqlQuery-2

因此,只要您在数据库中看到值,我会说这只是 Qt 做一些不一定直观但最终非常容易使用的事情的另一个例子。

于 2013-05-01T01:23:21.777 回答