1、前言
完成Qt中用户管理的基本功能,包括添加、编辑和删除用户。界面部分可以根据实际需求进一步美化和完善。可以通过以下步骤完成:
- 建立数据库连接并创建用户表:
- 通过Sqlite实现数据库连接
- 实现添加用户的功能:创建添加用户的对话框:
- 实现编辑用户信息的功能:创建编辑用户的对话框:
- 实现删除用户的功能:创建删除用户的对话框:
在Qt中实现添加用户和编辑用户可共用一个窗体,可以通过动态调整窗体的标题、按钮文本以及内部逻辑来实现。关键在于根据当前操作模式(添加或编辑)来调整窗体的行为和数据加载方式。根据模式调用不同的提交逻辑。
例如:
- 添加模式:标题为"添加用户",按钮文本为"添加"。
- 编辑模式:标题为"编辑用户",按钮文本为"保存"。
如果是编辑模式,需要在窗体显示时加载用户数据到表单中。在每次操作后刷新表格数据,通过以上方法,可以高效地实现添加和编辑用户共用一个窗体,减少代码重复并提升用户体验。
2、一起干
1、配置数据库

cpp
#ifndef EDITUSERDIALOG_H
#define EDITUSERDIALOG_H
#include <QDialog>
#include <QSqlDatabase>
namespace Ui {
class EditUserDialog;
}
class EditUserDialog : public QDialog
{
Q_OBJECT
public:
explicit EditUserDialog(QWidget *parent = nullptr);
~EditUserDialog();
void setUserInfo(QString uid,QString un,QString rn,QString pwd,QString group,QString posi,QString dept,QString gender,QString age,QString phone,QString desc);//设置用户信息
//设置数据库db
void setDatabase(QSqlDatabase db){
this->DB=db;
}
private slots:
void on_pb_ok_clicked();
void on_pb_no_clicked();
private:
Ui::EditUserDialog *ui;
bool m_isModify=false;//新增或编辑标识
QSqlDatabase DB;
};
#endif // EDITUSERDIALOG_H

