【二十四】【QT开发应用】ScorllArea应用3,补全ScorllArea代码以及ListWidget与ScorllArea联动的信号槽和槽函数编写

补全ScorllArea代码逻辑

我们将其他ListItem项目全部设置成和基本设置一样的代码,唯独不一样的就是把题头的label修改成对应的文本,例如基本设置,云盘设置等。
在这里插入图片描述

Widget对应一个类

每一个Widget创建对应的类,头文件和cpp文件,里面的代码和CBaseSetWidget类代码类似。
在这里插入图片描述
唯一不一样的就是把题头的Text文本修改成对应的文本。
在这里插入图片描述

主Widget中定义每个类的指针对应一个widget

在这里插入图片描述

定义存储widget指针的vector

在主widget中定义全局变量vector存储widget指针。
在这里插入图片描述

将各个widget创建并添加到ScorllArea

QWidget* pWidget = new QWidget;
QVBoxLayout* pVLayout = new QVBoxLayout(pWidget);m_pBaseSetWidget = new CBaseSetWidget;
m_pYunpanSetWidget = new CYunPanSetWidget;
m_pDownloadWidget = new CDownloadWidget;
m_pJieguanWidget = new CJieguanWidget;
m_pRenwuWidget = new CRenwuWidget;
m_pTixingWidget = new CTixingWidget;
m_pXuanfuWidget = new CXuanfuWidget;
m_pGaoJiWidget = new CGaojiWidget;m_vecWidget.push_back(m_pBaseSetWidget);
m_vecWidget.push_back(m_pYunpanSetWidget);
m_vecWidget.push_back(m_pDownloadWidget);
m_vecWidget.push_back(m_pJieguanWidget);
m_vecWidget.push_back(m_pRenwuWidget);
m_vecWidget.push_back(m_pTixingWidget);
m_vecWidget.push_back(m_pXuanfuWidget);
m_vecWidget.push_back(m_pGaoJiWidget);pVLayout->addWidget(m_pBaseSetWidget);
pVLayout->addWidget(m_pYunpanSetWidget);
pVLayout->addWidget(m_pDownloadWidget);
pVLayout->addWidget(m_pJieguanWidget);
pVLayout->addWidget(m_pRenwuWidget);
pVLayout->addWidget(m_pTixingWidget);
pVLayout->addWidget(m_pXuanfuWidget);
pVLayout->addWidget(m_pGaoJiWidget);m_pScrollArea->setWidget(pWidget);

widget的继承应用

QWidget* pWidget = new QWidget;
QVBoxLayout* pVLayout = new QVBoxLayout(pWidget);
首先我们创建一个pwidget,将各个widget整合成这一个pwidget最后只需要将ScorllArea设置成这个整体pwidget即可。

1. QWidget* pWidget = new QWidget;

  • 这是一个普通的 QWidget,它作为容器,用来容纳其他控件。您可以将它看作是一个空的窗口或区域,可以添加其他控件和布局。

2. QVBoxLayout* pVLayout = new QVBoxLayout(pWidget);

  • 这是一个垂直布局管理器 (QVBoxLayout)。
  • pVLayout 是指向 QVBoxLayout 的指针,它将控件垂直堆叠在一起(从上到下)。
  • pWidget 被作为布局的父对象,所有控件都将在 pWidget 内按垂直顺序排列。

此时我们只需要填写pVLayout控件即可,pVLayout控件会自动添加到pWidget

ListWidget与ScorllArea信号联动

	connect(m_pListWidget, &QListWidget::itemClicked, this, &demo14_ScorllArea::slotItemClicked);connect(m_pScrollArea->verticalScrollBar(), &QScrollBar::valueChanged,this, &demo14_ScorllArea::slotValueChanged);

这段代码使用了 Qt 信号与槽机制,将控件的某些事件(比如 QListWidget 的 item 点击和 QScrollBar 的滚动条值变化)与特定的槽函数(处理程序)关联起来。

1. connect(m_pListWidget, &QListWidget::itemClicked, this, &demo14_ScorllArea::slotItemClicked);

  • m_pListWidget 是指向 QListWidget 的指针。
  • itemClickedQListWidget 的一个信号,表示列表中的某一项被点击时触发。
  • this 是当前对象(通常是一个类的实例,demo14_ScorllArea)。
  • slotItemClicked 是槽函数,当列表中的一项被点击时,它会被调用。该函数通常会处理与点击事件相关的逻辑。

