一年多之前就接触了Qt,一直也对它比较情有独钟,但是一直都是浅尝辄止,断断续续也没学到多少东西;前两天写一个带有登陆界面的客户端程序,由于初学,在数据库的连接和使用上遇到了问题,查阅了些资料,详情如下:
问题:解决Qt多窗体间连接查询数据库(SQLite)
解决方法1:采用数据库连接并选定数据库的方法
1)在main.cpp中定义函数:
#include <QSqlDatabase>
#include <QSqlError>
#include <QMessageBox>
bool CreateConn()
{
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", "conn");
//db.setHostName("host");
//db.setDatabaseName("dbname");
//db.setUserName("username");
//db.setPassword("password");
db.setDatabaseName("data.db");
if (!db.open())
{
QMessageBox::critical(NULL, QObject::tr("Database Error"), db.lastError().text());
return false;
}
return true;
}
2)在main函数中建立数据库连接
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GBK"));
if (!CreateConn())
return 1; ...... }
3)在需要调用数据库进行查询的地方定义数据库到已经建立的连接即可
//database
在使用的类中定义数据库db及查询的query为成员变量;
//头文件中
QSqlDatabase db;
QSqlQuery *query;
//源文件中
db = QSqlDatabase::database("conn");
query = new QSqlQuery(db);
query->setForwardOnly(true);下面就可以用query进行数据库的操作了。
解决方法2:采用全局变量的方法(该方法不是很好)
1)自己封装一个数据库的类,如下
#ifndef QLDATABASE_H
#define QLDATABASE_H
#include <QSqlDatabase>
#include <QSqlQuery>
class QLDatabase
{
public:
QLDatabase();
//functions
bool CreateConn();
void Close();
void DeleteTable(QString strTableName);
//test functions
void TestInsert();
void TestQuery(QString strCmdText);
void TestCreateTable();
void TestInsertItem();
//private:
QSqlDatabase db;
public:
QSqlQuery *query;
bool bDatabaseFlag;
};
static QLDatabase *db;
#endif // QLDATABASE_H可以在类中实现一些test功能函数及一些数据库操作函数
在类的构造函数中调用CreateConn()函数建立连接,并返回数据库的链接状态到bDatabaseFlag成员变量。
#include "qldatabase.h"
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QMessageBox>
#include <QDebug>
#include <QSqlError>
QLDatabase::QLDatabase()
{
bDatabaseFlag = CreateConn();
}
bool QLDatabase::CreateConn()
{
db = QSqlDatabase::addDatabase("QSQLITE", "conn");
//db.setHostName("host");
//db.setDatabaseName("dbname");
//db.setUserName("username");
//db.setPassword("password");
db.setDatabaseName("data.db");
if (!db.open())
{
QMessageBox::critical(NULL, QObject::tr("Database Error"), db.lastError().text());
return false;
}
else
{
query = new QSqlQuery(db);
query->setForwardOnly(true);
return true;
}
}
2)初始化类
在第一次使用数据库的类的原文件中
#include "logindialog.h"
#include "ui_logindialog.h"
#include <QMessageBox>
#include "qldatabase.h"
LoginDialog::LoginDialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::LoginDialog)
{
ui->setupUi(this);
//设置最小化按钮
Qt::WindowFlags flags = Qt::Dialog;
flags |= Qt::WindowMinimizeButtonHint;
setWindowFlags(flags);
//固定窗口大小
this->setFixedSize(this->size());
//temperory codes
ui->txtUser->setText("schades");
ui->txtPwd->setText("lhm871118");
ui->cboPwd->setChecked(true);
//数据库
db = new QLDatabase();
}
3)每一次调用都重新new一下
这样只要#include自己封装的数据库类的头文件,即可调用全局变量db对数据库进行相应操作,但是每一次new一下会强迫清除原有的数据库连接,建立新的数据库连接。不建议采用第二种方法。
以上仅仅是一个初学小菜鸟的尝试,请高手点评指正。