QT肝8天13--删除用户

1、删除操作基本思路

在Qt中执行删除操作通常涉及删除对象、文件或数据库记录等。删除操作需要谨慎处理,确保资源被正确释放且不会导致程序崩溃。

删除动态分配的对象

使用delete操作符删除动态分配的Qt对象,确保对象不再被引用。Qt对象通常继承自QObject,如果对象有父对象,父对象析构时会自动删除子对象。

删除数据库记录

使用QSqlQuery执行SQL删除语句,确保事务处理正确以避免数据不一致。

cpp 复制代码
QSqlQuery query;
query.prepare("DELETE FROM table WHERE id = ?");
query.addBindValue(1);
query.exec();

注意事项

  • 避免悬空指针,删除对象后将其指针设为nullptr
  • 多线程环境下确保删除操作线程安全。
  • 使用智能指针如QSharedPointerQScopedPointer管理对象生命周期。

2、梦想不靠咖啡,加油干

1、在列表页面添加一栏

2、修改前面加载列表数据的方法

cpp 复制代码
#include "peoplewin.h"
#include "sqlite3/sqlite3db.h"
#include "ui_peoplewin.h"
#include <QGraphicsDropShadowEffect>
#include <QMessageBox>
#include <qgridlayout.h>

PeopleWin::PeopleWin(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::PeopleWin)
{
    ui->setupUi(this);

    pageWidget = new PageWidget();//创建分页控件
    this->layout()->addWidget(pageWidget);//添加到当前布局


    initUI();//初始化UI界面
    initOperators(1);//初始化列表
    ui->lineEdit->setPlaceholderText("请输入用户名或姓名");  //设置搜索框提示信息

    // 绑定槽函数----点击了分页控件的中的页码后,触发信号,触发当前页重新加载数据
    connect(pageWidget, SIGNAL(currentPageChanged(int)), this,
            SLOT(initOperators(int)));
}

PeopleWin::~PeopleWin()
{
    delete ui;
}

//初始化
void PeopleWin::initUI()
{
    // 设置图标
    this->setWindowIcon(QIcon(":/img/zhaoxi.png"));
    // 布局
    Qt::WindowFlags flags = this->windowFlags();
    flags |= Qt::FramelessWindowHint;       // //隐藏标题栏
    flags &= ~Qt::WindowMinMaxButtonsHint;  // 隐藏最小最大化按钮
    flags &= ~Qt::WindowCloseButtonHint;    // 隐藏关闭按钮
    this->setWindowFlags(flags);
}


//初始化数据
void PeopleWin::initOperators(int pageIndex)
{
    Sqlite3Db db;
    OperatorInfoList operatorinfs;
    //分页有关变量
    int pagesize=5;//每页10条
    int pagecount=0;//共10页
    QString searchString=ui->lineEdit->text().trimmed();//去掉前后空格

    if(db.selectOperators(searchString,pageIndex,pagesize,pagecount,operatorinfs)){
        BindOperatorList(operatorinfs);//operatorinfs就是查到的列表
        pageWidget->setCurrentPage(pageIndex);
        pageWidget->setMaxPage(pagecount);
    }
}

//添加数据到数据库中去
void PeopleWin::onAddOperator(OperatorInfo &opt)
{
    Sqlite3Db db;
    bool ret=db.insertOperator(opt);
    if(ret){
        initOperators(1);//重新加载
        m_addOperator->m_basewin->close();//关闭窗体
    }
}

//删除操作
void PeopleWin::onDeleteOperator(qint64 id)
{
    Sqlite3Db db;
    bool ret=db.deleteOperator(id);
    if(ret){
        initOperators(1);//重新加载
        QMessageBox::information(this,"信息提示","删除成功.");
    }else{
        QMessageBox::critical(this, "信息", "删除失败!");
    }
}

