qt下sqlite数据库的应用(二)
2015-05-27 20:50
363 查看
qt中数据库和窗体界面的交互,可以当后台来用,其中用到的主要控件是tableview,sqlite,所在的环境是linux下,如果是在ios,android下开发,只需要将类的书写方式及动态函数静态函数的书写方式改一下。
在看代码之前想复习一下数据库的知识:
一、数据模型:
定义:现实世界数据特征的抽象,用来定义数据如何组织,数据之间的关系怎样。可分为三层:概念模型、逻辑/实现模型、物理模型
二、三级模式:
1.内模式(存储模式):数据物理结构和存储方式的描述,是数据内部的表示方式。
2.概念模式(全局模式或模式):是对数据库中全体数据的逻辑结构和特征的描述
3.外模式(子模式或用户模式):数据库用户能够看间和使用的局部数据逻辑结构和特征的描述
三、两级映射:
1.概念模式/内模式映射
2.外模式/概念模式
数据的物理独立性:
内模式与模式之间的映射提供了数据的物理独立性。当数据的物理结构发生变化时,只需要修改内模式与模式的映射即可。
数据的逻辑独立性:
模式与外模式之间的映射提供了数据的逻辑独立性。当数据的整体逻辑结构发生变化时,只需要修改各个外模式与模式概念之间的映射即可。
四:数据库系统的设计过程
1.数据设计的基本过程
2.需求收集与分析
3.概念结构设计
4.选择合适的DBMS
5.逻辑结构设计
6.物理结构设计
7.数据库实施
8.运行于维护
举例(SQLITE数据库):
//Database.h
class CDatabase : public QDialog {
Q_OBJECT
public:
CDatabase(QWidget *parent = 0);
~CDatabase();
protected:
void changeEvent(QEvent *e);
private:
Ui::CDatabase *ui;
//add by chenney 注释部分为自己手写
public slots:
void searchSong_clicked();
void upDataSong_clicked();
void clearSong_clicked();
void deleteSong_clicked();
void addSong_clicked(QString str);
void addSong_clicked();
public:
void connectDB();//创建连接函数
void closeDB();//创建关闭函数
int readData(QStandardItemModel *modelSong,QList<Phonon::MediaSource> *list);
private:
QSqlTableModel *model;//建立数据库的文件描述符
QSqlDatabase db;
//add by chenney
};
#endif // CDATABASE_H
//Database.cpp
int num = 0;
CDatabase::CDatabase(QWidget *parent) :
QDialog(parent),
ui(new Ui::CDatabase)
{
ui->setupUi(this);
//add by chenney
//addSong deleteSong searSong clearSong updateSong均为PushButton按钮
connect(ui->addSong,SIGNAL(clicked()),this,SLOT(addSong_clicked()));//添加数据
connect(ui->deleteSong,SIGNAL(clicked()),this,SLOT(deleteSong_clicked()));//删除数据
connect(ui->searSong,SIGNAL(clicked()),this,SLOT(searSong_clicked()));//查找数据
connect(ui->clearSong,SIGNAL(clicked()),this,SLOT(clearSong_clicked()));//清空数据库
connect(ui->updateSong,SIGNAL(clicked()),this,SLOT(updateSong_clicked()));//更新数据库
connectDB();
//绑定数据库到tableview列表
model = new QSqlTableModel(this);
model->setTable("music");//数据库名字music
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
model->select();//选取标的一行
ui->songList->setModel(model);
ui->songList->horizontalHeader()->setStyleSheet("QHeaderView::section{background-color:transparent;}");
//add by chenney
}
CDatabase::~CDatabase()
{
delete ui;
}
void CDatabase::changeEvent(QEvent *e)
{
QDialog::changeEvent(e);
switch (e->type()) {
case QEvent::LanguageChange:
ui->retranslateUi(this);
break;
default:
break;
}
}
//add by cheny
void CDatabase::connectDB()
{
db = QSqlDatabase::addDatabase("QSQLITE");//链接数据库
db.setDatabaseName("music.db");
if(!db.open())//打开数据库
{
qDebug()<< "database is error";
}
else
{
qDebug()<<"database is ok";
}
QSqlQuery quer;
quer.exec(QObject::tr("create table music (music string)"));//创建表格
}
void CDatabase::closeDB()
{
db.close();//关闭数据库
}
/*添加歌曲*/
void CDatabase::addSong_clicked(QString str)
{
QSqlQuery quer;
quer.prepare("INSERT INTO music(music) VALUES(:music)");
quer.bindValue(":music",str);
quer.exec();
model->submitAll();
}
/*删除歌曲*/
void CDatabase::deleteSong_clicked()
{
int curRow = ui->songList->currentIndex().row();
model->removeRow(curRow);
int ok = QMessageBox::warning(this,tr("delete the current row !"),tr("Are you sure delete the current row ?"),QMessageBox::Yes,QMessageBox::No);
if(ok == QMessageBox::No)
{
model->revertAll();
}
else
{
model->submitAll();
num--;
}
}
/*清空数据库*/
void CDatabase::clearSong_clicked()
{
int ok = QMessageBox::warning(this,tr("clear the List !"),tr("Are you sure clear the List ?"),QMessageBox::Yes,QMessageBox::No);
if(ok == QMessageBox::No)
{
model->revertAll();
}
else
{
QMessageBox(this,"Error info ","clear failed");
}
}
/*更新数据库*/
void CDatabase::upDataSong_clicked()
{
ui->songList->setModel(model);
}
void CDatabase::searchSong_clicked()
{
QString music = ui->editSong->text();
model->setFilter(QObject::tr("music = '%1'").arg(music));//setFilter()函数进行关键字筛选
model->select();
}
/*读取数据到列表(此列表是在另个窗体上,单单数据库可以不用这个)*/
int CDatabase::readData(QStandardItemModel *modelSong, QList<Phonon::MediaSource> *list)
{
int k = 0;
QSqlQuery quer;
quer.exec("select * from music");
while(quer.next())
{
list->append(quer.value(0).toString());
modelSong->setItem(k,0,new QStandardItem(QFileInfo(quer.value(0).toString()).fileName()));
k++;
}
return k;
}
/*添加数据到tableview列表*/
void CDatabase::addSong_clicked()
{
QStringList files = QFileDialog::getOpenFileNames(this, tr("Selec Files to play"),"/","*.wav *mp3");
QString file;
QSqlQuery quer;
foreach(file, files)
{
quer.prepare("INSERT INTO music(music) VALUES(:music)");
quer.bindValue(":music",file);
quer.exec();
}
model->submitAll();//提交数据。
}
//add by chenney
在看代码之前想复习一下数据库的知识:
一、数据模型:
定义:现实世界数据特征的抽象,用来定义数据如何组织,数据之间的关系怎样。可分为三层:概念模型、逻辑/实现模型、物理模型
二、三级模式:
1.内模式(存储模式):数据物理结构和存储方式的描述,是数据内部的表示方式。
2.概念模式(全局模式或模式):是对数据库中全体数据的逻辑结构和特征的描述
3.外模式(子模式或用户模式):数据库用户能够看间和使用的局部数据逻辑结构和特征的描述
三、两级映射:
1.概念模式/内模式映射
2.外模式/概念模式
数据的物理独立性:
内模式与模式之间的映射提供了数据的物理独立性。当数据的物理结构发生变化时,只需要修改内模式与模式的映射即可。
数据的逻辑独立性:
模式与外模式之间的映射提供了数据的逻辑独立性。当数据的整体逻辑结构发生变化时,只需要修改各个外模式与模式概念之间的映射即可。
四:数据库系统的设计过程
1.数据设计的基本过程
2.需求收集与分析
3.概念结构设计
4.选择合适的DBMS
5.逻辑结构设计
6.物理结构设计
7.数据库实施
8.运行于维护
举例(SQLITE数据库):
//Database.h
class CDatabase : public QDialog {
Q_OBJECT
public:
CDatabase(QWidget *parent = 0);
~CDatabase();
protected:
void changeEvent(QEvent *e);
private:
Ui::CDatabase *ui;
//add by chenney 注释部分为自己手写
public slots:
void searchSong_clicked();
void upDataSong_clicked();
void clearSong_clicked();
void deleteSong_clicked();
void addSong_clicked(QString str);
void addSong_clicked();
public:
void connectDB();//创建连接函数
void closeDB();//创建关闭函数
int readData(QStandardItemModel *modelSong,QList<Phonon::MediaSource> *list);
private:
QSqlTableModel *model;//建立数据库的文件描述符
QSqlDatabase db;
//add by chenney
};
#endif // CDATABASE_H
//Database.cpp
int num = 0;
CDatabase::CDatabase(QWidget *parent) :
QDialog(parent),
ui(new Ui::CDatabase)
{
ui->setupUi(this);
//add by chenney
//addSong deleteSong searSong clearSong updateSong均为PushButton按钮
connect(ui->addSong,SIGNAL(clicked()),this,SLOT(addSong_clicked()));//添加数据
connect(ui->deleteSong,SIGNAL(clicked()),this,SLOT(deleteSong_clicked()));//删除数据
connect(ui->searSong,SIGNAL(clicked()),this,SLOT(searSong_clicked()));//查找数据
connect(ui->clearSong,SIGNAL(clicked()),this,SLOT(clearSong_clicked()));//清空数据库
connect(ui->updateSong,SIGNAL(clicked()),this,SLOT(updateSong_clicked()));//更新数据库
connectDB();
//绑定数据库到tableview列表
model = new QSqlTableModel(this);
model->setTable("music");//数据库名字music
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
model->select();//选取标的一行
ui->songList->setModel(model);
ui->songList->horizontalHeader()->setStyleSheet("QHeaderView::section{background-color:transparent;}");
//add by chenney
}
CDatabase::~CDatabase()
{
delete ui;
}
void CDatabase::changeEvent(QEvent *e)
{
QDialog::changeEvent(e);
switch (e->type()) {
case QEvent::LanguageChange:
ui->retranslateUi(this);
break;
default:
break;
}
}
//add by cheny
void CDatabase::connectDB()
{
db = QSqlDatabase::addDatabase("QSQLITE");//链接数据库
db.setDatabaseName("music.db");
if(!db.open())//打开数据库
{
qDebug()<< "database is error";
}
else
{
qDebug()<<"database is ok";
}
QSqlQuery quer;
quer.exec(QObject::tr("create table music (music string)"));//创建表格
}
void CDatabase::closeDB()
{
db.close();//关闭数据库
}
/*添加歌曲*/
void CDatabase::addSong_clicked(QString str)
{
QSqlQuery quer;
quer.prepare("INSERT INTO music(music) VALUES(:music)");
quer.bindValue(":music",str);
quer.exec();
model->submitAll();
}
/*删除歌曲*/
void CDatabase::deleteSong_clicked()
{
int curRow = ui->songList->currentIndex().row();
model->removeRow(curRow);
int ok = QMessageBox::warning(this,tr("delete the current row !"),tr("Are you sure delete the current row ?"),QMessageBox::Yes,QMessageBox::No);
if(ok == QMessageBox::No)
{
model->revertAll();
}
else
{
model->submitAll();
num--;
}
}
/*清空数据库*/
void CDatabase::clearSong_clicked()
{
int ok = QMessageBox::warning(this,tr("clear the List !"),tr("Are you sure clear the List ?"),QMessageBox::Yes,QMessageBox::No);
if(ok == QMessageBox::No)
{
model->revertAll();
}
else
{
QMessageBox(this,"Error info ","clear failed");
}
}
/*更新数据库*/
void CDatabase::upDataSong_clicked()
{
ui->songList->setModel(model);
}
void CDatabase::searchSong_clicked()
{
QString music = ui->editSong->text();
model->setFilter(QObject::tr("music = '%1'").arg(music));//setFilter()函数进行关键字筛选
model->select();
}
/*读取数据到列表(此列表是在另个窗体上,单单数据库可以不用这个)*/
int CDatabase::readData(QStandardItemModel *modelSong, QList<Phonon::MediaSource> *list)
{
int k = 0;
QSqlQuery quer;
quer.exec("select * from music");
while(quer.next())
{
list->append(quer.value(0).toString());
modelSong->setItem(k,0,new QStandardItem(QFileInfo(quer.value(0).toString()).fileName()));
k++;
}
return k;
}
/*添加数据到tableview列表*/
void CDatabase::addSong_clicked()
{
QStringList files = QFileDialog::getOpenFileNames(this, tr("Selec Files to play"),"/","*.wav *mp3");
QString file;
QSqlQuery quer;
foreach(file, files)
{
quer.prepare("INSERT INTO music(music) VALUES(:music)");
quer.bindValue(":music",file);
quer.exec();
}
model->submitAll();//提交数据。
}
//add by chenney
相关文章推荐
- Qt开发的sqlite数据库应用出现Driver not loaded
- QT在Windows中的技术总结(二):sqlite数据库QT接口的应用总结
- Qt图形视图框架(六) 为Item应用属性动画
- fedora下qt应用字体
- HTML+CSS+python+qtwebkit打造跨平台桌面应用(三)
- Qt下Sqlite数据库的操作(1)
- PyQt5+Eric6+Anaconda+Pycharm 开发Qt应用环境搭建
- 第一个QT应用的实现-tslib1.4移植
- Qt使用Sqlite数据库
- 使用Qt开发跨平台桌面应用时,应该选择widgets还是qml?
- QT技术应用_2D绘图(转)
- QML笔记整理——在Qt/C++应用中使用QML
- Qt学习笔记-定时器的应用及精度设置
- 在Qt应用中强制使用横屏或竖屏
- C++11 Lambda的变量捕获和Lambda在Qt中的应用
- Qt编程5:使用QXmlStreamReader解析xml(简单应用)
- Qt移动应用开发(四):应用粒子特效
- Qt操作SQLite数据库——创建、打开、关闭、增加、删除和修改操作
- iOS+QT5.2: 使用QT5.2创建跨平台的iOS应用
- 如何把一个Qt应用打包为一个snap应用--snapcraft scriptlets应用实例