码上通QT实战29--系统设置04-用户操作管理

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(支持多种数据类型如 intQString 等)。
    • 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 框架中用于显示模态对话框的类,常用于提示、警告、错误或询问用户操作。支持标准按钮(如 OkCancel)和自定义内容。

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 的用法介绍,模态窗体与非模态窗体,新增和编辑共同窗体

复制代码
原创不易,打字不易,截图不易,撸码不易,整理不易,走过路过,不要错过,欢迎点赞,收藏,转载,复制,抄袭,留言,灌水,请动动你的金手指,祝您早日实现财务自由。
相关推荐
专注于大数据技术栈2 小时前
java学习--LinkedHashSet
java·开发语言·学习
这个图像胖嘟嘟2 小时前
前端开发的基本运行环境配置
开发语言·javascript·vue.js·react.js·typescript·npm·node.js
星竹晨L3 小时前
【C++内存安全管理】智能指针的使用和原理
开发语言·c++
宵时待雨3 小时前
数据结构(初阶)笔记归纳3:顺序表的应用
c语言·开发语言·数据结构·笔记·算法
旺仔小拳头..3 小时前
Java ---变量、常量、类型转换、默认值、重载、标识符、输入输出、访问修饰符、泛型、迭代器
java·开发语言·python
lsx2024063 小时前
Vue3 自定义指令
开发语言
牛奔3 小时前
Go语言中结构体转Map优雅实现
开发语言·后端·macos·golang·xcode
wujj_whut4 小时前
【Conda实战】从0到1:虚拟环境创建、多Python版本管理与环境切换全指南
开发语言·python·conda
蜗牛^^O^4 小时前
java中的JUC
java·开发语言