一、效果展示
在Qt创建如图UI界面,主要包括"查询"、"添加"、"删除"、"更新",四个功能模块。
查询:从数据库中查找所有数据的所有内容,并显示在左边的QListWidget控件上。
添加:在右边的QLineEdit标签上输入需要添加的内容,包含id,name,age三个字段,然后点击添加按钮,即可将数据添加至数据库。
删除:根据在id控件输入框中输入的id,删除数据库中指定那一行内容。
更新:根据输入的id号,对指定行数据的name字段内容进行修改。
如上四个功能来实现一个简单的增删查改demo。
二、基于数据库的操作
在qt中要使用数据库,需要在.pro文件中添加sql模块才能使用数据库的相关操作。
基本操作:
1.与数据库进行连接
QSqlDatabase db;
db = QSqlDatabase::addDatabase("QSQLITE"); // 指明数据库为SQLite
db.setDatabaseName("test.db"); // 连接的数据库名
2.打开数据库
db.open()
3.定义QSqlQuery
QSqlQuery query; // 用于执行对数据库的相关操作
QString sqlstr = QString("select * from user;"); // 定义sql语句
4.执行sql语句
query.exec(sqlstr)
1.连接数据库
QSqlDatabase db;
// 指明连接的是SQLite3数据库; 连接返回
db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("test.db"); // 连接的数据库文件,需要在打开数据库之前进行
// 打开数据库
if(!db.open()){
qDebug() << "Error failed to open" << db.lastError();
}
else{
qDebug() << "open success";
}
db = QSqlDatabase::addDatabase("QSQLITE");
指明使用的是SQLite数据库驱动。
db.setDatabaseName("test.db");
与test.db数据库进行连接
db.open()
打开数据库,返回值是bool类型,打开失败会返回false。在打开数据库之前,就需要指明连接的数据库。
db.lastError()
该方法会打印数据库中最新的一条出错原因。
2.查询操作
void MainWindow::on_pushButton_find_clicked()
{
ui->listWidget->clear(); // 清空之前的内容
// 查询操作
QSqlQuery query;
QString sqlstr = QString("select * from user;");
if(!query.exec(sqlstr)){
qDebug() << "查询错误:" << query.lastError();
return;
}
// 因为查询出的数据可能不止一条,所以需要循环打印
while(query.next()){
// 获取每一条记录的内容
int id = query.value("id").toInt();
QString name = query.value("name").toString();
int age = query.value("age").toInt();
// 将数据更新到控件界面上
// 创建一条数据的条目
itemFrom *userItem = new itemFrom;
userItem->setUserInfo(id, name, age); // 设置该条记录内容
QListWidgetItem *item = new QListWidgetItem(ui->listWidget);
item->setSizeHint(QSize(442, 29));
ui->listWidget->addItem(item);
ui->listWidget->setItemWidget(item, userItem);
}
}
QSqlQuery query;
创建一个QSqlQuery对象,用于执行对数据库进行的一些操作。QString sqlstr = QString("select * from user;");
定义一条查询语句,查询user表中所有的内容。query.exec(sqlstr)
执行自定义的sql语句,执行失败会返回false。query.next()
该函数会指向我们指向我们指向sql语句后,返回结果的第一条内容,每执行一次,就会指向下一条内容,如果没有内容了就会返回false。query.value("id")
该函数会匹配查询出来的结果中,一条记录中对应"id"字段的内容,以字符串的形式返回。
3.添加操作
void MainWindow::on_pushButton_add_clicked()
{
// 获取控件上的内容
QString name = ui->lineEdit_name->text();
QString age = ui->lineEdit_age->text();
// 执行插入操作
QSqlQuery query;
// %表示占位符
QString sqlstr = QString("insert into user(name, age) "
"values('%1', %2)")
.arg(name)
.arg(age.toInt());
if(!query.exec(sqlstr)){
qDebug() << "插入错误:" << query.lastError();
return;
}
}
首先获取输入框中对应的内容;然后创建QSqlQuery对象执行sql语句。在user表中,id字段设置为自增,所以不需要输入id的内容来进行添加。
QString("insert into user(name, age) "
"values('%1', %2)")
.arg(name)
.arg(age.toInt());
在字符串中,%1
表示的是占位符,数字1表示序号。使用arg()方法将内容填充到对应的占位符中,顺序方式填充。
query.exec(sqlstr)函数执行sql语句。
4.删除操作
void MainWindow::on_pushButton_del_clicked()
{
// 获取控件上的内容
QString id = ui->lineEdit_id->text();
// 执行删除操作
QSqlQuery query;
// %表示占位符
QString sqlstr = QString("delete from user "
"where id = %1")
.arg(id.toInt());
if(!query.exec(sqlstr)){
qDebug() << "删除错误:" << query.lastError();
return;
}
// 同时更新控件上的显示
ui->listWidget->takeItem(id.toInt()-1);
}
实现方式类似,需要根据需求自定义一条sql语句,然后调用执行。
5.修改操作
void MainWindow::on_pushButton_update_clicked()
{
// 获取控件上的内容
QString name = ui->lineEdit_name->text();
QString id = ui->lineEdit_id->text();
// 执行更新操作
QSqlQuery query;
// %表示占位符
QString sqlstr = QString("update user set name = '%1' "
"where id = %2 ;")
.arg(name)
.arg(id.toInt());
if(!query.exec(sqlstr)){
qDebug() << "更新错误:" << query.lastError();
return;
}
}
先获取输入框中的内容,然后进行编写修改的sql语句,使用%1
表示占位符,使用arg()进行填充,最后执行sql语句。
完整代码
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "itemfrom.h"
#include <QDebug>
#include <QSqlError> // 数据库操作错误信息
#include <QListWidgetItem>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 指明连接的是SQLite3数据库; 连接返回
db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("test.db"); // 连接的数据库文件,需要在打开数据库之前进行
// 打开数据库
if(!db.open()){
qDebug() << "Error failed to open" << db.lastError();
}
else{
qDebug() << "open success";
}
}
MainWindow::~MainWindow()
{
db.close();
delete ui;
}
// 添加
void MainWindow::on_pushButton_add_clicked()
{
// 获取控件上的内容
QString name = ui->lineEdit_name->text();
QString age = ui->lineEdit_age->text();
// 执行插入操作
QSqlQuery query;
// %表示占位符
QString sqlstr = QString("insert into user(name, age) "
"values('%1', %2)")
.arg(name)
.arg(age.toInt());
if(!query.exec(sqlstr)){
qDebug() << "插入错误:" << query.lastError();
return;
}
}
// 删除
void MainWindow::on_pushButton_del_clicked()
{
// 获取控件上的内容
QString id = ui->lineEdit_id->text();
// 执行删除操作
QSqlQuery query;
// %表示占位符
QString sqlstr = QString("delete from user "
"where id = %1")
.arg(id.toInt());
if(!query.exec(sqlstr)){
qDebug() << "删除错误:" << query.lastError();
return;
}
// 同时更新控件上的显示
ui->listWidget->takeItem(id.toInt()-1);
}
// 更新
void MainWindow::on_pushButton_update_clicked()
{
// 获取控件上的内容
QString name = ui->lineEdit_name->text();
QString id = ui->lineEdit_id->text();
// 执行更新操作
QSqlQuery query;
// %表示占位符
QString sqlstr = QString("update user set name = '%1' "
"where id = %2 ;")
.arg(name)
.arg(id.toInt());
if(!query.exec(sqlstr)){
qDebug() << "更新错误:" << query.lastError();
return;
}
}
// 查询
void MainWindow::on_pushButton_find_clicked()
{
ui->listWidget->clear(); // 清空之前的内容
// 查询操作
QSqlQuery query;
QString sqlstr = QString("select * from user;");
if(!query.exec(sqlstr)){
qDebug() << "查询错误:" << query.lastError();
return;
}
// 因为查询出的数据可能不止一条,所以需要循环打印
while(query.next()){
// 获取每一条记录的内容
int id = query.value("id").toInt();
QString name = query.value("name").toString();
int age = query.value("age").toInt();
// 更新到控件上
// 创建一条数据的条目
itemFrom *userItem = new itemFrom;
userItem->setUserInfo(id, name, age); // 设置该条记录内容
QListWidgetItem *item = new QListWidgetItem(ui->listWidget);
item->setSizeHint(QSize(442, 29));
ui->listWidget->addItem(item);
ui->listWidget->setItemWidget(item, userItem);
}
}
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QSqlDatabase> // 用于连接打开数据库
#include <QSqlQuery> // 用于访问操作数据库
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void on_pushButton_add_clicked();
void on_pushButton_del_clicked();
void on_pushButton_update_clicked();
void on_pushButton_find_clicked();
private:
Ui::MainWindow *ui;
QSqlDatabase db;
};
#endif // MAINWINDOW_H
QListWidget中每一条记录的显示,可以自定义一种显示方式,新建一个类itemfrom
#ifndef ITEMFROM_H
#define ITEMFROM_H
#include <QMainWindow>
namespace Ui {
class itemFrom;
}
class itemFrom : public QMainWindow
{
Q_OBJECT
public:
explicit itemFrom(QWidget *parent = nullptr);
~itemFrom();
void setUserInfo(int id, QString name, int age);
private:
Ui::itemFrom *ui;
};
#endif // ITEMFROM_H
#include "itemfrom.h"
#include "ui_itemfrom.h"
itemFrom::itemFrom(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::itemFrom)
{
ui->setupUi(this);
}
itemFrom::~itemFrom()
{
delete ui;
}
// 将值设置在ui上
void itemFrom::setUserInfo(int id, QString name, int age)
{
ui->label_id2->setText(QString::number(id));
ui->label_age2->setText(QString::number(age));
ui->label_name2->setText(name);
}