Qt基于SQLite数据库的增删查改demo

一、效果展示

在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);
}
相关推荐
-Xie-36 分钟前
Maven(二)
java·开发语言·maven
mftang38 分钟前
Python可视化工具-Bokeh:动态显示数据
开发语言·python
m0_480502641 小时前
Rust 入门 生命周期-next2 (十九)
开发语言·后端·rust
IT利刃出鞘1 小时前
Java线程的6种状态和JVM状态打印
java·开发语言·jvm
薛晓刚1 小时前
当MySQL的int不够用了
数据库
SelectDB技术团队1 小时前
Apache Doris 在菜鸟的大规模湖仓业务场景落地实践
数据库·数据仓库·数据分析·apache doris·菜鸟技术
星空下的曙光2 小时前
mysql 命令语法操作篇 数据库约束有哪些 怎么使用
数据库·mysql
小楓12012 小时前
MySQL數據庫開發教學(一) 基本架構
数据库·后端·mysql
染落林间色2 小时前
达梦数据库-实时主备集群部署详解(附图文)手工搭建一主一备数据守护集群DW
数据库·sql