qt-C++笔记之在两个标签页中按行读取两个不同的文件并且滚动条自适应滚动范围高度

news2024/11/25 6:45:12

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("文件读取示例");

    // 创建 QTabWidget
    QTabWidget 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内容并添加到第一个标签页的 QScrollArea
        QFile 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内容并添加到第二个标签页的 QScrollArea
        QFile 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 += widgets

TARGET = FileContentReader
TEMPLATE = app

SOURCES += main.cpp

HEADERS +=

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之间的关系

在上述代码中,QVBoxLayoutQScrollAreaQTabWidgetQWidgetQLayoutItem之间的关系如下:

  1. QVBoxLayout是用于垂直布局的布局管理器,它可用于将多个小部件垂直排列在一起。
  2. QScrollArea是一个可滚动的视图区域,它提供了一种方式来显示包含大量内容的小部件。它可以包含一个单独的小部件作为其内容,该部件可以是任何派生自QWidget的类。
  3. QTabWidget是一个选项卡式容器,它可以包含多个标签页。每个标签页显示为一个选项卡,点击选项卡可以切换显示不同的内容。
  4. QWidget是Qt中所有用户界面元素的基类,它是一个可视化的窗口或部件。它可以作为QScrollArea的内容部件,用于显示滚动区域中的内容。
  5. QLayoutItem是布局管理器中的项,它代表一个小部件或布局。它用于在布局中管理小部件的位置和大小。

在给定的代码中,QVBoxLayout用于管理每个标签页的布局,QScrollArea作为每个标签页的滚动区域,QWidgetQScrollArea的内容部件,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
      • 标签页2(QWidget)
        • 垂直布局2(QVBoxLayout)
          • QScrollArea2
            • 内容部件2(QWidget)
              • 垂直布局2(QVBoxLayout)
                • QLabel1
                • QLabel2
    • 按钮1(QPushButton)
    • 按钮2(QPushButton)

8.QLayoutItem *item = layout->itemAt(i);

这行代码的语法如下:

  • QLayoutItem *item:这是一个变量声明语句,用于定义一个指向QLayoutItem对象的指针变量,名称为itemQLayoutItem是Qt框架中用于布局管理的基类,它可以表示布局中的各种元素,例如部件、空白间隔等。

  • layout->itemAt(i):这是一个函数调用表达式,用于获取给定索引位置i处的布局项。layout是一个指向QVBoxLayout对象的指针,表示要获取布局项的垂直布局。itemAt(i)QVBoxLayout类的成员函数,返回一个指向QLayoutItem对象的指针,该对象表示布局中的一个元素。

整体来看,这行代码的作用是在给定的垂直布局layout中获取索引为i的布局项,并将其保存到名为item的指针变量中。通过这个指针变量,可以进一步访问和操作该布局项的相关属性和方法。

需要注意的是,此处的代码假设了layout指针和i的合法性,即layout指针不为空且有效,i是一个有效的索引值。否则,在使用item指针之前应该进行有效性检查,以确保代码的健壮性。

QLayoutItemQVBoxLayout的基类,而QVBoxLayoutQLayoutItem的派生类。这意味着QVBoxLayout继承了QLayoutItem的属性和方法,并且可以被当作QLayoutItem的一种特殊类型来使用。

在Qt中,布局管理器(例如QVBoxLayout)用于管理部件的位置和大小。布局管理器负责决定部件如何在容器中进行布局,并提供一些方法来访问和操作布局中的元素。

QVBoxLayout类中的itemAt(i)方法是一个成员函数,用于获取指定索引位置i处的布局项。该方法是从QLayout类继承而来的,QVBoxLayoutQLayout的派生类。返回的指针类型是QLayoutItem*,表示一个布局项,它可以表示布局中的各种元素,如部件、空白间隔等。

通过itemAt(i)方法,可以在垂直布局中按索引获取布局项,并进行进一步的操作,例如获取布局项的部件并进行处理。

所以,itemAt(i)QVBoxLayout类的成员函数,返回一个指向QLayoutItem对象的指针,该对象表示布局中的一个元素。

9.QLayout和QLayoutItem的关系

