Github: https://github.com/okfanger/xiaofang-supermarket-qt

1. 项目速览

开发语言:QT 5.6.3
开发工具:QT Creator 4.0.3 (Community)
数据库:SQLite
耗时:一夜(23:00 ~ 第二天8:00)

2. 数据库表及记录

sqlconnection.h里createDatabase() 函数中已经包含有创建数据库的语句,并在main.cpp中执行。

// sqlconnection.h
static bool createConnection(){QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");db.setDatabaseName("supermarket.db");if (!db.open()) {QMessageBox::critical(0, "Cannot open database1","Unable to establish a database connection.", QMessageBox::Cancel);return false;}QSqlQuery query;query.exec("CREATE TABLE member (id INTEGER PRIMARY KEY AUTOINCREMENT, owner VARCHAR (20), gender VARCHAR, telphone VARCHAR (20), create_time DATETIME);");query.exec("CREATE TABLE goods (id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR (20), \"description\" TEXT, store INTEGER);");query.exec("CREATE TABLE user (id INTEGER PRIMARY KEY AUTOINCREMENT, username VARCHAR (20), \"password\" VARCHAR (1024));");query.exec("INSERT INTO member (id, owner, gender, telphone, create_time) \VALUES (1, '小方', '男', '18547756666', '2019-08-20 13:12:00');");query.exec("INSERT INTO member (id, owner, gender, telphone, create_time) \VALUES (2, '小红', '女', '18547757777', '2022-03-24 14:12:10');");query.exec("INSERT INTO member (id, owner, gender, telphone, create_time) \VALUES (3, '小蓝', '女', '18547758888', '2013-01-26 16:12:44');");query.exec("INSERT INTO member (id, owner, gender, telphone, create_time) \VALUES (4, '胖虎', '男', '18547759999', '2011-08-11 09:12:51');");query.exec("INSERT INTO member (id, owner, gender, telphone, create_time) \VALUES (5, '大绿', '男', '18547750000', '2021-05-26 05:12:09');");query.exec("INSERT INTO goods (id, name, description, store)\VALUES (1, '苹果', '好吃又好喝!', 99);");query.exec("INSERT INTO goods (id, name, description, store)\VALUES (2, '苏打饼干', '营养餐早餐代餐点心休闲零食下午茶', 20);");query.exec("INSERT INTO goods (id, name, description, store)\VALUES (3, '雀巢脆脆鲨', '香浓酥脆巧克力威化,独立便携小包装,随食击退小饥饿。', 30);");query.exec("INSERT INTO goods (id, name, description, store)\VALUES (4, '百吉福', '满满一杯纯正芝士', 10);");query.exec("INSERT INTO goods (id, name, description, store)\VALUES (5, '每日鲜语鲜牛奶', '每日鲜语原生高品质鲜牛奶是中国高端鲜奶品牌。', 5);");return true;
}
// main.cpp
int main(){...createConnection();...
}

3. 主要功能

3.1 登录与注册

// 登录
void loginwidget::on_pushButton_clicked()
{QString username = ui->lineEdit->text();QString password = ui->lineEdit_2->text();if (username.isEmpty() || password.isEmpty()) { // 判空QMessageBox::warning(this, "警告", "用户名或密码不能为空!", QMessageBox::Close);} else {// 算通过了,进行数据库操作// md5 加密,确保数据库中的密码不明文存储QByteArray str = QCryptographicHash::hash(password.toLatin1(),QCryptographicHash::Md5);QString encodePassword = str.toHex();QSqlQuery query;query.prepare("select * from user where username = ? and password = ?");query.bindValue(0, username);query.bindValue(1, encodePassword);if (!query.exec()) { // 如果执行失败,就操作qDebug() << Q_FUNC_INFO << query.lastError().text() << query.lastQuery();} else if(query.next()) {QMessageBox::information(this,"提示", "登录成功!", QMessageBox::Close);this->hide();
//            emit hideWindow();mw->show();} else {QMessageBox::warning(this,"提示", "用户名或密码错误", QMessageBox::Close);}}
}
// 注册
void registerwidget::on_pushButton_clicked()
{QString username = ui->lineEdit->text();QString password = ui->lineEdit_2->text();QString repeatPassword = ui->lineEdit_3->text();if (username.isEmpty() || password.isEmpty() || repeatPassword.isEmpty()) { // 判空QMessageBox::warning(this, "警告", "三个文本框不能为空!", QMessageBox::Close);} else if(password != repeatPassword) {QMessageBox::warning(this, "警告", "两次输入的密码不一致!", QMessageBox::Close);} else {// 算通过了,进行数据库操作// md5 加密,确保数据库中的密码不明文存储QByteArray str = QCryptographicHash::hash(password.toLatin1(),QCryptographicHash::Md5);QString encodePassword = str.toHex();QSqlQuery query;query.prepare("insert into user(username, password) values(?, ?)");query.bindValue(0, username);query.bindValue(1, encodePassword);if (!query.exec()) { // 如果执行失败,就操作qDebug() << Q_FUNC_INFO << query.lastError().text() << query.lastQuery();} else {QMessageBox::information(this,"提示", "注册成功!", QMessageBox::Close);}}
}

3.2 主界面

// mainwindow.h
...
private:Ui::MainWindow *ui;QWidget* tabWidgetList[3];const char* tabWidgetTitleList[3] = {"进货", "会员管理", "关于作者"};
// mainwindow.cpp
...
MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);// 定义窗口tabWidgetList[0] = new buywidget();tabWidgetList[1] = new memberwidget();tabWidgetList[2] = new aboutus();// 循环加入页面for (int i=0;i<3;i++){ui->tabWidget->addTab(tabWidgetList[i],QString(tabWidgetTitleList[i]));}//设置默认页面ui->tabWidget->setCurrentIndex(1);
}
...

