Qt多窗体之间的数据库操作
来源:互联网 发布:医疗软件行业趋势 编辑:程序博客网 时间:2024/06/01 08:04
一年多之前就接触了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(intargc,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一下会强迫清除原有的数据库连接,建立新的数据库连接。不建议采用第二种方法。
以上仅仅是一个初学小菜鸟的尝试,请高手点评指正。
0 0
- Qt多窗体之间的数据库操作
- QT之窗体之间的传值
- web弹出窗体之间的操作
- 父窗体与子窗体之间的相互操作
- qt数据库的操作
- Qt 的数据库操作
- WinForm窗体之间操作
- Qt窗体之间相互传值的三种方式
- Qt窗体之间相互传值的三种方式
- Qt窗体之间相互传值的三种方式
- 分布式数据库之间的操作
- 数据库之间的远程操作
- 不同数据库之间的操作
- qt操作数据库的问题
- oracle的窗体函数&&数据库之间的异同
- 数据库:多表之间的设计以及对应类之间的关系,与数据库的操作。
- DotNet平台下WinForm窗体之间的相互操作
- C#(WIN FORM)两个窗体间之间的相互操作
- 广州传智播客—牛逼网页设计师的打造所
- 关于WinCE中config.bib的问题
- Ogre 中使用OIS的两种模式
- google diff python API 使用
- wince bib文件合成
- Qt多窗体之间的数据库操作
- wince6.0编译命令分析
- Nenux 5刷机
- (六)Brute-Force算法与KMP算法
- testaaaaaaaaaaaa
- Android 双击返回键退出程序 实现
- 杨辉三角形
- wince对中文字体的支持
- Uncaught TypeError: Object #<Document> has no method 'load'