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

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

时间:2024-06-08 19:29:53浏览次数:28  
标签:SQLite Qt demo 数据库 ui QString query id name

一、效果展示

在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);
}

标签:SQLite,Qt,demo,数据库,ui,QString,query,id,name
From: https://blog.csdn.net/qzt__l0ve/article/details/139550129

相关文章

  • Electron qt开发教程
    模块安装打包 npminstall-gelectron-forgeelectron-forgeinitmy-project--template=vuenpmstart //进入目录启动//打包成一个目录到out目录下,注意这种打包一般用于调试,并不是用于分发npmrunpackage//打出真正的分发包,放在out\make目录下npmrunmakenpx@......
  • VNC打不开Qt Creator解决
    问题:设备机:debian、tightvncserver客户机:Windows、TigerVNCViewer远程连接VNC时打不开QtCreator。找了很多方法没能成功,例如-noload之类的命令。原因可能是虚拟桌面图形驱动问题。Qt论坛同样问题:https://forum.qt.io/topic/79580/opening-qt-from-remote-desktop-connectio......
  • PyQT5之多窗口交互
    方法一:不适用信号与槽MultiWin.py文件"""多窗口交互--不适用信号与槽"""importsysfromPyQt5.QtCoreimport*fromPyQt5.QtGuiimport*fromPyQt5.QtWidgetsimport*fromDateDialogimportDateDialogclassMultiWindow1(QWidget):def__init__......
  • PyQT5之为槽函数传递参数
    方法一:lambda表达式传递参数fromPyQt5.QtCoreimport*fromPyQt5importQtCorefromPyQt5.QtWidgetsimport*importsysclassLambdaSlotArg(QMainWindow):def__init__(self):super().__init__()self.setWindowTitle("使用Lambda表达式为槽函......
  • PyQT5信号与槽的连接
    方法一:fromPyQt5.QtCoreimport*fromPyQt5.QtWidgetsimport*importsysclassAutoSignalSlot(QWidget):def__init__(self):super().__init__()self.setWindowTitle("信号与槽自动连接")self.resize(300,100)self.okB......
  • PyQT5信号刷新时间
    importtimefromPyQt5.QtCoreimport*fromPyQt5.QtWidgetsimport*importsysclassBackendThread(QThread):update_date=pyqtSignal(str)defrun(self):whileTrue:data=QDateTime.currentDateTime()currentTim......
  • PyQT5之信号关闭窗口
    fromPyQt5.QtCoreimport*fromPyQt5.QtWidgetsimport*importsysclassWinSignal(QWidget):#定义一个信号button_clicked_signal=pyqtSignal()def__init__(self):super().__init__()self.setWindowTitle("为窗口类添加信号")......
  • NXP i.MX 93开发板的Qt开发指南-基于米尔MYD-LMX9X
    1. 概述Qt 是一个跨平台的图形应用开发框架,被应用在不同尺寸设备和平台上,同时提供不同版权版本供用户选择。米尔 NXPi.MX93 开发板(MYD-LMX9X开发板)使用 Qt6.5 版本进行应用开发。在 Qt 应用开发中,推荐使用 QtCreator 集成开发环境,可以在 LinuxPC 下开发 Qt 应用......
  • vue 连接mqtt
    下载mqtt服务:npminstallmqttconstmqttConfig={//你的MQTT服务器配置protocolId:'MQTT',protocolVersion:4,clean:true,clientId:'xxxx',reconnectPeriod:1000,connectTimeout:60*1000,//will:{//topic:�......
  • MQTTX使用
    windows10-EMQX安装及配置使用教程一、下载安装1.1下载1.2安装1.3设置开机自启动二、连接MQTT2.1MQTT下载安装2.1.1下载2.1.2安装及配置三、EMQX常用命令  本文介绍的是在windows10系统下的emqx的安装、配置及使用教程。一、下载安装1.1下载下载链接:emqx官网-版本......