今天Qt课我学会了编写一个程序,完成数据库操作,要求能够实现数据的增加,删除,查询,修改,排序选择。实现效果大体如下:
以下是实现步骤:
第一步:新建工程,项目名称为Database_first,类名为Widget,基类为QWidget。
第二步:在工程文件中添加一句代码:QT += sql即可调用QtSql模块,Datebase_first.pro代码如下:
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = Database_first
TEMPLATE = app
SOURCES += main.cpp\
widget.cpp
HEADERS += widget.h
QT += sql
FORMS += widget.ui
第三步:然后,选中工程,右键选择“添加新文件”,选择C++ Header File ,命名为database.h
添加如下代码:
#ifndef DATABASE_H
#define DATABASE_H
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QObject>
static bool createConnection()
{
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("database.db");
if(!db.open()) return false;
QSqlQuery query;
query.exec(QObject::tr("create table student (id int primary key, name vchar)"));
query.exec(QObject::tr("insert into student values (0,'刘明')"));
query.exec(QObject::tr("insert into student values (1,'陈刚')"));
query.exec(QObject::tr("insert into student values (2,'王红')"));
return true;
}
#endif // DATABASE_H
第四步:将main.cpp中添加如下代码:
#include <QtWidgets/QApplication>
#include "widget.h"
#include "database.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
if(!createConnection())
return 1;
Widget w;
w.show();
return a.exec();
}
第五步:打开widget.ui,设计界面如下,其中的部件有Table View 和 Line Edit,Label,其余是几个按钮部件,按钮部件的拖放顺序已经标出(可以重新设置按钮部件的objectName属性,防止后面设置这几个按钮部件所对应的槽函数发生混淆,这里我图省劲,没有修改objectName属性)
第六步:设置widget.h和widget.cpp代码,设置widget.h的代码如下:
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QSqlTableModel>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
QSqlTableModel *model;
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
widget.cpp代码如下:
#include "widget.h"
#include "ui_widget.h"
#include <QSqlQueryModel>
#include <QTableView>
#include <QMessageBox>
#include <QSqlError>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
model = new QSqlTableModel(this);
model->setTable("student");
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
model->select(); //选取整个表的所有行
// model->removeColumn(1); //不显示name属性列,如果这时添加记录,则该属性的值添加不上
ui->tableView->setModel(model);
//ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers); //使其不可编辑
}
Widget::~Widget()
{
delete ui;
}
此时运行程序,效果如下:
第七步:为每个按钮设置槽函数,打开widget.ui,选中按钮,右键选择“转到槽”,依次为每个按钮添加槽函数代码。
向widget.cpp添加各个槽函数代码如下:
//插入
void Widget::on_pushButton_clicked()
{
int rowNum = model->rowCount(); //获得表的行数
int id = 10;
model->insertRow(rowNum); //添加一行
model->setData(model->index(rowNum,0),id);
//model->submitAll(); //可以直接提交
}
//提交修改
void Widget::on_pushButton_2_clicked()
{
model->database().transaction(); //开始事务操作
if (model->submitAll()) {
model->database().commit(); //提交
} else {
model->database().rollback(); //回滚
QMessageBox::warning(this, tr("tableModel"),
tr("数据库错误: %1")
.arg(model->lastError().text()));
}
}
//撤销修改
void Widget::on_pushButton_3_clicked()
{
model->revertAll();
}
//id升序排列
void Widget::on_pushButton_4_clicked()
{
model->setSort(0,Qt::AscendingOrder); //id属性,即第0列,升序排列
model->select();
}
//id降序排列
void Widget::on_pushButton_5_clicked()
{
model->setSort(0,Qt::DescendingOrder);
model->select();
}
//删除选中行
void Widget::on_pushButton_6_clicked()
{
int curRow = ui->tableView->currentIndex().row();
//获取选中的行
model->removeRow(curRow);
//删除该行
int ok = QMessageBox::warning(this,tr("删除当前行!"),tr("你确定"
"删除当前行吗?"),QMessageBox::Yes,QMessageBox::No);
if(ok == QMessageBox::No)
{
model->revertAll(); //如果不删除,则撤销
}
else model->submitAll(); //否则提交,在数据库中删除该行
}
//查询
void Widget::on_pushButton_7_clicked()
{
QString name = ui->lineEdit->text();
model->setFilter(QObject::tr("name = '%1'").arg(name)); //根据姓名进行筛选
model->select(); //显示结果
}
//返回全表
void Widget::on_pushButton_8_clicked()
{
model->setTable("student"); //重新关联表
model->select(); //这样才能再次显示整个表的内容
}
至此,这个程序完成。
工程各个文件总代码如下:
Datebase_first.pro代码如下:
#-------------------------------------------------
#
# Project created by QtCreator 2019-10-10T20:09:35
#
#-------------------------------------------------
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = Database_first
TEMPLATE = app
SOURCES += main.cpp\
widget.cpp
HEADERS += widget.h
QT += sql //在生成的文件中只加了这一句代码
FORMS += widget.ui
database.h代码如下:
#ifndef DATABASE_H
#define DATABASE_H
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QObject>
static bool createConnection()
{
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("database.db");
if(!db.open()) return false;
QSqlQuery query;
query.exec(QObject::tr("create table student (id int primary key, name vchar)"));
query.exec(QObject::tr("insert into student values (0,'刘明')"));
query.exec(QObject::tr("insert into student values (1,'陈刚')"));
query.exec(QObject::tr("insert into student values (2,'王红')"));
return true;
}
#endif // DATABASE_H
widget.h代码如下:
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QSqlTableModel>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
QSqlTableModel *model;
private slots:
void on_pushButton_clicked();
void on_pushButton_2_clicked();
void on_pushButton_3_clicked();
void on_pushButton_4_clicked();
void on_pushButton_5_clicked();
void on_pushButton_6_clicked();
void on_pushButton_7_clicked();
void on_pushButton_8_clicked();
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
main.cpp代码如下:
#include <QtWidgets/QApplication>
#include "widget.h"
#include "database.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
if(!createConnection())
return 1;
Widget w;
w.show();
return a.exec();
}
widget.cpp代码如下:
#include "widget.h"
#include "ui_widget.h"
#include <QSqlQueryModel>
#include <QTableView>
#include <QMessageBox>
#include <QSqlError>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
model = new QSqlTableModel(this);
model->setTable("student");
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
model->select(); //选取整个表的所有行
// model->removeColumn(1); //不显示name属性列,如果这时添加记录,则该属性的值添加不上
ui->tableView->setModel(model);
//ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers); //使其不可编辑
}
Widget::~Widget()
{
delete ui;
}
//插入
void Widget::on_pushButton_clicked()
{
int rowNum = model->rowCount(); //获得表的行数
int id = 10;
model->insertRow(rowNum); //添加一行
model->setData(model->index(rowNum,0),id);
//model->submitAll(); //可以直接提交
}
//提交修改
void Widget::on_pushButton_2_clicked()
{
model->database().transaction(); //开始事务操作
if (model->submitAll()) {
model->database().commit(); //提交
} else {
model->database().rollback(); //回滚
QMessageBox::warning(this, tr("tableModel"),
tr("数据库错误: %1")
.arg(model->lastError().text()));
}
}
//撤销修改
void Widget::on_pushButton_3_clicked()
{
model->revertAll();
}
//id升序排列
void Widget::on_pushButton_4_clicked()
{
model->setSort(0,Qt::AscendingOrder); //id属性,即第0列,升序排列
model->select();
}
//id降序排列
void Widget::on_pushButton_5_clicked()
{
model->setSort(0,Qt::DescendingOrder);
model->select();
}
//删除选中行
void Widget::on_pushButton_6_clicked()
{
int curRow = ui->tableView->currentIndex().row();
//获取选中的行
model->removeRow(curRow);
//删除该行
int ok = QMessageBox::warning(this,tr("删除当前行!"),tr("你确定"
"删除当前行吗?"),QMessageBox::Yes,QMessageBox::No);
if(ok == QMessageBox::No)
{
model->revertAll(); //如果不删除,则撤销
}
else model->submitAll(); //否则提交,在数据库中删除该行
}
//查询
void Widget::on_pushButton_7_clicked()
{
QString name = ui->lineEdit->text();
model->setFilter(QObject::tr("name = '%1'").arg(name)); //根据姓名进行筛选
model->select(); //显示结果
}
//返回全表
void Widget::on_pushButton_8_clicked()
{
model->setTable("student"); //重新关联表
model->select(); //这样才能再次显示整个表的内容
}
Widget.ui设计如下,标号的是按钮部件: