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
。 - 多线程环境下确保删除操作线程安全。
- 使用智能指针如
QSharedPointer
或QScopedPointer
管理对象生命周期。
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、测试效果
原创不易,打字不易,截图不易,撸码不易,整理不易,走过路过,不要错过,欢迎点赞,收藏,转载,复制,抄袭,留言,灌水,请动动你的金手指,祝您早日实现财务自由。