网站开发微信公众号自定义菜单/关于进一步优化当前疫情防控措施
qt-C++笔记之在两个标签页中按行读取两个不同的文件并且滚动条自适应滚动范围高度
code review!
文章目录
- qt-C++笔记之在两个标签页中按行读取两个不同的文件并且滚动条自适应滚动范围高度
- 1.运行
- 2.文件结构
- 3.main.cc
- 4.main.pro
- 5.a.txt
- 6.b.txt
- 7.上述代码中QVBoxLayout,QScrollArea,QTabWidget,QWidget,QLayoutItem之间的关系
- 8.QLayoutItem *item = layout->itemAt(i);
- 9.QLayout和QLayoutItem的关系
1.运行
2.文件结构
3.main.cc
代码
#include <QApplication>
#include <QDebug>
#include <QFile>
#include <QPushButton>
#include <QScrollArea>
#include <QTabWidget>
#include <QTextStream>
#include <QVBoxLayout>
#include <QWidget>
#include <QScrollBar>
#include <QLabel>// 计算内容部件的总高度
int calculateContentHeight(QVBoxLayout *layout) {int height = 0;for (int i = 0; i < layout->count(); ++i) {QLayoutItem *item = layout->itemAt(i);if (item && item->widget()) {height += item->widget()->height();height += layout->spacing();}}return height;
}// 调整QScrollArea的滚动范围高度
void adjustScrollRangeHeight(QScrollArea *scrollArea, QWidget *contentWidget) {QVBoxLayout *layout = qobject_cast<QVBoxLayout *>(contentWidget->layout());if (layout) {int contentHeight = calculateContentHeight(layout);scrollArea->verticalScrollBar()->setRange(0, contentHeight);}
}int main(int argc, char *argv[]) {QApplication app(argc, argv);// 创建主窗口QWidget window;window.setWindowTitle("文件读取示例");// 创建 QTabWidgetQTabWidget tabWidget(&window);// 创建第一个标签页QWidget tab1Widget;QVBoxLayout *tab1Layout = new QVBoxLayout(&tab1Widget);QScrollArea scrollArea1;scrollArea1.setFixedHeight(300); // 设置高度为300像素QWidget scrollAreaContent1;QVBoxLayout *scrollAreaLayout1 = new QVBoxLayout(&scrollAreaContent1);tab1Layout->addWidget(&scrollArea1);tabWidget.addTab(&tab1Widget, "文本文件1");// 创建第二个标签页QWidget tab2Widget;QVBoxLayout *tab2Layout = new QVBoxLayout(&tab2Widget);QScrollArea scrollArea2;scrollArea2.setFixedHeight(300); // 设置高度为300像素QWidget scrollAreaContent2;QVBoxLayout *scrollAreaLayout2 = new QVBoxLayout(&scrollAreaContent2);tab2Layout->addWidget(&scrollArea2);tabWidget.addTab(&tab2Widget, "文本文件2");// 连接按钮1的点击事件QPushButton button1("读取文件1");QObject::connect(&button1, &QPushButton::clicked, [&]() {// 清空第一个标签页的内容QLayoutItem *item;while ((item = scrollAreaLayout1->takeAt(0)) != nullptr) {delete item->widget();delete item;}// 读取文件1内容并添加到第一个标签页的 QScrollAreaQFile file1("/home/user/qt_cpp_test/test_templete/a.txt");if (file1.open(QIODevice::ReadOnly | QIODevice::Text)) {QTextStream in(&file1);while (!in.atEnd()) {QString line = in.readLine();QLabel *label = new QLabel(line);scrollAreaLayout1->addWidget(label);}file1.close();// 调整滚动范围高度adjustScrollRangeHeight(&scrollArea1, &scrollAreaContent1);} else {qDebug() << "Error opening file 1: " << file1.errorString();}// 将滚动区域的内容部件设置为滚动区域的子部件scrollAreaContent1.setLayout(scrollAreaLayout1);scrollArea1.setWidget(&scrollAreaContent1);});// 连接按钮2的点击事件QPushButton button2("读取文件2");QObject::connect(&button2, &QPushButton::clicked, [&]() {// 清空第二个标签页的内容QLayoutItem *item;while ((item = scrollAreaLayout2->takeAt(0)) != nullptr) {delete item->widget();delete item;}// 读取文件2内容并添加到第二个标签页的 QScrollAreaQFile file2("/home/user/qt_cpp_test/test_templete/b.txt");if (file2.open(QIODevice::ReadOnly | QIODevice::Text)) {QTextStream in(&file2);while (!in.atEnd()) {QString line = in.readLine();QLabel *label = new QLabel(line);scrollAreaLayout2->addWidget(label);}file2.close();// 调整滚动范围高度adjustScrollRangeHeight(&scrollArea2, &scrollAreaContent2);} else {qDebug() << "Error opening file 2: " << file2.errorString();}// 将滚动区域的内容部件设置为滚动区域的子部件scrollAreaContent2.setLayout(scrollAreaLayout2);scrollArea2.setWidget(&scrollAreaContent2);});// 将按钮添加到主窗口QVBoxLayout *mainLayout = new QVBoxLayout(&window);mainLayout->addWidget(&button1);mainLayout->addWidget(&button2);mainLayout->addWidget(&tabWidget);window.show();return app.exec();
}
4.main.pro
代码
QT += widgetsTARGET = FileContentReader
TEMPLATE = appSOURCES += main.cppHEADERS +=FORMS +=DISTFILES += \
5.a.txt
代码
555555555555555555555555555
22222222222222222222
99999999999999999999
22
adrewerr
222222222222222222223
ewofjedoiw
3ferfhjnerwifje
fejlieflewiehu3
sjdfuewhjrouiehur
fuewlaifijdqwipjd
djiwpadjwiaodj
juewidjheupiwrfjdeo
wjuiqdijewioedh
jewuipqdjfql
6.b.txt
代码
jgfyfeyjfgegg
ekeo2jwojriw
efjkfehf99999
7.上述代码中QVBoxLayout,QScrollArea,QTabWidget,QWidget,QLayoutItem之间的关系
在上述代码中,QVBoxLayout
、QScrollArea
、QTabWidget
、QWidget
和QLayoutItem
之间的关系如下:
QVBoxLayout
是用于垂直布局的布局管理器,它可用于将多个小部件垂直排列在一起。QScrollArea
是一个可滚动的视图区域,它提供了一种方式来显示包含大量内容的小部件。它可以包含一个单独的小部件作为其内容,该部件可以是任何派生自QWidget
的类。QTabWidget
是一个选项卡式容器,它可以包含多个标签页。每个标签页显示为一个选项卡,点击选项卡可以切换显示不同的内容。QWidget
是Qt中所有用户界面元素的基类,它是一个可视化的窗口或部件。它可以作为QScrollArea
的内容部件,用于显示滚动区域中的内容。QLayoutItem
是布局管理器中的项,它代表一个小部件或布局。它用于在布局中管理小部件的位置和大小。
在给定的代码中,QVBoxLayout
用于管理每个标签页的布局,QScrollArea
作为每个标签页的滚动区域,QWidget
是QScrollArea
的内容部件,QLayoutItem
用于管理滚动区域中的小部件的位置和大小。
整体关系如下:
QTabWidget
├── QWidget (tab1Widget)
│ └── QVBoxLayout (tab1Layout)
│ └── QScrollArea (scrollArea1)
│ └── QWidget (scrollAreaContent1)
│ └── QVBoxLayout (scrollAreaLayout1)
│ └── QLabel (label1)
│ └── QLabel (label2)
│ ...
├── QWidget (tab2Widget)
│ └── QVBoxLayout (tab2Layout)
│ └── QScrollArea (scrollArea2)
│ └── QWidget (scrollAreaContent2)
│ └── QVBoxLayout (scrollAreaLayout2)
│ └── QLabel (label1)
│ └── QLabel (label2)
│ ...
...
每个标签页中包含一个QWidget
,每个QWidget
中使用QVBoxLayout
进行布局管理,其中包含一个QScrollArea
作为滚动区域,滚动区域的内容部件是一个QWidget
,该部件中使用QVBoxLayout
进行内容布局,其中包含多个QLabel
作为文本标签。
这段程序使用了Qt框架来创建一个带有两个标签页的QTabWidget,每个标签页中都有一个QScrollArea,用于显示文本文件内容。下面是程序中各个部件之间的关系:
- QTabWidget是主窗口的子部件。
- 每个标签页(QWidget)是QTabWidget的子部件。
- 每个标签页内部有一个垂直布局(QVBoxLayout),用于放置QScrollArea。
- 每个QScrollArea设置了固定的高度,并且有一个内容部件(QWidget)作为其子部件。
- 每个内容部件内部有一个垂直布局(QVBoxLayout),用于放置QLabel。
- 每个QLabel用于显示文本文件的一行内容。
此外,还定义了一些辅助函数用于计算内容部件的总高度和调整滚动范围的高度。按钮1和按钮2的点击事件会清空相应标签页的内容,然后读取文本文件的内容并添加到对应的QScrollArea中,最后调整滚动范围的高度。
总结起来,程序的结构如下:
- 主窗口(QWidget)
- QTabWidget
- 标签页1(QWidget)
- 垂直布局1(QVBoxLayout)
- QScrollArea1
- 内容部件1(QWidget)
- 垂直布局1(QVBoxLayout)
- QLabel1
- QLabel2
…
- 垂直布局1(QVBoxLayout)
- 内容部件1(QWidget)
- QScrollArea1
- 垂直布局1(QVBoxLayout)
- 标签页2(QWidget)
- 垂直布局2(QVBoxLayout)
- QScrollArea2
- 内容部件2(QWidget)
- 垂直布局2(QVBoxLayout)
- QLabel1
- QLabel2
…
- 垂直布局2(QVBoxLayout)
- 内容部件2(QWidget)
- QScrollArea2
- 垂直布局2(QVBoxLayout)
- 标签页1(QWidget)
- 按钮1(QPushButton)
- 按钮2(QPushButton)
- QTabWidget
8.QLayoutItem *item = layout->itemAt(i);
这行代码的语法如下:
-
QLayoutItem *item
:这是一个变量声明语句,用于定义一个指向QLayoutItem
对象的指针变量,名称为item
。QLayoutItem
是Qt框架中用于布局管理的基类,它可以表示布局中的各种元素,例如部件、空白间隔等。 -
layout->itemAt(i)
:这是一个函数调用表达式,用于获取给定索引位置i
处的布局项。layout
是一个指向QVBoxLayout
对象的指针,表示要获取布局项的垂直布局。itemAt(i)
是QVBoxLayout
类的成员函数,返回一个指向QLayoutItem
对象的指针,该对象表示布局中的一个元素。
整体来看,这行代码的作用是在给定的垂直布局layout
中获取索引为i
的布局项,并将其保存到名为item
的指针变量中。通过这个指针变量,可以进一步访问和操作该布局项的相关属性和方法。
需要注意的是,此处的代码假设了layout
指针和i
的合法性,即layout
指针不为空且有效,i
是一个有效的索引值。否则,在使用item
指针之前应该进行有效性检查,以确保代码的健壮性。
QLayoutItem
是QVBoxLayout
的基类,而QVBoxLayout
是QLayoutItem
的派生类。这意味着QVBoxLayout
继承了QLayoutItem
的属性和方法,并且可以被当作QLayoutItem
的一种特殊类型来使用。
在Qt中,布局管理器(例如QVBoxLayout
)用于管理部件的位置和大小。布局管理器负责决定部件如何在容器中进行布局,并提供一些方法来访问和操作布局中的元素。
QVBoxLayout
类中的itemAt(i)
方法是一个成员函数,用于获取指定索引位置i
处的布局项。该方法是从QLayout
类继承而来的,QVBoxLayout
是QLayout
的派生类。返回的指针类型是QLayoutItem*
,表示一个布局项,它可以表示布局中的各种元素,如部件、空白间隔等。
通过itemAt(i)
方法,可以在垂直布局中按索引获取布局项,并进行进一步的操作,例如获取布局项的部件并进行处理。
所以,itemAt(i)
是QVBoxLayout
类的成员函数,返回一个指向QLayoutItem
对象的指针,该对象表示布局中的一个元素。
9.QLayout和QLayoutItem的关系
在Qt中,QLayout
和QLayoutItem
是两个相关的类,用于布局管理器。
-
QLayout
是一个抽象基类,用于定义布局管理器的接口。它提供了一些方法和属性,用于管理和控制布局中的部件和其他元素的位置和大小。QLayout
类本身不能直接使用,而是通过其派生类来实现特定类型的布局管理器,例如QVBoxLayout
、QHBoxLayout
等。 -
QLayoutItem
是QLayout
的子类,表示布局中的一个元素。它可以表示各种类型的元素,包括部件、空白间距、布局等。QLayoutItem
提供了一些方法和属性,用于访问和操作布局元素的信息,例如大小、位置等。
简而言之,QLayout
是布局管理器的接口,定义了布局管理器的基本行为和功能,而QLayoutItem
是布局中单个元素的表示,用于描述和操作布局中的每个部件或其他元素。
通常情况下,使用QLayout
的派生类(例如QVBoxLayout
、QHBoxLayout
)来创建和管理布局,这些派生类继承了QLayout
的接口,并提供了具体的布局算法和方法。而在布局中的每个元素都被表示为QLayoutItem
的实例。
相关文章:

