QT7_视频知识点笔记_67_项目练习(页面以及对话框的切换,自定义数据类型,DB数据库类的自定义及使用)

视频项目:7----汽车销售管理系统(登录,品牌车管理,新车入库,销售统计图表)-----项目视频没有,代码也不全,更改项目练习:学生信息管理系统。

学生信息管理系统:简介:两个页面:主页面+学生信息添加页面(下面的例子仅举例学号和姓名)

在这里插入图片描述
在这里插入图片描述

1.点击添加按钮弹出添加对话框

添加一个继承自QDialog的QT界面类AddDialog(注意如果AddDialog是继承QWidget的话在主页面new 一个AddDialog的时候AddDialog页面会直接显示在主页面上)
主页面:

#include "adddialog.h"
...
AddDialog *m_addDialog;  //添加学生信息窗口//构造函数:
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);m_addDialog = new AddDialog(this);
}
void Widget::on_pushButton_add_clicked()
{//点击按钮弹出新增窗口qDebug()<<"on_pushButton_add_clicked";m_addDialog->show();
}

2.添加按钮点击取消则关闭对话框

void AddDialog::on_btnCancel_clicked()
{qDebug()<<"on_btnCancel_clicked";this->close();
}

3.添加一个数据类定义需要存储数据类型(子界面存入,传递给主界面显示)

添加Q_DECLARE_METATYPE(type)宏,能使type类型让所有基于模板的函数识别