在Qt中,QLayoutQLayoutItem是两个相关的类,用于布局管理器。

  • QLayout是一个抽象基类,用于定义布局管理器的接口。它提供了一些方法和属性,用于管理和控制布局中的部件和其他元素的位置和大小。QLayout类本身不能直接使用,而是通过其派生类来实现特定类型的布局管理器,例如QVBoxLayoutQHBoxLayout等。

  • QLayoutItemQLayout的子类,表示布局中的一个元素。它可以表示各种类型的元素,包括部件、空白间距、布局等。QLayoutItem提供了一些方法和属性,用于访问和操作布局元素的信息,例如大小、位置等。

简而言之,QLayout是布局管理器的接口,定义了布局管理器的基本行为和功能,而QLayoutItem是布局中单个元素的表示,用于描述和操作布局中的每个部件或其他元素。

通常情况下,使用QLayout的派生类(例如QVBoxLayoutQHBoxLayout)来创建和管理布局,这些派生类继承了QLayout的接口,并提供了具体的布局算法和方法。而在布局中的每个元素都被表示为QLayoutItem的实例。

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

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

相关文章

EasyRecovery2024免费激活码

EasyRecovery这款软件可以恢复被删除的数据&#xff0c;那我就简单为大家介绍一下这款数据恢复软件EasyRecovery吧&#xff01; EasyRecovery是一款操作简单、功能强大数据恢复软件&#xff0c;通过EasyRecovery可以从硬盘、光盘、U盘、数码相机、手机等各种设备中恢复被删除或…

Leetcode刷题详解——下降路径最小和

1. 题目链接&#xff1a;931. 下降路径最小和 2. 题目描述&#xff1a; 给你一个 n x n 的 方形 整数数组 matrix &#xff0c;请你找出并返回通过 matrix 的下降路径 的 最小和 。 下降路径 可以从第一行中的任何元素开始&#xff0c;并从每一行中选择一个元素。在下一行选择…

vue源码分析(七)—— createComponent

文章目录 前言一、createComponent 参数说明二、createComponent 源码详解1.baseCtor的实际指向2.extend 方法3.判断Ctor是否是函数的判断4.installComponentHooks方法5.返回一个带标识的组件 vnode 前言 createComponent文件的路径&#xff1a; src\core\vdom\create-componen…

C++之C++11引入enum class与传统enum关键字总结(二百五十一)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

ubuntu配置 Conda 更改默认环境路径

我的需求是以后凡是新建一个虚拟环境都需要安装在一个挂载了大容量的分区/data里面 /home里面的是即将爆满但是还能塞点东西的硬盘. 如果您想要永久更改 Conda 的默认环境路径&#xff0c;可以编辑 Conda 的配置文件。首先&#xff0c;找到 Conda 的配置文件通常是 .condarc 文…

WAF绕过-权限控制之代码混淆造轮子48

我们拿到权限要做&#xff0c;读文件&#xff0c;写文件&#xff0c;命令执行等等&#xff0c;这些功能如果部署于对方waf环境的话&#xff0c;也会被拦截。 一个文件下载到本地之后&#xff0c;杀毒网站会对这个文件进行检测&#xff0c;有没有病毒或者木马&#xff0c;这个杀…

rhcsa目录练习

要求 在根下创建一个叫做test的目录&#xff0c;在test的目录下创建三个普通文件file1 file2 file3&#xff0c;给file1创建一个软链接aa&#xff0c;给file2创建两个硬链接&#xff0c;在test目录下创建一个ceshi的目录&#xff0c;在ceshi的目录下创建a1-a8,b1-b8,ac1-ad8的…

车载音频项目

加我微信hezkz17进数字音频系统研究开发交流答疑群(课题组) ー 1&#xff0e;负责此项目的音频链路的设计及其实现 在ADSP21375上实现音频链路的处理。如噪声门&#xff0c;压限器&#xff0c;高低通&#xff0c;PEQ、各种效果等。 2&#xff0e;负责DSP与MCU端SPI协议实现。M…

评价模型:CRITIC客观赋权法

目录 1.算法原理介绍2.算法步骤2.1 数据标准化2.2 计算信息承载量2.3 计算权重和得分 3.案例分析 1.算法原理介绍 CRITIC方法是一种客观权重赋权法&#xff0c;其基本思路是确定指标的客观权数以两个基本概念为基础。一是对比强度&#xff0c;它表示同一指标各个评价方案取值差…

RealVNC Enterprise 7.7.0 Crack