2. connect(m_pScrollArea->verticalScrollBar(), &QScrollBar::valueChanged, this, &demo14_ScorllArea::slotValueChanged);

  • m_pScrollArea->verticalScrollBar() 获取 QScrollArea 中的垂直滚动条。
  • valueChanged 是滚动条的信号,当滚动条的值发生变化时触发。滚动条的值对应于当前滚动的进度。
  • slotValueChanged 是槽函数,当滚动条的值变化时调用,通常用来同步其他控件的状态或者执行滚动相关的操作。

总结:

  1. 当用户点击 QListWidget 中的某个项时,slotItemClicked 函数将会被调用。
  2. QScrollArea 的滚动条滚动时,slotValueChanged 函数将会响应这个变化并处理相关逻辑。

ListWidget与ScorllArea联动的槽函数编写

void demo14_ScorllArea::slotItemClicked(QListWidgetItem* item) {signFlag = true;QString itemText = item->text();QPoint widgetPos;int size = m_textList.size();for (int i = 0; i < size; i++) {if (itemText == m_textList[i]) {widgetPos = m_vecWidget[i]->pos();}}m_pScrollArea->verticalScrollBar()->setValue(widgetPos.y());
}void demo14_ScorllArea::slotValueChanged(int value) {if (!signFlag) {int itemSize = m_vecWidget.size();for (int i = 0; i < itemSize; i++) {if (!m_vecWidget[i]->visibleRegion().isEmpty()) {m_pListWidget->item(i)->setSelected(true);return;} else {m_pListWidget->item(i)->setSelected(false);}}}signFlag = false;
}

这段代码通过实现两个槽函数,完成了 QListWidgetQScrollArea 之间的联动。当用户点击 QListWidget 的项目时,滚动区域会自动滚动到对应的内容。当用户手动滚动时,列表中的项目会自动选中与当前可见内容相关的项目。

ListWidget中itemClicked信号会传递选中的item给槽函数

1. slotItemClicked(QListWidgetItem* item)

这个槽函数在用户点击 QListWidget 中的某个项目时被触发。

  • signFlag = true;:设置标记,用于防止滚动条值变化时引发的多余操作(防止递归触发 slotValueChanged)。
  • itemText = item->text();:获取被点击的 QListWidgetItem 的文本。
  • 遍历 m_textList,找到点击的项目对应的 m_vecWidget 中的控件,并获取该控件的位置(widgetPos)。
  • m_pScrollArea->verticalScrollBar()->setValue(widgetPos.y());:根据找到的控件的位置,将滚动条的值设置为该控件的垂直坐标,进而让 QScrollArea 滚动到该控件的位置。
示例:
void demo14_ScorllArea::slotItemClicked(QListWidgetItem* item) {signFlag = true;QString itemText = item->text();  // 获取被点击的项目文本QPoint widgetPos;// 遍历找到与 itemText 匹配的控件int size = m_textList.size();for (int i = 0; i < size; i++) {if (itemText == m_textList[i]) {widgetPos = m_vecWidget[i]->pos();  // 获取控件的位置}}// 设置滚动条的值,让 QScrollArea 滚动到控件位置m_pScrollArea->verticalScrollBar()->setValue(widgetPos.y());
}
2. slotValueChanged(int value)

这个槽函数在 QScrollArea 的垂直滚动条值发生变化时被触发。

  • 首先检查 signFlag,确保该变化不是由点击事件引发的滚动。
  • 遍历 m_vecWidget,检查哪些控件的可见区域非空(即可见),并选中与之对应的 QListWidgetItem
  • m_pListWidget->item(i)->setSelected(true);:选中对应的列表项。
  • signFlag = false;:重置 signFlag,允许下一次点击或滚动正常触发。