#ifndef CSTUDENTINFO_H
#define CSTUDENTINFO_H#include <QString>
#include <QMetaType>class CStudentInfo
{
public:CStudentInfo();bool setData(int id,QString name);int id() const;void setId(int id);QString name() const;void setName(const QString &name);private://此处举例仅用两个数据信息类int m_id;              //学生id 四位数字QString m_name;        //学生名称};Q_DECLARE_METATYPE(CStudentInfo)// 该宏放在类或结构体声明的最后面
#endif // CSTUDENTINFO_H
#include "cstudentinfo.h"CStudentInfo::CStudentInfo()
{}bool CStudentInfo::setData(int id, QString name)
{m_id = id;m_name = name;return true;
}int CStudentInfo::id() const
{return m_id;
}void CStudentInfo::setId(int id)
{m_id = id;
}QString CStudentInfo::name() const
{return m_name;
}void CStudentInfo::setName(const QString &name)
{m_name = name;
}

在子界面上按这个数据类存进入:

void AddDialog::on_btnConfirm_clicked()
{qDebug()<<"on_btnConfirm_clicked";//......//把检测合格的数据添加进入int id = ui->edtId->text().toInt();QString name = ui->edtName->text();//数据类型CStudentInfo stuInfo;stuInfo.setData(id,name);//仅进行数据的修改到主页面,对话框不关闭emit sig_addStuInfo(stuInfo);
}

通过信号槽把数据类接收,并显示在主页面:
信号槽传递:

//关联槽函数connect(m_addDialog,&AddDialog::sig_addStuInfo,this,&Widget::slot_addStuInfo);bool Widget::slot_addStuInfo(CStudentInfo &stuInfo)
{//收到添加对话框发出的信号,把添加的内容显示到UI上appendToModel(stuInfo);		//此处可以收到信号传来的return true;
}

主页面model模型显示:
构造函数中:

	//实例化modelm_standardModel = new QStandardItemModel(this);//设置tableView 菜单策略 customContextMenuRequested(const QPoint &pos)ui->tableView_StudentInfo->setContextMenuPolicy(Qt::CustomContextMenu);//添加表头QStringList headerList;headerList<<"学号"<<"姓名";m_standardModel->setHorizontalHeaderLabels(headerList);ui->tableView_StudentInfo->setModel(m_standardModel);
bool Widget::appendToModel(CStudentInfo &stuInfo)
{QStandardItem *itemId = new QStandardItem(QString("%1").arg(stuInfo.id(),4,10,QLatin1Char('0')));itemId->setCheckable(true); //添加复选框itemId->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);QStandardItem *itemName = new QStandardItem(stuInfo.name());itemName->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);QList<QStandardItem*> rowItem;rowItem.append(itemId);rowItem.append(itemName);m_standardModel->appendRow(rowItem);return true;}

效果:(后续需要添加学号是否存在验证等需另外再加入判断)在这里插入图片描述

4.加入数据库进行数据的长期存储,主页面显示,子页面写入,以及删除功能

先创建一个数据库的类CDataSQLite:

#ifndef CDATASQLITE_H
#define CDATASQLITE_H#include "cstudentinfo.h"
#include <QSqlDatabase>class CDataSQLite
{
public:CDataSQLite();/*** @brief 查询所有信息* @param stuInfos* @return*///用来遍历virtual bool selectStuInfos(QList<CStudentInfo> &stuInfoList) ;     //用来新增virtual bool addStuInfo(CStudentInfo &stuInfo) ;                    virtual bool updateStuInfo(CStudentInfo &stuInfo) ;//用来删除virtual bool deleteStuInfo(int id) ;                                
private:QSqlDatabase m_db;  //数据库连接
};#endif // CDATASQLITE_H

CDataSQLite的构造函数:

	//打开数据库m_db = QSqlDatabase::addDatabase("QSQLITE"); //QMYSQLm_db.setDatabaseName("./stuInfoDB_demo.db"); // 相对路径是相对于.exe所在的文件夹下(即bin文件夹下)if(!m_db.open()){qDebug() << "Failed to Open database";return;}qDebug() << "success Open ";//如果没有这个表则会创建QSqlQuery query;QString sql = QString("create table if not exists tb_stuInfo""(id int primary key not null,""name varchar(50),""overallScore real);");if(!query.exec(sql)){qDebug() << "Failed to create table";qDebug() << query.lastQuery();return;}//关闭数据库m_db.close();

bool CDataSQLite::addStuInfo(CStudentInfo &stuInfo)
{//新增if(!m_db.open()){qDebug() << "Failed to Open Database : addStuInfo";return false;}QSqlQuery query;query.prepare("insert into tb_stuInfo (id,name)""values(:id,:name)");query.bindValue(":id",stuInfo.id());query.bindValue(":name",stuInfo.name());if(!query.exec()){qDebug() << query.lastQuery();m_db.close();return false;}m_db.close();return true;}bool CDataSQLite::selectStuInfos(QList<CStudentInfo> &stuInfoList)
{//查询if(!m_db.open()){qDebug() << "Failed to Open Database : selectStuInfos";return false;}QSqlQuery query;QString sql = "Select * from tb_stuInfo;";if(!query.exec(sql)){qDebug() << "Failed to selcet tb_stuInfo;";return false;}while(query.next()){CStudentInfo stuInfo;int id = query.value("id").toInt();QString name = query.value("name").toString();stuInfo.setData(id,name);stuInfoList.append(stuInfo);}m_db.close();return true;
}bool CDataSQLite::deleteStuInfo(int id)
{if(!m_db.open()){qDebug() << "Failed to Open Database : deleteStuInfo";return false;}QSqlQuery query;QString sql = QString("delete from tb_stuInfo where id = %1").arg(id);if(!query.exec(sql)){qDebug() << "Failed to delete stuInfo!!!";m_db.close();return  false;}m_db.close();return true;
}

使用CDataSQLite数据库类:
在主页面中,构造函数中会先实例化数据库类,然后进行遍历查询进行显示。

//在.h文件中
CDataSQLite  *m_dataSource;  //数据源//.cpp构造函数中
//实例化数据源m_dataSource = new CDataSQLite();//查询数据QList<CStudentInfo> stuInfoList;bool res = m_dataSource->selectStuInfos(stuInfoList);if(!res){QMessageBox::information(this,"提示","查询学生信息失败");return;}qDebug() << stuInfoList.size();for(int i=0;i<stuInfoList.size();++i){appendToModel(stuInfoList[i]);}

在新增页面点击确认发送信号之后,主页面接收到信号在槽函数中进行数据库类新增


//接收到子页面的确认添加按钮发出的处理信号的槽函数
bool Widget::slot_addStuInfo(CStudentInfo &stuInfo)
{//把数据添加到数据库中bool res = m_dataSource->addStuInfo(stuInfo);if(!res){QMessageBox::information(this,"提示","插入失败!!!");return false;}//收到添加对话框发出的信号,把添加的内容添加appendToModel(stuInfo);return true;
}

删除:主页面的删除按钮点击之后槽函数:on_pushButton_delate_clicked,会把勾选的数据从数据库中以及主页面中删除


void Widget::on_pushButton_delate_clicked()
{QMap<int,QStandardItem*> delRowsMap;  //待删除的行for(int row = 0;row<m_standardModel->rowCount();++row){QStandardItem *item = m_standardModel->item(row);if(item->checkState() == Qt::Checked){delRowsMap.insert(row,item);}}if(delRowsMap.size()<1)return;//弹出删除提示int res = QMessageBox::information(this,"提示","是否真的要删除",QMessageBox::Yes|QMessageBox::No);if(res == QMessageBox::No) return;QList<int> keyList = delRowsMap.keys();//1.删除数据库中的数据for(int key=keyList.size()-1;key>=0;--key){if(m_dataSource->deleteStuInfo(delRowsMap.value(keyList[key])->text().toInt())){//2.删除窗口中的数据m_standardModel->removeRow(keyList[key]);}}}

在这里插入图片描述
(存着自己看看)
项目原例子源码:链接
项目练习源码(跟博客相同,但是功能相比原例子不全):链接

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/18985.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大模型助力企业提效,九章云极DataCanvas公司联合腾讯搜狗输入法发布私有化解决方案

近日&#xff0c;九章云极DataCanvas公司与腾讯搜狗输入法的合作再次升级。在搜狗输入法开发者中心正式推出之际&#xff0c;九章云极DataCanvas公司作为搜狗输入法的首批开发合作伙伴&#xff0c;双方联合发布“企业知识管理助手”私有化解决方案。 “企业知识管理助手”整体私…

Facebook的魅力:数字时代的社交热点

在当今数字化时代&#xff0c;社交媒体已经成为人们日常生活中不可或缺的一部分&#xff0c;而Facebook作为其中的巨头&#xff0c;一直以其独特的魅力吸引着全球数十亿用户。本文将深入探讨Facebook的魅力所在&#xff0c;以及它在数字时代的社交热点。 1. 社交网络的霸主&…

最新微信小程序面试题集结

1、微信小程序与H5的区别? 第一条是运行环境的不同 传统的HTML5的运行环境是浏览器&#xff0c;包括webview&#xff0c;而微信小程序的运行环境并非完整的浏览器&#xff0c;是微信开发团队基于浏览器内核完全重构的一个内置解析器&#xff0c;针对小程序专门做了优化&…

对于高速信号完整性,一块聊聊啊(17)

再来对前仿和后仿的仿真内容回顾一下&#xff1a; 从概念上有个根本的理解 前仿真又可以分为布局前仿真和布局后仿真。前者是在设计的最初阶段&#xff0c;建立和验证详细的电气拓扑结构并以此制定出详细的约束规则。后者是在布局完成的状态下&#xff0c;在布线过程中遇到的…

随机生成序列的某一排列

随机生成1~n的某一排列&#xff0c;要求生成每种可能的排列的概率相同 。 算法描述&#xff1a; 给定数值分别为1~n的序列a&#xff0c; 循环变量i从1到n&#xff0c;每次循环将a[i]与a[i]~a[n]中的随机某元素交换&#xff0c;最后a数组即为随机生成的某一排列。 #include <…

【2024】C/C++框架和库超全总结

本文分为2部分&#xff0c;第一部分&#xff1a;值得学习的C/C语言开源项目&#xff1b;第二部分是开源框架和库 粉丝福利&#xff0c; 免费领取C/C 开发学习资料包、技术视频/项目代码&#xff0c;1000道大厂面试题&#xff0c;内容包括&#xff08;C基础&#xff0c;网络编程…

MATLAB分类与判别模型算法:基于LVQ神经网络的乳腺肿瘤诊断分类程序【含Matlab源码 MX_003期】

说明 实现基于LVQ&#xff08;Learning Vector Quantization&#xff0c;学习向量量化&#xff09;神经网络的乳腺肿瘤诊断分类任务。LVQ是一种监督学习算法&#xff0c;通常用于模式识别和分类任务。 算法思路介绍&#xff1a; 导入数据&#xff1a; 加载名为"data.mat&…

2024下半年软考报名人数较去年减少,仅52.77万

2024下半年软考报名人数 2024年上半年软考考试共计报考52.77万人&#xff0c;其中&#xff0c;初级资格5.12万人、中级资格24.37万人、高级资格23.28万人。 根据往年报名人数&#xff0c;本次考试人数是减少了的&#xff0c;原因分析如下&#xff1a; 1、原来报名热门专业系…

C++的unique_ptr::release

释放给调用方返回的存储指针的所有权&#xff0c;并将存储的指针值设置为nullptr。 使用 release接管unique_ptr存储的原始指针的所有权。 调用方负责返回的指针的删除。 unique-ptr设置为空的默认构造状态。 在调用到release后&#xff0c;您可以将兼容类型的另一个指针分配到…

SSL证书申请需要多久?

SSL证书作为一种重要的网络安全工具&#xff0c;能够确保网站数据传输的安全&#xff0c;保护用户隐私和企业数据不受侵害。本文将详细介绍SSL证书的申请流程以及所需时间&#xff0c;帮助用户更好地规划和实施网络安全策略。 SSL证书&#xff0c;也称为TLS证书或HTTPS证书&am…

rest_asyncio 简化和管理异步python编程中的 REST API 调用

简介 rest_asyncio 是一个 Python 库,用于简化和管理异步编程中的 REST API 调用。它结合了 aiohttp 和 asyncio,提供了一种高效的方式来处理网络请求和响应,特别是在需要大量并发请求的场景下,例如爬虫、批量数据获取或实时数据处理。 以下是 rest_asyncio 的主要功能和…

富格林:领会正规阻挠欺诈技巧

富格林悉知&#xff0c;在当今经济不稳定的环境下&#xff0c;投资者们越来越倾向于将资金投入到相对安全和稳定的资产中&#xff0c;而黄金往往是他们的首选之一。但现货黄金市场相对复杂&#xff0c;因此要想在这个市场中立足脚跟就得领会正规阻挠欺诈的技巧。以下富格林为大…

如何优化工时表管理,提升团队效率?

时间就是金钱&#xff0c;对于企业来说&#xff0c;有效的工时表管理可以让一切变得不同。 本文将介绍控制工时表并将业务推向新高度的策略和工具。从多级审批工作流程到利用技术&#xff0c;了解如何克服常见挑战&#xff0c;收获简化工时管理流程的回报。 工时表管理,工时表…

Ardupilot开源飞控之AP_Follow

Ardupilot开源飞控之AP_Follow 1. 源由2. 定义2.1 ModeFollow类2.1.1 ModeFollow::update2.1.2 ModeFollow::_enter2.1.3 ModeFollow::_exit 2.2 AP_Follow类2.2.1 AP_Follow::handle_msg2.2.2 AP_Follow::get_target_location_and_velocity2.2.3 AP_Follow::get_velocity_ned …

getContentView(mBinding.getRoot()); 会导致内存泄露吗?里面有SurfaceView ViewBinding

在上述代码中&#xff0c;ActivityTestingBinding 是一个 Data Binding 库生成的类&#xff0c;用于绑定 XML 布局到 Activity 中。inflate(getLayoutInflater()) 用于将布局文件解析并转换为对应的视图层次结构。然后 getWindow().setFlags() 设置窗口属性&#xff0c;保持屏幕…

小型海外仓如何选择第三方海外仓系统:多看多对比,性价比优先

在现在的海外仓市场中&#xff0c;中小型海外仓&#xff0c;家庭海外仓的占比还是非常大的。这类海外仓的一个共同点就是资金有限&#xff0c;管理能力比较弱&#xff0c;很难实现规模效应。 对于这类海外仓来说&#xff0c;选择一套合适的第三方海外仓系统&#xff0c;对提升…

好用的国产大文件传输软件有哪些,快来看看吧

在这个数字化飞速发展的时代&#xff0c;我们每天都在与各种文件打交道&#xff0c;从简单的文档到庞大的视频素材&#xff0c;文件的体积越来越大&#xff0c;传统的文件传输方式逐渐显得力不从心。面对这个挑战&#xff0c;大文件传输软件应运而生&#xff0c;它们不仅解决了…

note-网络是怎样连接的4 接入网和网络运营商

助记提要 网络包从用户传输到互联网的过程信号的调制方式ADSL使用多个频率的合成波传输信号分离器的作用电话线的特点光纤的构造光纤的原理单模光纤和多模光纤光纤接入网的两种接入方式PPP拨号上网过程ADSL和FTTH使用PPPoE的方式PPPoE的规则隧道其他接入认证方式 PPPoA和DHCP网…

基于大数据的高校生源可视化分析系统

基于大数据的高校生源可视化分析系统 “A Visual Analysis System for Higher Education Student Enrollment based on Big Data” 完整下载链接:基于大数据的高校生源可视化分析系统 文章目录 基于大数据的高校生源可视化分析系统摘要第一章 引言1.1 研究背景1.2 研究目的1.…

adam优化器计算过程(tensorflow)

一、adam原理 原理 应用 优点 缺点 二、手动实现 一步一步计算 三、使用tensorflow api实现 api使用 四、一个具体的深度学习的例子