2、实现新增
cpp
#include "settingsview.h"
#include "ui_settingsview.h"
#include <EditUserDialog.h>
#include <QMessageBox>
SettingsView::SettingsView(QWidget *parent)
: QWidget(parent)
, ui(new Ui::SettingsView)
{
ui->setupUi(this);
//设置"描述"这一列内容的模式为自动平铺,即第11列
ui->tw_users->horizontalHeader()->setSectionResizeMode(11,QHeaderView::Stretch);
//数据初始化
DB=QSqlDatabase::addDatabase("QSQLITE");
DB.setDatabaseName(QApplication::applicationDirPath()+"/data.db3");
if(!DB.open()){
//ui->lbl_error->setText("数据库对象初始化失败");
}
this->refresh();
}
SettingsView::~SettingsView()
{
delete ui;
}
//刷新
void SettingsView::refresh()
{
if(!DB.isOpen()&&!DB.open()){
return;
}
QSqlQuery query_user("select * from users");
int row=0;
//遍历查询结果,将每一行数据赋给表格控件
while(query_user.next()){
ui->tw_users->setRowCount(row+1);//产生一个新行
//编号id
QString rid = query_user.value(0).toString();
QTableWidgetItem *item = new QTableWidgetItem(rid);
item->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
ui->tw_users->setItem(row, 0, item);//给当前行设置对象
//用户id
QString uid = query_user.value(1).toString();
QTableWidgetItem *item2 = new QTableWidgetItem(uid);
item->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
ui->tw_users->setItem(row, 1, item2);//给当前行设置对象
//用户名称
QString name = query_user.value(2).toString();
item = new QTableWidgetItem(name);
item->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
ui->tw_users->setItem(row, 2, item);
//用户名
QString real = query_user.value(3).toString();
item = new QTableWidgetItem(real);
item->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
ui->tw_users->setItem(row, 3, item);
//密码
QString pwd = query_user.value(4).toString();
item = new QTableWidgetItem(pwd);
item->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
ui->tw_users->setItem(row, 4, item);
//班组
QString group = query_user.value(5).toString();
item = new QTableWidgetItem(group);
item->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
ui->tw_users->setItem(row, 5, item);
//职务
QString post = query_user.value(6).toString();
item = new QTableWidgetItem(post);
item->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
ui->tw_users->setItem(row, 6, item);
//部门
QString dept = query_user.value(7).toString();
item = new QTableWidgetItem(dept);
item->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
ui->tw_users->setItem(row, 7, item);
//用户性别
QString gender = query_user.value(8).toString();
gender=gender=="1"?"男":"女";
item = new QTableWidgetItem(gender);
item->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
ui->tw_users->setItem(row, 8, item);
//年龄
QString age = query_user.value(9).toString();
item = new QTableWidgetItem(age);
item->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
ui->tw_users->setItem(row, 9, item);
//手机
QString phone = query_user.value(10).toString();
item = new QTableWidgetItem(phone);
item->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
ui->tw_users->setItem(row, 10, item);
//描述
QString desc = query_user.value(11).toString();
item = new QTableWidgetItem(desc);
item->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
ui->tw_users->setItem(row, 11, item);
++row;
}
}
//刷新
void SettingsView::on_pb_refresh_clicked()
{
this->refresh();
}
//新增
void SettingsView::on_pb_new_clicked()
{
EditUserDialog *edu=new EditUserDialog();
edu->setDatabase(this->DB);//设置数据库
edu->exec();
this->refresh();
}
//编辑
void SettingsView::on_pb_edit_clicked()
{
// 拿到当前行数据
if(ui->tw_users->currentRow()<0){
QMessageBox::warning(this,"提示","请选择一行数据",QMessageBox::NoButton,QMessageBox::Close);
return;
}
//获取当前选择行的每列数据
QString uid= ui->tw_users->item(ui->tw_users->currentRow(),1)->text();
QString un= ui->tw_users->item(ui->tw_users->currentRow(),2)->text();
QString rn= ui->tw_users->item(ui->tw_users->currentRow(),3)->text();
QString pwd= ui->tw_users->item(ui->tw_users->currentRow(),4)->text();
QString group= ui->tw_users->item(ui->tw_users->currentRow(),5)->text();
QString posi= ui->tw_users->item(ui->tw_users->currentRow(),6)->text();
QString dept= ui->tw_users->item(ui->tw_users->currentRow(),7)->text();
QString gender= ui->tw_users->item(ui->tw_users->currentRow(),8)->text();
QString age= ui->tw_users->item(ui->tw_users->currentRow(),9)->text();
QString phone= ui->tw_users->item(ui->tw_users->currentRow(),10)->text();
QString desc= ui->tw_users->item(ui->tw_users->currentRow(),11)->text();
EditUserDialog *eud=new EditUserDialog();
eud->setDatabase(this->DB);
//将用户信息传递给页面
eud->setUserInfo(uid,un,rn,pwd,group,posi,dept,gender,age,phone,desc);
eud->exec();
this->refresh();
}
//删除
void SettingsView::on_pb_del_clicked()
{
if(ui->tw_users->currentRow()<0) {
QMessageBox::warning(this,"提示","请选择一行数据",QMessageBox::NoButton,QMessageBox::Close);
return;
}
// 弹出删除确认提示框
QMessageBox::StandardButton result = QMessageBox::question(
this, // 父窗口(确保对话框居中显示)
"确认删除", // 对话框标题
"你确定要删除这条数据吗?删除后无法恢复!", // 提示内容
QMessageBox::Yes | QMessageBox::No, // 显示的按钮
QMessageBox::No // 默认选中的按钮(防止回车误触)
);
// 根据用户选择执行对应操作
if (result == QMessageBox::Yes) {//执行删除
QString uid= ui->tw_users->item(ui->tw_users->currentRow(),1)->text();//获取用户id
QSqlQuery sqlQuery(DB);
sqlQuery.exec(QString("DELETE FROM users WHERE user_id = %1").arg(uid));//删除语句
if(!sqlQuery.exec()){
QMessageBox::warning(this,"提示","删除失败",QMessageBox::NoButton,QMessageBox::Close);
return;
}else{
QMessageBox::information(this,"提示","删除成功",QMessageBox::NoButton,QMessageBox::Close);
}
this->refresh();
} else {//返回
return;
}
}


3、实现编辑