//绑定数据到列表
void PeopleWin::BindOperatorList(OperatorInfoList operators)
{
    ui->tableWidget->setRowCount(0);
    ui->tableWidget->verticalHeader()->hide();  // 默认的tablewidget 会有一列,这一列需要隐藏
    //设置标题栏的扩展模式为平铺
    ui->tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
    ui->tableWidget->horizontalHeader()->setSectionResizeMode(1, QHeaderView::ResizeToContents);


    // 获取当前程序所在绝对路径
    QString basePath = QCoreApplication::applicationDirPath();

    //循环绑定每个对象到列表
    for(int i=0;i<operators.size();i++){
        ui->tableWidget->setRowCount(i+1);
        ui->tableWidget->setRowHeight(i,40);//行高
        OperatorInfo opt=operators.at(i);//获取循环位置的对象
        // //第1列,绑定序号
        QTableWidgetItem *item=new QTableWidgetItem(QString::number(i+1));//创建一行记录
        item->setTextAlignment(Qt::AlignCenter);//对齐方式
        ui->tableWidget->setItem(i,0,item);//添加一行项目

        //第2列,绑定头像, 展示头像的时候,绘制一个图片
        QString fullimagePath = basePath + "/" + opt.icon; // 拼装图片所在的完整路径
        //qDebug() << fullimagePath;
        // 展示头像的时候,绘制一个图片
        QPixmap pIcon;
        pIcon.load(fullimagePath);
        pIcon = pIcon.scaled(24, 24);
        auto picLabel = new QLabel;
        picLabel->setPixmap(pIcon);
        picLabel->resize(24, 24);
        auto cellWidget = new QWidget;
        auto layout = new QHBoxLayout;
        layout->setAlignment(Qt::AlignCenter);
        layout->addWidget(picLabel);

        //第3列, 绑定姓名
        item = new QTableWidgetItem(QString("%1").arg(opt.name));
        item->setTextAlignment(Qt::AlignCenter);
        ui->tableWidget->setItem(i, 2, item);

        //第4列, 绑定用户名
        item = new QTableWidgetItem(QString("%1").arg(opt.username));
        item->setTextAlignment(Qt::AlignCenter);
        ui->tableWidget->setItem(i, 3, item);

        //第5列, 绑定地址
        item = new QTableWidgetItem(QString("%1").arg(opt.addr));
        item->setTextAlignment(Qt::AlignCenter);
        ui->tableWidget->setItem(i, 4, item);

        // 第6列,绑定性别
        QString gen;
        if (opt.gender == 0) {
            gen = "男";
        } else {
            gen = "女";
        }
        item = new QTableWidgetItem(gen);
        item->setTextAlignment(Qt::AlignCenter);
        ui->tableWidget->setItem(i, 5, item);
        cellWidget = new QWidget;
        layout = new QHBoxLayout;
        layout->setAlignment(Qt::AlignCenter);

        //第7列,操作类型
        //编辑按钮
        QPushButton *p1=new QPushButton("编辑");
        //指定样式
        p1->setStyleSheet(
            "QPushButton{color:#409EFE;background: transparent;}"
            "QPushButton:hover{color:#409EFE;background: "
            "transparent; text-decoration:underline;}");
        layout->addWidget(p1);
        //绑定事件,信号和槽函数,匿名绑定
        QObject::connect(p1,&QPushButton::clicked,[=]{
            QMessageBox::information(this,"信息提示","编辑系统."); 
        });

        //删除按钮
        QPushButton *p2=new QPushButton("删除");
        p2->setStyleSheet(
            "QPushButton{color:#409EFE;background: transparent;}"
            "QPushButton:hover{color:red;background: "
            "transparent; text-decoration:underline;}");
        layout->addWidget(p2);
        //绑定事件,信号和槽函数,匿名绑定
        QObject::connect(p2,&QPushButton::clicked,[=]{
            // QMessageBox::information(this,"信息提示","删除系统.");
            //删除前的提示确认框
            int index = QMessageBox::warning(this, "删除?", "确认删除【" + opt.username + "】数据吗?", "确认", "取消");
            if (index == 1) {
                return;
            }
            onDeleteOperator(opt.id);
        });

        cellWidget->setLayout(layout);
        layout->setContentsMargins(0,0,0,0);
        ui->tableWidget->setCellWidget(i, 6, cellWidget);
    }
}

//刷新
void PeopleWin::on_btnSearch_clicked()
{
    initOperators(1);//重新加载
}

//新增人员:1、弹出对话框 2、提供输入信息 3、保存到db
void PeopleWin::on_addButton_clicked()
{
    if( m_addOperator== nullptr){
        m_addOperator=new AddOperator(this);//创建窗体对象
        qRegisterMetaType<OperatorInfo>("OperatorInfo");
        // 绑定信号sigAddOperator和槽函数onAddOperator
        connect(m_addOperator,SIGNAL(sigAddOperator(OperatorInfo &)),this,SLOT(onAddOperator(OperatorInfo &)));
    }else{
        m_addOperator->m_basewin->show();
    }
}

3、数据库删除逻辑

cpp 复制代码
#include "sqlite3db.h"
#include <QDebug>
#include <QtSql>
#include <QSqlDatabase>
#include <QSqlQuery>