示例:
void demo14_ScorllArea::slotValueChanged(int value) {if (!signFlag) {int itemSize = m_vecWidget.size();for (int i = 0; i < itemSize; i++) {if (!m_vecWidget[i]->visibleRegion().isEmpty()) {  // 检查控件是否可见m_pListWidget->item(i)->setSelected(true);  // 选中对应的列表项return;} else {m_pListWidget->item(i)->setSelected(false);  // 取消其他项目的选中状态}}}signFlag = false;
}

关键点:

  1. signFlag 的作用

    • 通过 signFlag 来避免由于点击列表项导致的滚动和由于滚动引发的列表项选中产生的递归触发。
    • 当点击列表项时,signFlag 被设为 true,这确保 slotValueChanged 不会在滚动条值变化时立即处理。
  2. m_vecWidgetm_textList

    • m_vecWidget 是与 QListWidget 的项目相对应的 QWidget 对象的容器(通常是控件的指针数组)。
    • m_textList 是存储 QListWidget 项目文本的列表,确保能根据点击的项目找到对应的 QWidget

功能总结:

  • 当用户点击 QListWidget 的某个项目时,slotItemClicked 会让 QScrollArea 自动滚动到与该项目相关的内容。
  • 当用户手动滚动 QScrollArea 时,slotValueChanged 会自动更新 QListWidget 的选中项,保持列表与内容同步。

结尾

最后,感谢您阅读我的文章,希望这些内容能够对您有所启发和帮助。如果您有任何问题或想要分享您的观点,请随时在评论区留言。
同时,不要忘记订阅我的博客以获取更多有趣的内容。在未来的文章中,我将继续探讨这个话题的不同方面,为您呈现更多深度和见解。
谢谢您的支持,期待与您在下一篇文章中再次相遇!

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

为什么大多数的程序员的编程界面背景都是黑色的?

不光编程IDE软件界面是黑色&#xff0c;市场上很多软件也是黑色或灰色背景为主&#xff0c;比如PS、Pr、AutoCAD等。很多商业PPT、设计广告是黑色背景&#xff0c;这几年不少汽车品牌logo也改成单黑色。 看来黑色不光是程序员的偏爱&#xff0c;也是符合大多数人需求的颜色。 …

数字基带之相移键控PSK

1 相移键控定义 相移键控是指用载波的相移位变化来传递信号&#xff0c;不改变载波的幅度和频率&#xff0c;可用下面的公式表示。 是载波的幅度&#xff0c;是载波的角频率&#xff0c;是载波的瞬时相位&#xff0c;是载波的初始相位。如果需要调制的信号为1bit的二进制数&am…

链表(单向不带头非循环)

声明 链表题考的都是单向不带头非循环&#xff0c;所以在本专栏中只介绍这一种结构&#xff0c;实际中链表的结构非常多样&#xff0c;组合起来就有8种链表结构。 链表的实现 创建一个链表 注意&#xff1a;此处简单粗暴创建的链表只是为了初学者好上手。 public class MyS…

Spring(三)Spring事件+计划任务+条件注解+SpringAware

Application Event 事件 当一个Bean处理完一个任务之后&#xff0c;希望另一个Bean知道并做出相应的处理&#xff0c;这时需要让另外一个Bean监听当前Bean所发送的事件 自定义事件&#xff0c;集成ApplicationEvent自定义事件监听器&#xff0c;实现ApplicationListener使用容…

S-Clustr-Simple 飞机大战:骇入现实的建筑灯光游戏

项目地址:https://github.com/MartinxMax/S-Clustr/releases Video https://www.youtube.com/watch?vr3JIZY1olro 飞机大战 这是一个影子集群的游戏插件&#xff0c;可以将游戏画面映射到现实的设备&#xff0c;允许恶意控制来完成游戏。亦或者设备部署在某建筑物中,来控制…

电脑硬件-机械硬盘

简介 机械硬盘是电脑的主要存储媒介之一&#xff0c;通常用于存储一些文件资料或者学习视频笔记等比较大的内容。 结构 采用磁盘存储数据&#xff0c;使用温彻斯特的结构&#xff0c;特有四个特点&#xff1a; 1.磁头、盘片和运动机构安装在一个密封的腔体内。 2.盘片告诉旋…

AI大模型算法工程师经典面试题————为什么 Bert 的三个 Embedding 可以进行相加?

大模型算法工程师经典面试题————为什么 Bert 的三个 Embedding 可以进行相加&#xff1f; 为什么 Bert 的三个 Embedding 可以进行相加&#xff1f; Token Embedding、Segment Embedding、Position Embedding的意义我已经清楚了&#xff0c;但是这三个向量为什么可以相加…

数据中台系统产品原型RP原型Axure高保真交互原型 源文件分享

在数字化时代&#xff0c;数据已经成为企业最宝贵的资产之一。为了更好地管理和利用这些数据&#xff0c;这边为大家整理了一套数据中台Axure高保真原型。这套原型致力于为企业提供全方位的数据服务&#xff0c;助力企业实现数据驱动的创新发展。 下载及预览地址&#xff1a;h…

MATLAB智能优化算法-学习笔记(3)——大规模邻域搜索算法求解旅行商问题【过程+代码】

一、问题描述 旅行商问题(TSP, Traveling Salesman Problem)是组合优化中的经典问题之一。给定一组城市和每对城市之间的距离,要求找到一条最短的路径,使旅行商从某个城市出发,访问每个城市一次并最终回到出发点。TSP问题广泛应用于物流配送、工厂调度、芯片制造等领域。…

1、等保测评介绍

数据来源&#xff1a;等保测评基础知识学习(1.02.0)2024最新版_哔哩哔哩_bilibili 等级保护的定义&#xff1a; 对国家秘密信息、法人或其他组织及公民专有信息以及公开信息&#xff0c;按照其重要程度对信息系统实施分等级安全保护。这包括对使用的安全产品进行等级管理&…

基于协同过滤算法的商品推荐系统

系统展示 用户前台界面 管理员后台界面 商家后台界面 系统背景 随着互联网技术的飞速发展&#xff0c;用户每天面临的信息量呈爆炸式增长&#xff0c;如何有效地筛选出用户感兴趣的内容成为一大挑战。在此背景下&#xff0c;基于协同过滤算法的商品推荐系统应运而生。该系统通过…

AI Agent,将如何打破大模型的应用边界?

大语言模型的浪潮&#xff0c;推进了AlAgent落地 上个世纪50年代&#xff0c;阿兰图灵首次将"高度智能有机体"的概念提出。经过半个多世纪的发展&#xff0c;终于在2023年进入了一个新的高潮&#xff0c;并于今年进入了爆发阶段。 自2022年11月30日chatGPT发布以来…

linux下共享内存的3种使用方式

进程是资源封装的单位&#xff0c;内存就是进程所封装的资源的一种。一般情况下&#xff0c;进程间的内存是相互隔离的&#xff0c;也就是说一个进程不能访问另一个进程的内存。如果一个进程想要访问另一个进程的内存&#xff0c;那么必须要进过内核这个桥梁&#xff0c;这就是…

工业机器视觉中的常见需求

目录 学习目的 熟系 Halcon的原因 专业性强&#xff1a; 高性能&#xff1a; 丰富的功能库 学习 OpenCV 的原因 开源与免费&#xff1a; 灵活性与可扩展性&#xff1a; 广泛的应用&#xff1a; 学习资源丰富&#xff1a; 总结 学习背景 工业视觉检测中常见分类 一、定…

【我的 PWN 学习手札】tcache stash with fastbin double free —— tcache key 绕过

参考看雪课程&#xff1a;PWN 探索篇 前言 tcache key 的引入使得 tcache dup 利用出现了困难。除了简单利用 UAF 覆写 key 或者House Of Karui 之外&#xff0c;还可以利用 ptmalloc 中的其他机制进行绕过。 一、Tcache Stash with Fastbin Double Free 之前是 double free …

实景三维+耕地保护:构建耕地资源管理的全闭环新模式

在耕地资源日益珍贵的今天&#xff0c;如何高效、精准地实施耕地保护&#xff0c;成为了我国农业可持续发展与生态文明建设的关键课题。“实景三维耕地保护”的创新模式&#xff0c;能够为这一挑战提供突破性的解决方案&#xff0c;打造一个从前端监测到后端管理的全闭环耕地保…

【Delphi】Delphi 中的 LiveBindings 使用场景与概念

LiveBindings 是 Delphi 提供的一种数据绑定机制&#xff0c;用于将 UI 控件与数据源&#xff08;如数据库字段、对象属性等&#xff09;进行动态连接。LiveBindings 允许开发人员通过可视化的方式绑定数据&#xff0c;省去了大量的手动编写代码&#xff0c;使 UI 更新和数据同…

大数据实验2.Hadoop 集群搭建(单机/伪分布式/分布式)

实验二&#xff1a; Hadoop安装和使用 一、实验目的 实现hadoop的环境搭建和安装Hadoop的简单使用&#xff1b; 二、实验平台 操作系统&#xff1a;Linux&#xff08;建议Ubuntu16.04或者18.04&#xff09;&#xff1b;Hadoop版本&#xff1a;3.1.3&#xff1b;JDK版本&…

Linux命令:用于创建新的用户组的命令行工具groupadd 详解

目录 一、概述 二、组标识符GID 1、定义 &#xff08;1&#xff09;标识符 &#xff08;2&#xff09;与UID的关系 2、GID的作用 &#xff08;1&#xff09;用户组管理 &#xff08;2&#xff09;文件权限控制 &#xff08;3&#xff09;用户权限管理 &#xff08;4&…

爱心代码(简单免费可直接运行)

代码展示&#xff08;可私信了解更多&#xff09; #include<stdio.h > #include<stdlib.h > #include<windows.h> int main(int argc, char* argv[]) {float x, y, a;for (y 1.5; y > -1.5; y - 0.1) {for (x -1.5; x < 1.5; x 0.05){a x * x y…