cpp
#include "settingsview.h"
#include "ui_settingsview.h"
#include <EditUserDialog.h>
#include <QMessageBox>
SettingsView::SettingsView(QWidget *parent)
: QWidget(parent)
, ui(new Ui::SettingsView)
{
ui->setupUi(this);
//设置"描述"这一列内容的模式为自动平铺,即第11列
ui->tw_users->horizontalHeader()->setSectionResizeMode(11,QHeaderView::Stretch);
//数据初始化
DB=QSqlDatabase::addDatabase("QSQLITE");
DB.setDatabaseName(QApplication::applicationDirPath()+"/data.db3");
if(!DB.open()){
//ui->lbl_error->setText("数据库对象初始化失败");
}
this->refresh();
}
SettingsView::~SettingsView()
{
delete ui;
}
//刷新
void SettingsView::refresh()
{
if(!DB.isOpen()&&!DB.open()){
return;
}
QSqlQuery query_user("select * from users");
int row=0;
//遍历查询结果,将每一行数据赋给表格控件
while(query_user.next()){
ui->tw_users->setRowCount(row+1);//产生一个新行
//编号id
QString rid = query_user.value(0).toString();
QTableWidgetItem *item = new QTableWidgetItem(rid);
item->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
ui->tw_users->setItem(row, 0, item);//给当前行设置对象
//用户id
QString uid = query_user.value(1).toString();
QTableWidgetItem *item2 = new QTableWidgetItem(uid);
item->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
ui->tw_users->setItem(row, 1, item2);//给当前行设置对象
//用户名称
QString name = query_user.value(2).toString();
item = new QTableWidgetItem(name);
item->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
ui->tw_users->setItem(row, 2, item);
//用户名
QString real = query_user.value(3).toString();
item = new QTableWidgetItem(real);
item->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
ui->tw_users->setItem(row, 3, item);
//密码
QString pwd = query_user.value(4).toString();
item = new QTableWidgetItem(pwd);
item->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
ui->tw_users->setItem(row, 4, item);
//班组
QString group = query_user.value(5).toString();
item = new QTableWidgetItem(group);
item->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
ui->tw_users->setItem(row, 5, item);
//职务
QString post = query_user.value(6).toString();
item = new QTableWidgetItem(post);
item->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
ui->tw_users->setItem(row, 6, item);
//部门
QString dept = query_user.value(7).toString();
item = new QTableWidgetItem(dept);
item->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
ui->tw_users->setItem(row, 7, item);
//用户性别
QString gender = query_user.value(8).toString();
gender=gender=="1"?"男":"女";
item = new QTableWidgetItem(gender);
item->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
ui->tw_users->setItem(row, 8, item);
//年龄
QString age = query_user.value(9).toString();
item = new QTableWidgetItem(age);
item->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
ui->tw_users->setItem(row, 9, item);
//手机
QString phone = query_user.value(10).toString();
item = new QTableWidgetItem(phone);
item->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
ui->tw_users->setItem(row, 10, item);
//描述
QString desc = query_user.value(11).toString();
item = new QTableWidgetItem(desc);
item->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
ui->tw_users->setItem(row, 11, item);
++row;
}
}
//刷新
void SettingsView::on_pb_refresh_clicked()
{
this->refresh();
}
//新增
void SettingsView::on_pb_new_clicked()
{
EditUserDialog *edu=new EditUserDialog();
edu->setDatabase(this->DB);//设置数据库
edu->exec();
this->refresh();
}
//编辑
void SettingsView::on_pb_edit_clicked()
{
// 拿到当前行数据
if(ui->tw_users->currentRow()<0){
QMessageBox::warning(this,"提示","请选择一行数据",QMessageBox::NoButton,QMessageBox::Close);
return;
}
//获取当前选择行的每列数据
QString uid= ui->tw_users->item(ui->tw_users->currentRow(),1)->text();
QString un= ui->tw_users->item(ui->tw_users->currentRow(),2)->text();
QString rn= ui->tw_users->item(ui->tw_users->currentRow(),3)->text();
QString pwd= ui->tw_users->item(ui->tw_users->currentRow(),4)->text();
QString group= ui->tw_users->item(ui->tw_users->currentRow(),5)->text();
QString posi= ui->tw_users->item(ui->tw_users->currentRow(),6)->text();
QString dept= ui->tw_users->item(ui->tw_users->currentRow(),7)->text();
QString gender= ui->tw_users->item(ui->tw_users->currentRow(),8)->text();
QString age= ui->tw_users->item(ui->tw_users->currentRow(),9)->text();
QString phone= ui->tw_users->item(ui->tw_users->currentRow(),10)->text();
QString desc= ui->tw_users->item(ui->tw_users->currentRow(),11)->text();
EditUserDialog *eud=new EditUserDialog();
eud->setDatabase(this->DB);
//将用户信息传递给页面
eud->setUserInfo(uid,un,rn,pwd,group,posi,dept,gender,age,phone,desc);
eud->exec();
this->refresh();
}
//删除
void SettingsView::on_pb_del_clicked()
{
if(ui->tw_users->currentRow()<0) {
QMessageBox::warning(this,"提示","请选择一行数据",QMessageBox::NoButton,QMessageBox::Close);
return;
}
// 弹出删除确认提示框
QMessageBox::StandardButton result = QMessageBox::question(
this, // 父窗口(确保对话框居中显示)
"确认删除", // 对话框标题
"你确定要删除这条数据吗?删除后无法恢复!", // 提示内容
QMessageBox::Yes | QMessageBox::No, // 显示的按钮
QMessageBox::No // 默认选中的按钮(防止回车误触)
);
// 根据用户选择执行对应操作
if (result == QMessageBox::Yes) {//执行删除
QString uid= ui->tw_users->item(ui->tw_users->currentRow(),1)->text();//获取用户id
QSqlQuery sqlQuery(DB);
sqlQuery.exec(QString("DELETE FROM users WHERE user_id = %1").arg(uid));//删除语句
if(!sqlQuery.exec()){
QMessageBox::warning(this,"提示","删除失败",QMessageBox::NoButton,QMessageBox::Close);
return;
}else{
QMessageBox::information(this,"提示","删除成功",QMessageBox::NoButton,QMessageBox::Close);
}
this->refresh();
} else {//返回
return;
}
}