Sqlite3Db::Sqlite3Db() {}

// Qt访问Sqlite的步骤:
// 1. 引入一个模块 QT       += core gui sql
// 2. 引入头文件
// 3. 使用QSqlDatabase 来进行操作

// 根据用户名和密码来判断,当前的用户是否存在Sqlite数据库中
bool Sqlite3Db::isContain(QString userName, QString passWord, OperatorInfo &infos) {
    QSqlDatabase db;
    db.setHostName("localhost");//设置主机名
    db = QSqlDatabase::addDatabase("QSQLITE");//添加数据库类型
    db.setDatabaseName("warehouse.db");  // 设置数据库名称
    bool isOpen = db.open();//打开连接
    //输出错误信息
    qDebug() << isOpen ;
    qDebug() << db.isValid();  // true
    qDebug() << db.isOpen();   // true

    // 1.准备查询QSqlQuery 对象
    QSqlQuery query(db);
    // 2. 准备Sql语句? :占位符---避免sql注入
    QString sqlCmd = QString("SELECT * from operatorInfo where username=? and password=?");

    // 3.准备参数化占位符的数据
    query.prepare(sqlCmd);
    query.bindValue(0, userName);
    query.bindValue(1, passWord);

    //4.开始执行语句
    bool success = query.exec();
    if (success == false) {
        db.close();  // 网络资源,需要回收
        return false;
    }
    if (query.next() == false) {
        db.close();  // 网络资源,需要回收
        return false;
    }
    // 如果继续往后执行,就是已经买查询到对象了,返回这个对象的每个属性值
    OperatorInfo i;
    i.id = query.value(0).toInt();
    i.icon = query.value(1).toByteArray();
    i.username = query.value(2).toString();
    i.password = query.value(3).toString();
    i.addr = query.value(4).toString();
    i.gender = query.value(5).toInt();
    i.name = query.value(6).toString();
    i.phoneNo = query.value(7).toString();
    infos = i;
    db.close();
    return true;
}

// //查询列表
// bool Sqlite3Db::selectOperators(OperatorInfoList &operatorinfs)
// {
//     QSqlDatabase db;
//     db.setHostName("localhost");//设置主机名
//     db = QSqlDatabase::addDatabase("QSQLITE");//添加数据库类型
//     db.setDatabaseName("warehouse.db");  // 设置数据库名称
//     bool isOpen = db.open();//打开连接
//     //输出错误信息
//     qDebug() << isOpen ;
//     qDebug() << db.isValid();  // true
//     qDebug() << db.isOpen();   // true

//     // 1.准备查询QSqlQuery 对象
//     QSqlQuery query(db);
//     // 2. 准备Sql语句? :占位符---避免sql注入
//     QString sqlCmd = QString("SELECT * from operatorInfo ");
//     // 3.准备 数据
//     //query.prepare(sqlCmd);

//     //4.开始执行语句
//     bool success = query.exec(sqlCmd);
//     if (success == false) {
//         db.close();  // 网络资源,需要回收
//         OperatorInfoList list;
//         operatorinfs=list;
//         return false;
//     }

//     // 循环属性值
//     while(query.next()){
//         OperatorInfo i;
//         i.id = query.value(0).toInt();
//         i.icon = query.value(1).toByteArray();
//         i.username = query.value(2).toString();
//         i.password = query.value(3).toString();
//         i.addr = query.value(4).toString();
//         i.gender = query.value(5).toInt();
//         i.name = query.value(6).toString();
//         i.phoneNo = query.value(7).toString();
//         operatorinfs.push_back(i);
//     }
//     db.close(); // 网络资源,需要回收
//     return true;
// }