3.3 会员管理

3.3.1 增加信息(新)

// 添加会员
void memberwidget::on_pushButton_3_clicked()
{addMemeberWidget->setWindowModality(Qt::ApplicationModal);addMemeberWidget->show(); // 另一个窗口
}

// 添加会员
void addmemeberwidget::on_pushButton_clicked()
{QString name = ui->lineEdit->text();QString tel = ui->lineEdit_2->text();int gender = ui->comboBox->currentIndex();// 校验合法性if (name.isEmpty()||tel.isEmpty()||gender==0) {QMessageBox::warning(this,"提示", "表单不能为空!", QMessageBox::Close);} else {QString genderString = gender == 1 ? "男" : "女";QSqlQuery query;query.prepare("INSERT INTO member (id, owner, gender, telphone, create_time)\VALUES (null, ?, ?, ?, datetime('now','localtime'));");query.bindValue(0, name);query.bindValue(1, genderString);query.bindValue(2, tel);if (!query.exec()) { // 如果执行失败,就操作qDebug() << Q_FUNC_INFO << query.lastError().text() << query.lastQuery();} else {QMessageBox::information(this,"提示", "添加成功!", QMessageBox::Close);this->close();}}
}

3.3.2 删除会员(删)

// 删除
void memberwidget::on_pushButton_2_clicked()
{// 获取选中的行int curRow = ui->tableView->currentIndex().row();// 删除该行memberModel->removeRow(curRow);int ok = QMessageBox::warning(this,tr("删除当前行!"),tr("你确定删除当前行吗?"),QMessageBox::Yes,QMessageBox::No);if(ok == QMessageBox::No){ // 如果不删除,则撤销memberModel->revertAll();} else { // 否则提交,在数据库中删除该行memberModel->submitAll();}
}

3.3.3 修改信息(改)

由于 QSqlTableModel 自带修改功能,所以我们所做的反而是禁止某些列的修改(比如ID,创建日期)。

...// 编号列不可修改ui->tableView->setItemDelegateForColumn(0, new ReadOnlyDelegate(this)); // 创建时间列不可修改ui->tableView->setItemDelegateForColumn(4, new ReadOnlyDelegate(this)); // 修改时变为下拉列表ui->tableView->setItemDelegateForColumn(2, new GenderButtonDelegate(this));

3.3.1 筛选(查)

// 重置筛选条件
void memberwidget::on_pushButton_clicked()
{ui->comboBox->setCurrentIndex(0); // 性别下拉菜单调到空ui->lineEdit->clear(); // 清空文本框ui->lineEdit_2->clear();// 清空文本框
}
// 三条件筛选
void memberwidget::selectByFilter(){int gender = ui->comboBox->currentIndex();QString owner = ui->lineEdit->text();QString tel = ui->lineEdit_2->text();bool genderOn = gender != 0;bool ownerOn = !owner.isEmpty();bool telOn = !tel.isEmpty();QString querySQL = "1 = 1";if (genderOn) querySQL.append(QString(" and gender = '%1'").arg(gender == 1?"男":"女"));if (ownerOn) querySQL.append(QString(" and owner like '%%1%'").arg(owner));if (telOn) querySQL.append(QString(" and telphone like '%%1%'").arg(tel));memberModel->setFilter(querySQL);qDebug() <<"SQL语句:"<<querySQL<<"\n";memberModel->select();
}

3.4 进货出货

这个看一乐就行,主要是没时间做了。。。

//进货
void buywidget::on_pushButton_clicked()
{int curRow = ui->tableView->currentIndex().row();auto oldValue = model->record(curRow).value(QString("store")).toInt();auto newValue = oldValue + 1;model->setData(model->index(curRow, 3), QVariant(newValue));//重新设置当前单元格内容
}
//出货
void buywidget::on_pushButton_2_clicked()
{int curRow = ui->tableView->currentIndex().row();auto oldValue = model->record(curRow).value(QString("store")).toInt();auto newValue = (oldValue - 1>0)?oldValue - 1:0;model->setData(model->index(curRow, 3), QVariant(newValue));//重新设置当前单元格内容
}