cpp
#include "edituserdialog.h"
#include "ui_edituserdialog.h"
#include <QDebug>
#include <QMessageBox>
#include <QSqlQuery>
#include <SystemUtils.h>
EditUserDialog::EditUserDialog(QWidget *parent)
: QDialog(parent)
, ui(new Ui::EditUserDialog)
{
ui->setupUi(this);
ui->le_title->setText("新增用户信息");
ui->pb_ok->setText("添加");
}
EditUserDialog::~EditUserDialog()
{
delete ui;
}
//设置用户信息
void EditUserDialog::setUserInfo(QString uid, QString un, QString rn, QString pwd, QString group, QString posi, QString dept, QString gender, QString age, QString phone, QString desc)
{
this->m_isModify=true;//修改状态为true,即修改
ui->le_title->setText("修改用户信息");
//将信息设置给页面标签控件
ui->le_uid->setText(uid);
ui->le_uid->setReadOnly(true);
ui->le_uname->setText(un);
ui->le_rname->setText(rn);
ui->le_pwd->setText(pwd);
ui->le_group->setText(group);
ui->le_posi->setText(posi);
ui->le_dept->setText(dept);
if(gender=="男"){
ui->rb_men->setChecked(true);
}else{
ui->rb_women->setChecked(true);
}
ui->le_age->setText(age);
ui->le_phone->setText(phone);
ui->le_desc->setText(desc);
}
//确定
void EditUserDialog::on_pb_ok_clicked()
{
QSqlQuery query(DB);
// 插入
if(!m_isModify){
QString uid=ui->le_uid->text();
if(uid.trimmed()==""){
QMessageBox::warning(this,"提示","用户id不能为空",QMessageBox::NoButton,QMessageBox::Close);
return;
}
query.prepare("insert into users(user_id,user_name,real_name,password,gname,position,department,gender,age,phone,description)"
" values(:uid,:un,:rn,:pass,:gname,:posi,:dept,:gender,:age,:phone,:remark)");
query.bindValue(":uid",ui->le_uid->text());
query.bindValue(":un",ui->le_uname->text());
query.bindValue(":rn",ui->le_rname->text());
query.bindValue(":pass",ui->le_pwd->text());
query.bindValue(":gname",ui->le_group->text());
query.bindValue(":posi",ui->le_posi->text());
query.bindValue(":dept",ui->le_dept->text());
query.bindValue(":gender",ui->rb_men->isChecked()?"1":"2");
query.bindValue(":age",ui->le_age->text());
query.bindValue(":phone",ui->le_phone->text());
query.bindValue(":remark",ui->le_desc->text());
}
else{
// 更新
query.prepare("UPDATE users SET user_name=?,real_name=?,password=?,gname=?,position=?,department=?,gender=?,"
"age=?,phone=?,description=? WHERE user_id=?");
//分别指定占位符绑定的控件值
query.addBindValue(ui->le_uname->text());
query.addBindValue(ui->le_rname->text());
query.addBindValue(ui->le_pwd->text());
query.addBindValue(ui->le_group->text());
query.addBindValue(ui->le_posi->text());
query.addBindValue(ui->le_dept->text());
query.addBindValue(ui->rb_men->isChecked()?"1":"2");
query.addBindValue(ui->le_age->text());
query.addBindValue(ui->le_phone->text());
query.addBindValue(ui->le_desc->text());
query.addBindValue(ui->le_uid->text());
}
if(!query.exec()){
QMessageBox::warning(this,"提示","操作失败",QMessageBox::NoButton,QMessageBox::Close);
return;
}else{
QMessageBox::information(this,"提示","操作成功",QMessageBox::NoButton,QMessageBox::Close);
}
this->close();
}
//取消
void EditUserDialog::on_pb_no_clicked()
{
this->close();
}
addBindValue 方法简介
addBindValue 是 Qt 框架中 QSqlQuery 类的一个方法,用于将值绑定到 SQL 查询的占位符(如 :name 或 ?)。通过参数化查询,可以防止 SQL 注入并提高查询效率。
cpp
void QSqlQuery::addBindValue(const QVariant &val, QSql::ParamType paramType = QSql::In);
- 参数
val:要绑定的值,类型为QVariant(支持多种数据类型如int、QString等)。paramType:绑定类型,默认为QSql::In(输入参数),可选QSql::Out(输出参数)或QSql::InOut。
绑定命名占位符
cpp
QSqlQuery query;
query.prepare("INSERT INTO users (name, age) VALUES (:name, :age)");
query.addBindValue("Alice"); // 绑定到第一个占位符 :name
query.addBindValue(25); // 绑定到第二个占位符 :age
query.exec();
绑定位置占位符
cpp
QSqlQuery query;
query.prepare("INSERT INTO users (name, age) VALUES (?, ?)");
query.addBindValue("Bob"); // 绑定到第一个 ?
query.addBindValue(30); // 绑定到第二个 ?
query.exec();
注意事项
- 必须在
prepare()之后、exec()之前调用addBindValue。 - 绑定顺序需与 SQL 中占位符顺序一致。
- 对于重复使用的查询,可调用
bindValue()直接指定占位符名称,灵活性更高。
bindValue 的用法介绍
bindValue 是 Qt 中用于绑定参数到 SQL 查询的方法,属于 QSqlQuery 类。通过占位符(如 :name 或 ?)动态绑定值,避免 SQL 注入并提高代码可读性。
cpp
QSqlQuery query;
query.prepare("INSERT INTO users (name, age) VALUES (:name, :age)");
query.bindValue(":name", "Alice");
query.bindValue(":age", 25);
query.exec();
占位符类型
支持两种占位符格式:
- 命名占位符 :以冒号开头(如
:param),通过名称绑定。 - 位置占位符 :使用问号(
?),按顺序绑定。
命名占位符示例
cpp
query.prepare("SELECT * FROM users WHERE name = :name");
query.bindValue(":name", "Bob");
位置占位符示例:
cpp
query.prepare("SELECT * FROM users WHERE age > ? AND salary < ?");
query.bindValue(0, 30);
query.bindValue(1, 50000);
bindValue 自动处理 Qt 数据类型到 SQL 类型的转换。
QString转为文本int转为整数QDateTime转为日期时间
注意事项
- 绑定前必须调用
prepare。 - 占位符名称区分大小写。
- 避免多次绑定同一占位符,后者会覆盖前者。
- 事务中批量操作时显式调用
transaction()和commit()。
4、实现删除

