基于Qt的app开发第六天
写在前面
博主是一个大一下的计科生,现在正在做C++面向对象程序设计的课程设计,具体功能可以看本专栏的第一篇博客。
目前的进度是:配好MySQL驱动->设计完界面->实现各个界面的切换
这一篇博主要初步实现待办板块的功能,即新建和修改
板块功能分析
(1)预期功能
这个板块博主的预期是:点新建,然后就弹到第二页界面,在第二个界面输入内容之后,点应用就可以保存这些,然后在第一个界面就出现了这个新建的任务,依次类推可以设置很多个这样的任务,然后等界面占满可以用鼠标滚轮上下滚动。点击修改进入第二个界面,然后修改了内容之后第一个界面会对应改变
像里边的按优先级或分类或开始时间排序、提醒功能后续再做
(2)项目难点
1.每次新建任务块都要新建控件吗?那控件需要开多少个才算够?
2.鼠标滚轮滑屏怎么实现?
3.怎么实现每一次修改或新建都对应正确的任务块?
这是博主目前面临的难点,因为我还没学这部分知识
(3)难点解决
受了某位学长的指点,我最后决定使用TableView来解决这个问题。我只能说,做项目最怕的就是你不知道你自己不知道。很多东西其实又方便又好用,但是你根本不知道它的存在,所以就会走弯路
为什么要用TableView呢?因为TableView会自动生成滚轮,而且实现对应也更简单,还不需要再新建控件,只要加一行数据就行,这样的话就只有新建或修改与正确的任务块对应是一个困难了
来说一下博主的天才思路:
当点击新建按钮时,用户输入内容,点击应用后这些内容传到shiftTaskList中,然后这些内容再从shiftTaskList传到tableView中,清空shiftTaskList;当选中一行数据,再点击修改时,通过索引判断选中的行数,然后把tableView里这一行的数据传进shiftTaskList中,然后这些内容通过shiftTaskList传到第二个界面中,用户在这里修改之后点击应用,被修改的数据再传回shiftTaskList里,然后再传回对应的tableView里
这个思路是我想了很久突然一下悟到的,感觉自己特别天才,因为这个真正是博主依靠自己想到的实现思路
(4)实现步骤
在Task里声明一个QList类成员变量,这个成员变量的作用是中介——>把原来的控件删了,把修改按钮移到最下边——>添加TableView控件,并添加表头——>建立表格与新建按钮的联系,这个是通过QList实现的——>将新建界面的内容传回表格里,这个也是通过QList实现的——>设置修改与每一行的对应,同样是通过QList实现——>将表格里的内容传到修改界面里——>将修改界面的内容传回表格里
功能实现
(1)修改控件
关于控件,看过我这个专栏之前的博客就知道它刚开始不是这样的
这个界面的控件博主改了至少三四遍,最后定下了这个版本。程序员一定是碰壁最多的行业
还要在这里实现cmobo box控件的显示,优先级提供P1-P7,提醒时间提供三天前、一天前、一小时前、十分钟前
在设计里右键控件,然后添加即可
(2)在代码里添加TableView
#include <QTableView>
#include <QStandardItemModel>
先包含必要的头文件
//这个函数的作用是获取并初始化TableView控件
void Task::GettaskShowTableView()
{//获取界面中的表格对象QTableView *taskShow = ui->taskShowTableView;//设置taskShowTableView的表头model->setColumnCount(6);model->setHorizontalHeaderLabels({"任务名", "开始时间","结束时间", "优先级", "分类", "提醒时间"});taskShow->setModel(model);
}
这个代码的作用是设置表头
(3)新建QList成员变量
QList<QString> shiftTaskList;
在私有成员部分声明QList类成员变量,这个变量的作用是中介
(4)实现新建功能
实现思路:
因为应用按钮的槽函数是包括修改和新建的,所以根本不知道点击应用时处理的是修改还是新建,要设置一个判断变量,调用新建按钮时这个变量赋值为1,调用修改按钮时这个变量赋值为2,然后就可以用if判断一下按下的是哪个按钮进而处理了。
新建功能在保存函数里实现,先通过变量捕获界面的文本框的文本,然后把这些变量存进QString型变量中,再把这些变量存进tableView里
void Task::on_task_applyButton_clicked()
{ui->stackedWidget->setCurrentIndex(0);if(addOrRevise==1){//这几行代码的作用是获取第二个界面输入框里的文本QString name=ui->taskNameInput->text();QString startTime=ui->taskdecide_startTimeInput->text();QString endTime=ui->taskdecide_endTimeInput->text();QString category=ui->categoryInput->text();QString priority=ui->priorityChoice->currentText();QString remindTime=ui->remindTimeChoice->currentText();//这几行代码的作用是向中介数组添加数据shiftTaskList.append(name);shiftTaskList.append(startTime);shiftTaskList.append(endTime);shiftTaskList.append(category);shiftTaskList.append(priority);shiftTaskList.append(remindTime);//这几行代码的作用是向tableView里添加一行int row = model->rowCount();model->insertRow(row);for (int col = 0; col < 6; col++){QStandardItem *item = new QStandardItem(shiftTaskList.at(col));model->setItem(row, col, item);}//这句代码的作用是清空这个数组,方便下次使用shiftTaskList.clear();}}
解释见注释,都是固定套库函数。这里只解释一下连接tableView部分:
先获取当前行数,以免把已有的数据给替换掉;然后在要插入的这一行每一列都创造一个模型对象,它会自动调用它写好的析构函数,不需要我们去释放,然后加进去内容就可以了
在这里补充一下:一定要把ui里的内容重新置空,否则下次点开还是那个内容
(5)实现修改功能
实现思路:这个的难度要比新建再大一点,因为它还要先获取选中的索引再传到第二个界面里
实现步骤:先给tableView设置一个行选择模式,然后用库函数选中这一行,把这一行的数据存进QList类的成员变量里,然后在应用按钮的槽函数的另一个判断里把这些数据传进第二个界面里,在第二个界面里改完再取出来,接着放进tableView被选中的那一行
这里函数内容写的地方也很重要,要搞清楚这个功能的运行顺序:先选中对应行,再点修改,再点应用。
所以设置选择模式并获取行号应该放在所有东西的最前边,向第二个界面传数据的操作应该放在修改按钮的槽函数里
修改按钮的槽函数:
//这个函数的作用是修改已经存在的任务
void Task::on_reviseButton_clicked()
{//这段代码的作用是将表格中被选中的行的内容依次存进中介数组if (currentRow != -1){for (int col = 0; col < 6; col++){QModelIndex index = model->index(currentRow, col);QVariant data = model->data(index);shiftTaskList.append(data.toString());}}//这段代码的作用是在界面中设置中介数组中的内容ui->taskNameInput->setText(shiftTaskList[0]);ui->taskdecide_startTimeInput->setText(shiftTaskList[1]);ui->taskdecide_endTimeInput->setText(shiftTaskList[2]);ui->categoryInput->setText(shiftTaskList[3]);ui->stackedWidget->setCurrentIndex(1);
}
表格的点击槽函数:
void Task::on_taskShowTableView_clicked(const QModelIndex &index)
{currentRow = index.row();addOrRevise = 2;
}
保存函数的修改模式:
else if(addOrRevise==2){//这段代码的作用是获取当前界面的输入框的内容QString name=ui->taskNameInput->text();QString startTime=ui->taskdecide_startTimeInput->text();QString endTime=ui->taskdecide_endTimeInput->text();QString category=ui->categoryInput->text();QString priority=ui->priorityChoice->currentText();QString remindTime=ui->remindTimeChoice->currentText();//这段代码的作用是把捕获到的内容再存进中介数组中shiftTaskList.append(name);shiftTaskList.append(startTime);shiftTaskList.append(endTime);shiftTaskList.append(category);shiftTaskList.append(priority);shiftTaskList.append(remindTime);//这个循环的作用是把中介数组的内容传进选中的行中for (int col = 0; col < 6; col++){QStandardItem *item = new QStandardItem(shiftTaskList.at(col));model->setItem(currentRow, col, item);}//清空中介数组方便下次使用shiftTaskList.clear();//将界面置空方便下次使用ui->taskNameInput->setText("");ui->taskdecide_startTimeInput->setText("");ui->taskdecide_endTimeInput->setText("");ui->categoryInput->setText("");//将选择模式置空,防止干扰下次使用addOrRevise=0;}
注意事项
博主在完成这个项目的过程中其实并没有博客体现的这么顺利,不说碰的壁了,就说面对的bug吧
这个选择模式变量在使用完一定要置空,要不然后续可能会产生干扰;中介数组、第二个界面同理
修改的逻辑顺序要搞清楚,博主最开始全部写在了第二个界面的应用按钮,那怎么能行呢?对吧,因为要在第二个界面展示前就把文本框内容设置好
其他的可能出错的倒是没了,这个思路搞清楚还是很容易实现的
还要注意:做到现在并没有实现存储,也就是说每次打开项目先前新建的任务都会消失
因为存储这部分不是博主做,博主还没学数据库,是带博主的学长负责服务器的数据库存储
写在最后
这个项目单单是这个环节,我就卡了一个星期。因为我很多东西都不知道,后来就走了弯路,走了弯路发现实现不了,然后就去找其他方法。
最后这个版本可能不是最好的实现方式,但是这已经是我寻求各方资料+自己沉淀的结果了,就目前我的水平来说,这个已经是巅峰
尽管这个项目只做了冰山一角,但是我的成长已经非常大了。可以说这是博主正经做的第一个项目,虽然它规模不大,技术栈也很窄,但是我确确实实从里边学到了很多。
计算机就是三分学七分练,我现在已经深刻地理解了这句话。今天下午博主做了五个小时,晚上做了两个半小时,最终做到了这一步,实现了我认可的“从无到有”。现在回头看,这个实现其实并不困难,很好理解,但是博主是从什么都不知道到独立实现这个功能的。我真正实现了从无到有的跨越,心中的高兴是难以言表的。
同时博主对Qt的理解和熟练度也提升了很多,这是光学不练永远做不到的,今后博主也会积极做项目,项目做的越多,技术才能越来越强
相关文章:

基于Qt的app开发第六天
写在前面 博主是一个大一下的计科生,现在正在做C面向对象程序设计的课程设计,具体功能可以看本专栏的第一篇博客。 目前的进度是:配好MySQL驱动->设计完界面->实现各个界面的切换 这一篇博主要初步实现待办板块的功能,即新建…...

npm create vite@latest my-vue-app 解读
背景发荧光的样式。 filter属性的学习:filter - CSS:层叠样式表 | MDN 复习一下em 组件的调用: 是msg让“ViteVue”显示出来的!! a标签的targte属性: 组件之间怎么传值的: ,没看懂code标签怎么…...

【SpringCloud GateWay】Connection prematurely closed BEFORE response 报错分析与解决方案
一、背景 今天业务方调用我们的网关服务报错: Connection prematurely closed BEFORE response二、原因分析 三、解决方案 第一步: 增加 SCG 服务的JVM启动参数,调整连接获取策略。 将连接池获取策略由默认的 FIFO(先进先出)变更为 LIFO(…...
ABP vNext 集成高性能、高可靠 MQTT 服务器实战
🚀 ABP vNext 集成高性能、高可靠 MQTT 服务器实战 🔧 本文将从实战出发,带你一步步在 ABP vNext 框架中集成 MQTT 服务,构建一个高性能、高可靠的物联网通信平台。适合 IoT 系统、智能硬件平台和实时监控场景。 🛠️ …...

PD快充诱骗协议芯片XSP04D与主板共用一个Type-C和电脑传输数据
随着智能电子产品的广泛应用,快充方案越来越受到重视,且迭代次数也更加频繁。在一些使用频率较高、耗电较大的电子产品中,快充方案也成为了大多数人的追求,它能很大程度上缩短充电的时间,例如XSP04D这款快充诱骗协议方…...

goland无法debug
goland无法使用debug,修复_goland无法debug-CSDN博客...

ECLIC中断流程及实际应用 —— RISC-V中断机制(二)
在长期的嵌入式开发实践中,对中断机制的理解始终停留在表面层次,特别当开发者长期局限于纯软件抽象层面时,对中断机制的理解极易陷入"知其然而不知其所以然"的困境,这种认知的局限更为明显;随着工作需要不断…...

【网络分析工具】网络工具wireshark、TCPdump、iperf使用详解
这里写目录标题 1. wireshark1.1. 过滤包1.2. 常见分析 2. tcpdump3. iperf 1. wireshark **ip.dst eq 10.0.0.21** 是用于网络流量分析工具(例如 Wireshark 或 tcpdump)的过滤器表达式。 它的作用是筛选出所有目标IP地址为 10.0.0.21 的数据包 IP.add…...

debian中笔记本的省电选择auto-cpufreq
在reddit中,看评论区出现这个软件,于是打算尝试一下,应该能对不使用电源时笔记本的省电起到一定的作用。 https://github.com/AdnanHodzic/auto-cpufreq?tabreadme-ov-file#why-do-i-need-auto-cpufreq 作用 One of the problems with Linux…...

力扣热题100之环形链表 II
题目 给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使…...

【记录】HunyuanVideo 文生视频工作流
HunyuanVideo 文生视频工作流指南 概述 本指南详细介绍如何在ComfyUI中使用腾讯混元HunyuanVideo模型进行文本到视频生成的全流程操作,包含环境配置、模型安装和工作流使用说明。 参考:https://comfyui-wiki.com/zh/install/install-comfyui/install-c…...

SpringCloud之Ribbon基础认识-服务负载均衡
0、Ribbon基本认识 Spring Cloud Ribbon 是基于 Netflix Ribbon 实现的一套客户端 负载均衡的工具。 Ribbon 主要功能是提供客户端负载均衡算法和服务调用 Ribbon 客户端组件提供一系列完善的配置项如连接超时,重试等。 Ribbon 会基于某种规则(如简单…...
[Java实战]Spring Boot 静态资源配置(十三)
[Java实战]Spring Boot 静态资源配置(十三) 引言 静态资源(如 HTML、CSS、JavaScript、图片等)是 Web 应用的基石。Spring Boot 通过自动化配置简化了静态资源管理,但面对复杂场景(如多模块项目、CDN 集成…...

重生之我在2024学Fine-tuning
一、Fine-tuning(微调)概述 Fine-tuning(微调)是机器学习和深度学习中的一个重要概念,特别是在预训练模型的应用上。它指的是在模型已经通过大量数据训练得到一个通用的预训练模型后,再针对特定的任务或数据…...

Selenium Web自动化测试学习笔记(一)
自动化测试 技术手段模拟人工,执行重复性任务,准确率100%,高于人工 selenium 可通过浏览器驱动控制浏览器,通过元素定位模拟人工,实现web自动化,没有焦点(把浏览器放在最小化依然可以&#x…...

2025年5月15日前 免费考试了! Oracle AI 矢量搜索专业认证
2025年5月5日前 免费考试了! Oracle AI 矢量搜索专业认证 立刻预约吧 文章目录 2025年5月5日前 免费考试了! Oracle AI 矢量搜索专业认证立刻预约吧🔍 探索 AI 向量搜索的强大功能!🎯 学习路径目标Ὦ…...
服务器不备案有影响吗
在当今数字化的时代,服务器成为了众多企业和个人开展业务、展示自我的重要工具。然而,有一个问题常常被忽视,那就是服务器不备案到底有没有影响? 答案是肯定的!服务器不备案,影响可不小。据相关数据显示&a…...

EasyRTC嵌入式音视频通话SDK驱动智能硬件音视频应用新发展
一、引言 在数字化浪潮下,智能硬件蓬勃发展,从智能家居到工业物联网,深刻改变人们的生活与工作。音视频通讯作为智能硬件交互与协同的核心,重要性不言而喻。但嵌入式设备硬件资源受限,传统音视频方案集成困难。EasyRT…...
力扣-21.合并两个有序链表
题目描述 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 class Solution { public:ListNode *mergeTwoLists(ListNode *list1, ListNode *list2) {ListNode *l new ListNode(-1);ListNode *p l;while (list1 &&…...
多线服务器具有什么优势
在当今数字化飞速发展的时代,多线服务器宛如一位低调的幕后英雄,默默为我们的网络世界提供着强大的支持。那么,多线服务器到底具有哪些令人瞩目的优势呢 首先,多线服务器的最大优势之一就是网络访问的高速与稳定。想象一下&#x…...
ESP32 PWM音频应用及场景说明
ESP32芯片的PWM(脉冲宽度调制)功能在音频应用中具有广泛用途,尤其是在低成本、低功耗的场景中。以下是具体的应用举例和应用场景说明: 一、ESP32 PWM音频应用举例 1. 简单音频播放 实现方式:通过PWM生成模拟音频信号&…...
C++.变量与数据类型
C++变量与数据类型 1. C++变量与数据类型1.1 基本数据类型1.2 复合数据类型2.1 定义方式2.2 常量类型3.1 数据类型修饰符3.2 存储类修饰符3.3 类访问修饰符4.1 算术运算符4.2 关系运算符4.3 逻辑运算符4.4 赋值运算符4.5 条件运算符4.6 位运算符5. 总结5.1 变量与数据类型5.2 常…...
Compose笔记(二十二)--NavController
这一节主要了解一下Compose中的NavController,它是实现导航功能的核心组件,提供了强大而灵活的页面管理能力,用于管理导航图中的目的地和执行导航操作。 API navigate(route: String) 含义:导航到指定路由的目的地。 作用&#x…...
SQL:SELF JOIN(自连接)与CROSS JOIN(交叉连接)
目录 SELF JOIN(自连接) CROSS JOIN(交叉连接 / 笛卡尔积) 示例: SELF JOIN CROSS JOIN 如果没有 DATEDIFF() 函数怎么办? 🔍 SELF JOIN vs CROSS JOIN 对比总结 SELF JOIN(自…...
互联网大厂Java求职面试:基于RAG的智能问答系统设计与实现-1
互联网大厂Java求职面试:基于RAG的智能问答系统设计与实现-1 场景背景 在某互联网大厂的技术面试中,技术总监张总正在面试一位名为郑薪苦的求职者。郑薪苦虽然对技术充满热情,但回答问题时总是带着幽默感,有时甚至让人哭笑不得。…...

Ubuntu 22.04.5 LTS 基于 kubesphere 安装 cube studio
Ubuntu 22.04.5 LTS 基于 kubesphere 安装 cube studio 前置条件 已经成功安装 kubesphere v4.3.1 参考教程: https://github.com/data-infra/cube-studio/wiki/%E5%9C%A8-kubesphere-%E4%B8%8A%E6%90%AD%E5%BB%BA-cube-studio 1. 安装基础依赖 # ubuntu安装基础依赖 apt insta…...

1.短信登录
1.0 问题记录 1.0.1 redis 重复 token 问题 每次用户登录时,后端会创建一个新的 token 并存入 Redis,但之前登录的 token 还没有过期。这可能会导致以下问题: 1. Redis 中存在大量未过期但实际已不使用的 token2. 同一用户可能有多个有效 …...

Linux-Ubuntu安装Stable Diffusion Forge
SD Forge在Win上配置起来相对简单且教程丰富,而在Linux平台的配置则稍有门槛且教程较少。本文提供一个基于Ubuntu24.04发行版(对其他Linux以及SD分支亦有参考价值)的Stable Diffusion ForgeUI安装配置教程,希望有所帮助 本教程以N…...

MixTeX - 支持CPU推理的多模态LaTeX OCR
文章目录 一、项目概览相关资源核心特性技术特点 二、安装三、使用说明环境要求 四、版本更新五、当前限制 一、项目概览 MixTeX是一款创新的多模态LaTeX识别小程序,支持本地离线环境下的高效CPU推理。 无论是LaTeX公式、表格还是混合文本,MixTeX都能轻…...
生成了一个AI算法
import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms # 1. 数据预处理 transform transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,)) # MNIST单通道归一化 ]) train_da…...