我有一个关于在Qt中使用数据库的问题。
在其他语言中,我会做一些事情,比如在主类中创建一个数据库,并将该数据库的指针传递给其他要使用的类。
我一直在玩Qt,似乎如果我在主类中初始化一个数据库,那么我可以在任何其他类中编写和执行查询,它将使用这个数据库,我有点困惑,因为那里似乎没有参考数据库。
有人可以帮我解释一下:)
这是在MainWindow.cpp
中实例化的Database类#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中创建的数据库
答案 0 :(得分:2)
来自QSqlDatabase的Qt文档:
连接以其自己的名称而不是名称来表示 它连接的数据库。您可以与一个建立多个连接 数据库。 QSqlDatabase还支持默认的概念 连接,这是未命名的连接。创建默认值 连接,调用时不要传递连接名称参数 addDatabase()。随后,当您调用任何静态成员函数时 如果你没有通过连接名称参数,则采用连接名称参数 连接名称参数,假定为默认连接。
嗯,我认为这说明了一切。请注意,无法直接实例化QSqlDatabase。直接创建QSqlDatabase实例只会产生无效连接。显然,QSqlDatabase只是指向实际连接对象的链接(可能是静态分配的)。由于许多应用程序可能只使用一个数据库连接,因此默认情况下会挑出一个链接。
我不确定这是基于每个应用程序还是每个线程完成的。
答案 1 :(得分:0)
好吧没有看到你的主要使它变得困难,但看起来QSqlQuery足够聪明,可以拿起你的“默认”数据库。见这里:
http://qt-project.org/doc/qt-4.8/qsqlquery.html#QSqlQuery-2
因此,只要您在数据库中看到值,我就会说这只是Qt的另一个例子,它做的事情不一定直观但最终很容易使用。