QMessageBox 是 Qt 框架中用于显示模态对话框的类,常用于提示、警告、错误或询问用户操作。支持标准按钮(如 Ok、Cancel)和自定义内容。
cpp
#include <QMessageBox>
// 信息提示框
QMessageBox::information(nullptr, "标题", "这是一条信息");
// 警告框
QMessageBox::warning(nullptr, "警告", "操作可能危险!");
// 错误框
QMessageBox::critical(nullptr, "错误", "发生严重错误!");
// 询问框(返回用户点击的按钮)
QMessageBox::StandardButton reply = QMessageBox::question(
nullptr, "确认", "确定执行?",
QMessageBox::Yes | QMessageBox::No
);
if (reply == QMessageBox::Yes) {
// 用户点击了 Yes
}
注意事项
- 模态对话框会阻塞父窗口,确保在必要时使用。
- 多语言支持可通过
tr()函数实现国际化。 - 避免过度使用复杂对话框,保持用户体验简洁。
5、运行效果








6、小结
addBindValue 方法,bindValue 的用法介绍,模态窗体与非模态窗体,新增和编辑共同窗体
原创不易,打字不易,截图不易,撸码不易,整理不易,走过路过,不要错过,欢迎点赞,收藏,转载,复制,抄袭,留言,灌水,请动动你的金手指,祝您早日实现财务自由。