qt-C++笔记之在两个标签页中按行读取两个不同的文件并且滚动条自适应滚动范围高度
qt-C笔记之在两个标签页中按行读取两个不同的文件并且滚动条自适应滚动范围高度 code review! 文章目录 qt-C笔记之在两个标签页中按行读取两个不同的文件并且滚动条自适应滚动范围高度1.运行2.文件结构3.main.cc4.main.pro5.a.txt6.b.txt7.上述代码中QVBoxLayout,…...

github搜索技巧探索
毕设涉及到推荐系统,那么就用搜索推荐系统相关资料来探索一下GitHub的搜搜技巧 文章目录 1. 基础搜索2. 限定在特定仓库搜索3. 按照语言搜索4. 按照star数量搜索5. 搜索特定用户/组织的仓库6. 查找特定文件或路径7. 按时间搜索8. 搜索不包含某个词的仓库9. 搜索特定…...

[ACTF2020 新生赛]Include
【解题思路】 1.打开链接 发现好东西,进一步分析。 2.分析页面 发现网页得到一个GET请求-->?fileflag.php 可以推断,要解答该题目需要获取 flag.php 的源代码. 将flag.php文件进行base64编码(将网页源代码转换为Base64编码ÿ…...

Go 实现插入排序算法及优化
插入排序 插入排序是一种简单的排序算法,以数组为例,我们可以把数组看成是多个数组组成。插入排序的基本思想是往前面已排好序的数组中插入一个元素,组成一个新的数组,此数组依然有序。光看文字可能不理解,让我们看看…...

LuatOS-SOC接口文档(air780E)--max30102 - 心率模块
max30102.init(i2c_id,int)# 初始化MAX30102传感器 参数 传入值类型 解释 int 传感器所在的i2c总线id,默认为0 int int引脚 返回值 返回值类型 解释 bool 成功返回true, 否则返回nil或者false 例子 if max30102.init(0,pin.PC05) thenlog.info("max30102&q…...

设计模式(2)-创建型模式
1,创建型模式 4.1 单例设计模式 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式涉及到一个单一的类,该类负责创建自己…...

elasticsearch一些重要的配置参数
先看一下官网给我们提供的全部的参数配置项 官网地址 官方文档链接:注意版本是8.1Configuring Elasticsearch | Elasticsearch Guide [8.1] | Elastic编辑https://www.elastic.co/guide/en/elasticsearch/reference/current/settings.html 重要(基本…...

raft和zab算法的区别
首先,二者都是通过选举一个 Leader 来简化复杂度,后续的工作都是由 Leader 来做。 投票的时候,二者都需要定义一个轮次 Raft 定义了 term 来表示选举轮次 ZooKeeper 定义了 electionEpoch 来表示 同步数据的时候,都希望选举出来…...

Arthas生成火焰图命令报错汇总
操作步骤 1、在容器中集成了arthas诊断和调试工具,想生产火焰图,执行profiler start,报错 如下: [arthas1]$ profiler start AsyncProfiler error: Can not find libasyncProfiler so, please check the arthas directory. 2、…...

【PyQt学习篇 · ⑤】:QWidget - 鼠标操作
文章目录 鼠标形状设置常用鼠标形状设置自定义鼠标形状 重置形状获取鼠标鼠标跟踪鼠标跟踪案例 鼠标形状设置 常用鼠标形状设置 在PyQt中,QWidget类提供了设置鼠标形状的功能。可以使用setCursor()方法来更改QWidget及其子类的鼠标形状。该方法接受一个Qt.CursorS…...

2-多媒体数据压缩国际标准-Part3
文章目录 视频压缩的国际标准MPEG-1&MPEG-2/H.262视频标准MPEG-4 AVC/H.264视频标准H.264编码框架概述H.264视频编码的技术创新点 H.265/HEVC视频标准HEVC性能与编解码框架概述Quadtree-based coding structureDeblocking & SAO FilterHEVC各模块运算量 视频压缩的国际…...

使用Go模块进行依赖管理
摘要:本文将介绍Go语言中的模块(module)概念,以及如何使用Go模块进行依赖管理。我们会探讨模块的基本概念、使用方法、配置和依赖关系管理等方面的内容。 一、引言 Go语言自2007年发布以来,一直以其简洁、高效和强大…...

人工智能与航天技术的融合:未来发展的新趋势
人工智能与航天技术的融合:未来发展的新趋势 随着科技的飞速发展,人工智能和航天技术已经成为人类探索未知世界的重要工具。本文将探讨这两个领域的结合点,以及未来的发展趋势和应用前景。通过了解这些技术,读者将更好地理解人工…...

私有云:【11】win10安装Agent客户端组件
私有云:【11】win10安装Agent客户端组件 1、配置IP及加入域2、安装Agent客户端组件3、生成win10快照 1、配置IP及加入域 配置ip及dns 修改计算机名且加入域 进行验证 加入成功 将cloudadmin用户加入管理员组 输入cloudadmin户名密码验证 2、安装Agent客户端组件 …...

什么是程序化交易
大到量化、程序化、高频交易、套利交易、主观投资这些基本的概念,小到网格交易、条件单、T0、ETF套利、期现套利、算法拆单交易、打板策略等具体的投资方式。如果没有接触过这些,很容易混淆。 程序化交易: 指通过既定程序或特定软件…...

企业如何安全跨国传输30T文件数据
对于一些对数据敏感性比较高的企业,如IT企业和国企等,跨国数据传输是当今企业面临的一个重要挑战,尤其是当数据量达到30T这样的规模时,如何保证数据的速度、安全和合规性,就成为了企业必须考虑的问题。本文将从以下几个…...

【Linux】centos安装配置及远程连接工具的使用
🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的专栏《微信小程序开发实战》。🎯Ἲ…...

算法|每日一题|掷骰子等于目标和的方法数|动态规划
1155.掷骰子等于目标和的方法数 原题地址: 力扣每日一题:掷骰子等于目标和的方法数 这里有 n 个一样的骰子,每个骰子上都有 k 个面,分别标号为 1 到 k 。 给定三个整数 n , k 和 target ,返回可能的方式(从总共 kn 种…...

Java架构师软件工程全流程
目录 1 导学2 软件工程概述(原)3 能力成熟度模型4 软件过程模型5 逆向工程6 需求工程6.1 软件需求6.2 需求获取6.3 需求分析6.4 需求定义6.5 需求验证6.6 需求管理7 处理流程设计8 系统设计6.1 人机界面设计7 测试基础知识7.1 测试原则和方法7.2 测试阶段7.3 测试用例的设计7.4…...

深度学习中Transformer的简单理解
Transformer 网络结构 Transformer也是由编码器和解码器组成的。 每一层Encoder编码器都由很多层构成的,编码器内又是self-attention和前馈网络构成的。Self-attention是用来做加权平均,前馈网络用来组合。 但是decoder有点不同,多了一层En…...

Java架构师系统安全
目录 1 导学2 信息安全基础知识3 信息安全系统的组成框架4 信息安全技术4.1 加密技术4.2 对称加密技术4.3 非对称加密技术4.4 信息摘要4.5数字签名5 信息安全的抗攻击技术5.1 ARP欺骗的原理5.2 ARP欺骗的防范措施5.3 IP欺骗的原理和流程6 信息安全的保证体系和评估方法7 网络安…...

Stable Diffusion 图生图+ControlNet list index out of range
在webui1.5中用图生图ControlNet批量处理图片的时候报错: controlnet indexError: list index out of range 解决方法: 在controlNet的设置页中勾选不输出检测图即可。 参考:https://github.com/AUTOMATIC1111/stable-diffusion-webui/issu…...

SylixOS BSP开发(七)
实现系统调试信息打印接口 当系统出错时或者使用内核日志时会输出一些打印信息,这最终都是调用到bspLib.c中的bspDebugMsg 这个接口来实现的,所以我们在开发BSP时,第一个要做的工作就是实现这个接口。 一般的调试信息都是通过串口来输出的&am…...

多媒体应用设计师 第15章 多媒体素材的制作和集成
口诀 思维导图 2020...

CentOS和Ubuntu命令行方式配置静态IP
CentOS和Ubuntu都是通过修改相关配置文件来配置静态IP,但是他们的配置文件有所不同 CentOS CentOS需要修改的配置文件:/etc/sysconfig/network-scripts/ifcfg-需要修改的网卡名字 [rootbloke ~]# cd /etc/sysconfig/network-scripts/ [rootbloke netw…...

服务器快速申请免费SSL证书_2023年10月29日可用
目的 在服务器端通过命令快速申请免费域名的SSL证书.--2023年10月29日可用环境 Centos拥有域名 假设该域名为:demo.com Ubuntu 同样适用 步骤 下载组件 前期准备 CentOS服务器 yum update yum install socatUbuntu服务器 apt update apt install socat下载acme…...

ChatGPT专业术语及有效使用方法概述
. 目录 一、摘要 二、ChatGPT基本介绍 三、ChatGPT技术原理 四、ChatGPT数据训练 五、ChatGPT微调方法 六、ChatGPT应用案例 七、有效使用ChatGPT的方法 八、结论 一、摘要 本文将详细介绍ChatGPT的专业术语及有效使用方法,包括对ChatGPT的基本介绍、技术原…...

ffmpeg 视频转图片 图片集转视频
可以使用FFmpeg将视频转换为图片序列,然后将图片序列合成为视频。 以下是一些基本的FFmpeg命令示例来执行这些操作: 1. 将视频转化为图片序列: ffmpeg -i input_video.mp4 -vf "fps30" output_images/image%04d.png 这个命令将…...

Zabbix安装与部署
前言 Zabbix是一个开源的网络监控和系统监控解决方案,用于监控服务器、网络设备、应用程序和服务。它基于客户端-服务器体系结构,使用多种监控选项来监控不同类型的设备和应用程序。Zabbix支持数据收集、处理和存储,以及报警和可视化等功能。…...

kafka代码示例
安装kafka: Windows安装kafka, 详情见:https://blog.csdn.net/sinat_32502451/article/details/133067851 Linux 安装kafka,详情见:https://blog.csdn.net/sinat_32502451/article/details/133080353 添加依赖包: &…...