//查询列表,支持分页
bool Sqlite3Db::selectOperators(QString searchString,int pageIndex,int pageSize,int &pageCount, OperatorInfoList &operatorinfs)
{
    QSqlDatabase db;
    db.setHostName("localhost");//设置主机名
    db = QSqlDatabase::addDatabase("QSQLITE");//添加数据库类型
    db.setDatabaseName("warehouse.db");  // 设置数据库名称
    bool isOpen = db.open();//打开连接
    //输出错误信息
    qDebug() << isOpen ;
    qDebug() << db.isValid();  // true
    qDebug() << db.isOpen();   // true

    // 1.准备查询QSqlQuery 对象
    QSqlQuery query(db);
    // 2. 准备Sql语句? :占位符---避免sql注入
    QString strWhere=QString(" and 1=1");
    if(searchString.isNull()==false && searchString.isEmpty()==false){
        strWhere=QString("  and (name like '%%1%' or username like '%%2%')").arg(searchString).arg(searchString);
    }
    //查询分页数据
    QString datasql = QString("SELECT * from operatorInfo where 1=1 %1 limit %2 offset %3 ").arg(strWhere).arg(pageSize).arg((pageIndex - 1) * pageSize);
    //查询总页数
    QString pageCoutSql = QString("select count(id) from operatorInfo where 1=1 %1 ").arg(strWhere);

    //4.开始执行语句
    bool success = query.exec(datasql);
    if (success == false) {
        db.close();  // 网络资源,需要回收
        OperatorInfoList list;
        operatorinfs=list;
        return false;
    }

    // 循环属性值
    while(query.next()){
        OperatorInfo i;
        i.id = query.value(0).toInt();
        i.icon = query.value(1).toByteArray();
        i.username = query.value(2).toString();
        i.password = query.value(3).toString();
        i.addr = query.value(4).toString();
        i.gender = query.value(5).toInt();
        i.name = query.value(6).toString();
        i.phoneNo = query.value(7).toString();
        operatorinfs.push_back(i);//将数据添加到列表中
    }

    // 开始查询总条数,计算总页数
    bool success2 = query.exec(pageCoutSql);
    if (success2) {
        if (query.next()) {
            int dataCount = query.value(0).toInt();
            pageCount = dataCount / pageSize;
            if (dataCount % pageSize > 0) {
                pageCount = pageCount + 1;
            }
        }
    }


    db.close(); // 网络资源,需要回收
    return true;
}



//添加数据
bool Sqlite3Db::insertOperator(const OperatorInfo &opt)
{
    QSqlDatabase db;
    db.setHostName("localhost");//设置主机名
    db = QSqlDatabase::addDatabase("QSQLITE");//添加数据库类型
    db.setDatabaseName("warehouse.db");  // 设置数据库名称
    bool isOpen = db.open();//打开连接
    qDebug() << db.isOpen();   // true

    // 1.准备查询QSqlQuery 对象
    QSqlQuery query(db);
    // 2. 准备Sql语句
    query.prepare("insert into operatorInfo(icon,username,password,addr,gender,name,phoneNo) values (?,?,?,?,?,?,?);");
    query.bindValue(0, opt.icon);
    query.bindValue(1, opt.username);
    query.bindValue(2, opt.password);
    query.bindValue(3, opt.addr);
    query.bindValue(4, opt.gender);
    query.bindValue(5, opt.name);
    query.bindValue(6, opt.phoneNo);

    //3.开始执行语句
    bool success = query.exec();
    db.close(); // 网络资源,需要回收
    return success;
}

//删除数据
bool Sqlite3Db::deleteOperator(qint64 id)
{
    QSqlDatabase db;
    db.setHostName("localhost");//设置主机名
    db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("warehouse.db");  // 设置数据库名称
    qDebug() << db.lastError();
    qDebug() << db.isValid();  // true
    qDebug() << db.isOpen();   // true
    db.open();
    QSqlQuery query(db);
    query.prepare("delete from operatorInfo where id=?");
    query.bindValue(0, id);
    bool success = query.exec();
    db.close();
    return success;
}

4、测试效果

复制代码
原创不易,打字不易,截图不易,撸码不易,整理不易,走过路过,不要错过,欢迎点赞,收藏,转载,复制,抄袭,留言,灌水,请动动你的金手指,祝您早日实现财务自由。
相关推荐
李小白662 小时前
python 函数
开发语言·python
惬意小西瓜2 小时前
3.java常用类知识点
java·开发语言·分类
hqwest3 小时前
QT肝8天08--主界面设计
开发语言·qt·上位机·qt开发·ui设计
席万里3 小时前
使用Go做一个分布式短链系统
开发语言·分布式·golang
奔跑吧邓邓子3 小时前
【C++实战(64)】C++ 邂逅SQLite3:数据库编程实战之旅
数据库·c++·sqlite·实战·sqlite3·数据库编程
做运维的阿瑞3 小时前
Python核心架构深度解析:从解释器原理到GIL机制全面剖析
开发语言·python·架构·系统架构
会开花的二叉树4 小时前
RabbitMQ C++ 客户端封装与实战
c++·rabbitmq·ruby
敲代码的嘎仔4 小时前
JavaWeb零基础学习Day1——HTML&CSS
java·开发语言·前端·css·学习·html·学习方法