1、删除操作基本思路
在Qt中执行删除操作通常涉及删除对象、文件或数据库记录等。删除操作需要谨慎处理,确保资源被正确释放且不会导致程序崩溃。
删除动态分配的对象
使用delete
操作符删除动态分配的Qt对象,确保对象不再被引用。Qt对象通常继承自QObject
,如果对象有父对象,父对象析构时会自动删除子对象。
删除数据库记录
使用QSqlQuery
执行SQL删除语句,确保事务处理正确以避免数据不一致。
cpp
QSqlQuery query;
query.prepare("DELETE FROM table WHERE id = ?");
query.addBindValue(1);
query.exec();
注意事项
- 避免悬空指针,删除对象后将其指针设为
nullptr
。 - 多线程环境下确保删除操作线程安全。
- 使用智能指针如
QSharedPointer
或QScopedPointer
管理对象生命周期。
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、测试效果



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