当前位置: 首页 > news >正文

QT肝8天13--删除用户

1、删除操作基本思路 

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

删除动态分配的对象

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

删除数据库记录

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

QSqlQuery query;
query.prepare("DELETE FROM table WHERE id = ?");
query.addBindValue(1);
query.exec();

注意事项

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

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

1、在列表页面添加一栏

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

#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和槽函数onAddOperatorconnect(m_addOperator,SIGNAL(sigAddOperator(OperatorInfo &)),this,SLOT(onAddOperator(OperatorInfo &)));}else{m_addOperator->m_basewin->show();}
}

3、数据库删除逻辑

#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();  // trueqDebug() << 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();  // trueqDebug() << 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();  // trueqDebug() << db.isOpen();   // truedb.open();QSqlQuery query(db);query.prepare("delete from operatorInfo where id=?");query.bindValue(0, id);bool success = query.exec();db.close();return success;
}

4、测试效果

原创不易,打字不易,截图不易,撸码不易,整理不易,走过路过,不要错过,欢迎点赞,收藏,转载,复制,抄袭,留言,灌水,请动动你的金手指,祝您早日实现财务自由。

http://www.dtcms.com/a/439202.html

相关文章:

  • 素材分享网站源码北龙中网 可信网站验证 费用
  • P7226 [COCI 2015/2016 #3] POT
  • 网店代运营网站建设银行信用卡积分兑换话费网站
  • 数字资产离婚分割案:巨额数字资产归谁所有?
  • 网站源码安装教程阳江房产网站
  • 2.VMware上的Kali Linux操作系统安装(2025年10月3日)
  • 全志T113-S3开发板遇到的问题
  • 神卓云监控 K900:异地监控技术落地与方案优化实践
  • 东莞企业网站排名wordpress重置后密码是多少
  • 设计网站建设网站美化教程下载
  • 队列算法精讲:从栈与队列互实现到循环队列(待补充)
  • 蝴蝶优化算法:原理、改进与应用
  • 你会怎么做外国的网站建一个购物网站多少钱
  • 数据驱动下的集成学习实战:从算法选型到业务落地的完整方法论
  • dw旅游网站模板下载物流网站如何设计
  • 建网站能挣钱吗WordPress老文章提示
  • 类中特殊成员(Num018)
  • 网站策划书市场分析商场设计案例分析
  • 比利时网站后缀做漫画封面的网站
  • [创业之路-666]:第四次工业革命(智能革命)未来将创造大量的财富,普通人通过哪些方式参与这些财富的创造与分享?
  • 力扣2653. 滑动子数组的美丽值
  • 网站开发的常见编程语言有哪些成都广告公司招聘信息
  • 给网站做引流多少钱网站sem怎么做
  • 辽宁省水利建设市场信用信息平台网站营销推广策划
  • 欢迎进入河南国安建设集团有限公司网站十大不收费看盘软件排名下载
  • 淘宝上面建设网站安全么夜猫直播视频下载
  • 宝应网站设计17做网站 一件代发
  • DBCA静默创建Oracle CDB与PDB:两种实战方法详解
  • ARM内核
  • 佛山网站建设哪个wordpress主题汉化版