银行管理系统 - 2022计科实训QT课设相关推荐

  1. 【免费学习半个月】强烈推荐你学习这个《机器学习与推荐系统实训强化课》...

    前几天,我给朋友推荐一个课程,跟他说认真学能拿到头条offer,一开始还说我吹牛,看完介绍,结果直接就报名了.就是下面这个 <机器学习与推荐系统实训强化课> 「Machine Learni ...

  2. 想拿头条百度39W年薪算法offer?推荐你学这个机器学习与推荐系统项目实训强化课...

    前几天,我向朋友推荐这个课程. 跟他说,学完能拿大厂机器学习.推荐系统算法方向的offer.结果他看完介绍,直接就报名了. 这个课程是BAT P8级别团队Leader全程亲自授课:并精选多个工业级机器 ...

  3. 一个简单的员工薪资管理系统(大一\二实训课)

     废话: 今天是10月19号..抽时间把代码更新了一下,不知为何突发奇想,又添加了了一个薪资状况概览的小功能. 本来想直接用Qt修代码发桌面版的,,奈何Qt才学了两天完全修不了,,只能发普通的控制台版 ...

  4. 计算机进位计数制实训课教案,《计算机应用基础》职高2010修订版 教案.doc

    文档介绍: <计算机应用基础>职高2010修订版教案<计算机应用基础>职高2010修订版教案计算机基础知识中文WindowsXP文字处理软件word2003中文Excel200 ...

  5. educoder头歌Web实训 web课——综合应用案例:动态焦点图页面的制作

    educoder头歌Web实训 太原理工web课--综合应用案例:拼图页面的制作[全网更新最快]_玛卡巴卡的博客-CSDN博客 第1关:动态焦点图页面的样式设计 任务描述 本关任务: 完成动态焦点图 ...

  6. 【实训】第二期实训结课项目——外卖小程序

    大二暑假的第二期实训,当时主要学的是小程序和maven,我在项目中担任组长,负责数据库的设计.后端代码的编写.ppt编写和最后的答辩. 课程结束后只给了四天的时间进行开发,大部分人都是第一次接触微信小 ...

  7. educoder头歌Web实训 web课——综合应用案例:限时秒杀效果的制作

    educoder头歌Web实训 太原理工web课--综合应用案例:动态焦点图页面的制作[全网更新最快]_玛卡巴卡的博客-CSDN博客 第1关:限时秒杀效果图片渲染 [TOC] 图1如下 链接为htt ...

  8. educoder头歌实训 web课——JavaScript语言基础:JS循环语句

    educoder头歌实训 太原理工大学web课程----JavaScript语法基础:JS运算符_玛卡巴卡的博客-CSDN博客 第1关:while类型 任务描述 质数的定义如下:大于1的自然数,且除 ...

  9. 课程标准模板 java,实训(Web)课课程标准模板

    <Web程序设计与框架技术实训>课程标准 1.课程信息 2.课程性质 2.1课程在专业中的地位 <Web程序设计与框架技术实训>课程是软件技术专业(Java方向)最核心一门课程 ...

最新文章

  1. Nature封面:IBM团队发布“AI辩论家”最新研究进展、Insitro创AI制药领域单笔融资金额记录 | AI日报...
  2. python 选择不同数据库环境执行SQL文件
  3. Python学习之==文件操作
  4. 超级高铁Hyperloop进入新阶段,将在华盛顿破土动工!
  5. php改变图片类型,php 图片处理函数 获取类型 扩展名
  6. sqlyong的一个bug(代号2013)
  7. 卸载阿里云服务器的mysql_阿里云服务器购买,双11领阿里云服务器优惠券!
  8. java传递json_JAVA中使用JSON进行数据传递示例
  9. php后门 佛像,给千年佛像做了个CT,结果好吓人
  10. Vue 项目中各种痛点问题及方案(建议收藏)
  11. 终于有人把XGBoost 和 LightGBM 讲明白了,项目中最主流的集成算法!
  12. XP系统电脑因“未激活”无法登录进入桌面,而输入序列号后提示“已激活”,以此死循环
  13. java里异常名词解释_java名词解释
  14. APS生产计划排程系统解决方案,在制造企业中有哪些作用?
  15. DNS工作原理及其过程
  16. 压敏电阻MOV特性及选用
  17. 如何用tushare复盘
  18. 高德地图手机端定位偏移问题
  19. 21西南交通大学计算机专硕成功上岸
  20. 02.Java开发环境搭建

热门文章

  1. getchar()用法 与 getch()函数使用方法
  2. unix_timestamp、from_unixtime时间戳函数的使用
  3. Table边框使用总结 ,只显示你要显示的边框
  4. linux压缩文件恢复,Linux文件误删恢复
  5. IMAUOJ——1013: 超级密码
  6. e1000网卡驱动第二天_3
  7. 基于JavaWeb+MySQL的简历信息管理系统
  8. 基于灰度质心法和骨架的激光中心线提取
  9. STM32F10xxx20xxx21xxxL1xxxx Cortex-M3程序设计手册 阅读笔记三(2):Cortex-M3内部函数
  10. FCPX:镜头故障抖动效果TOBK TWITCH for Mac