RealVNC连接_旗舰产品 RealVNC Connect 是为需要强大安全性、弹性和安心的组织提供的远程访问解决方案。 设备访问 按需协助 随时随地安全访问和管理任何设备 通过安全的远程访问让您的组织保持联系&#xff0c;帮助您提高生产力并促进更广泛的协作。 随时随地安全远程访问和…

【操作系统】进程的控制和通信

文章目录 一. 实验目的二. 实验内容三. 实验步骤四. 实验结果 一. 实验目的 &#xff08;1&#xff09;加深对进程概念的理解&#xff0c;进一步认识并发执行的实质。 &#xff08;2&#xff09;掌握Linux 操作系统中进程的创建和终止操作。 &#xff08;3&#xff09;理解进程…

公众号留言功能有必要开吗?如何开通留言?

为什么公众号没有留言功能&#xff1f;2018年2月12日&#xff0c;TX新规出台&#xff1a;根据相关规定和平台规则要求&#xff0c;我们暂时调整留言功能开放规则&#xff0c;后续新注册帐号无留言功能。这就意味着2018年2月12日号之后注册的公众号不论个人主体还是组织主体&…

【Java】HashMap集合

Map集合概述和使用 Map集合概述 Interface Map<k,v> k&#xff1a;键值类型 v&#xff1a;值的类型 Map集合的特点 键值对 映射关系 Key 和 Value一个键&#xff08;Key&#xff09;对应一个值&#xff08;Value&#xff09;键不允许重复&#xff0c;值可以重复如…

DXF文件写入多边形和名称属性,可在Global Mapper和ArcGIS打开

DXF文件写入多边形和名称属性&#xff0c;可在Global Mapper和ArcGIS打开 目标效果 为了实现下图的效果&#xff0c;学习了一下dxf格式的相关内容。 官方文档价值很高&#xff0c;但是结合实例.dxf文件看学习起来更快。 免费下载实例 下面将介绍dxf文件的格式规范&#xff0…

如何确保PCIe Gen3通道的信号质量

PCIe 3.0设计面对的挑战 PCIe由PCI-SIG协会研发和维护的一个高速标准接口&#xff0c;PCIe3.0是其开发的第三代接口高速差分接口&#xff0c;其单个差分对信号速率可到达8.0Gbps&#xff0c;目前其以广泛的应用于计算机服务器等设备领域。 下图显示的是一个典型的PCIe Gen3的…

高阶数据结构图下篇

目录&#xff1a; 图的基本概念二深度优先遍历&#xff08;DFS&#xff09;广度优先遍历&#xff08;BFS&#xff09; kruskal&#xff08;克鲁斯卡尔算法&#xff09;Prim&#xff08;普里姆算法&#xff09;Dijkstra(迪杰斯特拉算法)Bellman-ford(贝尔曼-福特算法) flyod-war…

为什么别人的vscode终端那么好看!!?

群友的terminal &#x1f431;: 在群里看到别人的vscode好好看&#xff0c;给我的也安排一下 &#x1f7e0;关键因素&#xff1a;oh my posh主题&#xff01;安装&#xff01; &#x1f431;: 但是装完打开powershell变慢了&#xff0c;大道至简&#xff01; 背景 系统&#x…

RSA ——Rational Structure Architecture r入门教程

&#xff08;一&#xff09;UML概述 UML&#xff0c;即统一建模语言&#xff08;Unified Modeling Language&#xff09;&#xff0c;是一种通用的面向对象的可视化建模语言。其核心目的是为软件的面向对象描述和建模提供一种标准化的方法。UML并不是一种编程语言&#xff0c;因…

【LLM】sft和pretrain数据处理和筛选方法

note 痛点&#xff1a;训练垂直领域模型&#xff0c;sft数据和增量pretrain数据质量把控很重要 当数据不够时&#xff0c;通过self-instruct等方法造多样化的数据当数据很多时&#xff0c;需要清洗/筛选出高质量数据 文章目录 note一、sft数据的筛选策略1.1 使用self-instruc…

华媒舍:日韩媒体发稿推广中8个关键因素帮助你实现突破

在当今经济全球化的时代背景下&#xff0c;日韩地域媒体影响力日益提高。对于需要在这一地区开展发稿推广的人来讲&#xff0c;掌握适度的思路和流程是十分重要的。下面我们就为大家介绍8个关键因素&#xff0c;以帮助你在日韩地域媒体发稿推广中实现突破。 1.科学研究行业在逐…