当前位置: 首页 > news >正文

【QT】 控件 -- 显示类

🔥 目录

    • @[TOC]( 🔥 目录)
    • 1. 前言
    • 2. 显示类控件
      • 2.1 Label
        • 1、显示不同文本
        • 2、显示图片
        • 3、文本对齐、自动换行、缩进、边距
        • 4、设置伙伴
      • 3.2 LCD Number
      • 3.3 ProgressBar
      • 3.4 Calendar Widget
    • 3. 共勉 🔥


1. 前言

之前我在上一篇文章【QT】-- 按钮类已经说了QT 控件按钮类方面的知识以及涉及到的各种属性/函数/使用方法,现在就来开始了解显示类的相关知识啦

2. 显示类控件

2.1 Label

QLabel 可以用来显示文本和图片,核心属性如下:

属性说明
textQLabel 中的文本。用于显示在标签上的文字内容。
textFormat文本的格式:
- Qt::PlainText:纯文本
- Qt::RichText:富文本(支持 HTML 标签)
- Qt::MarkdownText:Markdown 格式
- Qt::AutoText:根据文本内容自动决定文本格式。
pixmapQLabel 内部包含的图片。用于显示静态图像
scaledContents设置为 true 表示内容自动拉伸填充 QLabel;设为 false 则不会自动拉伸。
alignment对齐方式。可以设置水平和垂直方向如何对齐,例如居中、左对齐等。
wordWrap设置为 true 内部的文本会自动换行;设为 false 则内部文本不会自动换行。
indent设置文本缩进。影响水平和垂直方向的缩进。具体生效的方向取决于 alignment 属性。
margin内部文本和边框之间的边距。不同于 indentmargin 在上下左右四个方向都同时有效。
openExternalLinks是否允许打开一个外部链接。当 QLabel 文本内容包含 URL 时,点击链接将尝试打开浏览器访问该 URL。
buddyQLabel 关联一个“伙伴”,点击 QLabel 时能激活对应的伙伴控件。例如,如果伙伴是一个 QCheckBox,那么该 QCheckBox 将被选中。
1、显示不同文本

(1)在界面上创建四个 QLabel,尺存放大一些,objectName 分别为 label、label_2、label_3、label_4

image-20250116183518665

(2)修改 widget.cpp,设置四个 label 的属性 ⭕

image-20250116183707404

2、显示图片

虽然 QPushButton 也可以通过设置图标的方式设置图片,但是并非是一个好的选择,更多的时候还是希望通过 QLabel 来作为一个更单纯的显示图片的方式。

(1)在界面上创建一个 QLabel,objectName 为 label

image-20250116193035454

(2)创建 resource.qrc 文件,并把图片导入到 qrc 中,修改 widget.cpp,给 QLabel 设置图片,给窗口(800 * 600)设置合适尺寸,修改代码,设置 scaledContents 属性,如下:

image-20250116194047516

  • 一旦程序运行起来,QLabel 的尺寸就固定了,如果拖动窗口大小,可以看到图片并不会随着窗口大小的改变而同步变化。

为了解决这个问题,可以在 Widget 中重写 resizeEvent 函数:

image-20250116200038932

  • 执行程序,此时改变窗口大小,图片也会随之变化:

注意:要记得把函数 在.h 文件中,声明一下

image-20250116195932188

注意:这里的 resizeEvent 函数我们没有手动调用,但是能在窗口大小变化时被自动调用,这个过程就是依赖 C++ 中的多态来实现的。

  • Qt 框架内部管理着 QWidget 对象表示我们的窗口,在窗口大小发生改变时,Qt 就会自动调用 resizeEvent 函数
  • 但是由于实际上这个表示窗口的并非是 QWidget,而是 QWidget 的子类,也就是我们自己写的 Widget
  • 此时虽然是通过父类调用函数,但是实际上执行的是子类的函数(也就是我们重写后的 resizeEvent)
  • 获取到窗口的 event,进行 resize 处理

此处属于是多态机制的⼀种经典用法。通过上述过程就可以把自定义的代码插入到框架内部执行,相当于 “注册回调函数”

3、文本对齐、自动换行、缩进、边距

(1)创建四个 label,objectName 分别是 label 到 label_4,并且在 QFrame 中设置 frameShape 为 Box(设置边框之后看起来会更清晰一些)

img

image-20250116202103244

QFrame 是 QLabel 的父类,其中 frameShape 属性用来设置边框性质:

  • QFrame::Box:矩形边框
  • QFrame::Panel:带有可点击区域的面板边框
  • QFrame::WinPanel:Windows 风格的边框
  • QFrame::HLine:水平线边框
  • QFrame::VLine:垂直线边框
  • QFrame::StyledPanel:带有可点击区域的面板边框,但样式取决于窗口主题。

(2)编写 widget.cpp,给这四个 label 设置属性,运行程序

image-20250116202923548

  • 此处设置的文本缩进,后续的行也会产生缩进,不仅仅是首行缩进
4、设置伙伴

(1)创建两个 label 和 两个 radioButton,objectName 分别为 label、label_2、radioButton_A、radioButton_B

image-20250116203746412

此处把 label 中的文本设置为 “快捷键 &A” 这样的形式。

  • 其中 & 后面跟着的字符就是快捷键,可以通过 alt + A 的方式来触发该快捷键。

  • 但是注意,这里的快捷键和 QPushButton 的不同 需要搭配 alt 和 单个字母的方式才能触发。

  • 绑定了伙伴关系之后,通过快捷键就可以选中对应的单选按钮 / 复选按钮。

(2)编写 widget.cpp,设置 buddy 属性【当然这里也可以使用 Qt Designer 直接设置】

image-20250116203724395

  • 可以看到,按下快捷键 alt + a 或者 alt + b,即可选中对应的选项

3.2 LCD Number

QLCDNumer 是一个专门用来显示数字的控件,类似于 “老式计算器” 的效果。

image-20250116203917643

属性说明
intValueQLCDNumber 显示的数字值(整数)。与 value 联动,显示整数值。
valueQLCDNumber 显示的数字值(浮点数)。与 intValue 联动,设置此属性时会自动四舍五入到最近的整数。
例如,给 value 设为 1.5,intValue 的值就是 2。
设置 valueintValue 的方法名为 display,而不是 setValuesetIntValue
digitCount显示几位数字。设置可以显示的最大位数。
mode数字显示形式:
- QLCDNumber::Dec:十进制模式,显示常规的十进制数字。
- QLCDNumber::Hex:十六进制模式,以十六进制格式显示数字。
- QLCDNumber::Bin:二进制模式,以二进制格式显示数字。
- QLCDNumber::Oct:八进制模式,以八进制格式显示数字。
只有在十进制模式下才能显示小数点后的内容。
segmentStyle设置显示风格:
- QLCDNumber::Flat:平面的显示风格,数字呈现在一个平坦的表面上。
- QLCDNumber::Outline:轮廓显示风格,数字具有清晰的轮廓和阴影效果。
- QLCDNumber::Filled:填充显示风格,数字被填充颜色并与背景区分开。
smallDecimalPoint设置较小的小数点。当启用时,小数点将使用更小的段来表示,节省空间并提高显示密度。

【实现倒计时功能】

(1)在界面上创建⼀个 QLCDNumber,初始值设为 10,objectNamelcdNumber

image-20250116210530615

(2)修改 widget.h 代码,创建一个 QTimer 成员 和一个 handle 函数

image-20250116210827930

(3)修改 widget.cpp,在构造函数中初始化 QTimer

  • QTimer 表示定时器,通过 start 方法启动定时器之后,就会每隔一定周期触发一次 QTimer::timeout 信号

  • 使用 connectQTimer::timeout 信号和 Widget::updateTime 连接起来,意味着每次触发 QTimer::timeout 都会执行 Widget::updateTime

handle 实现

  • 通过 intValue 获取到 QLCDNumber 内部的数值。
  • 如果 value 的值归 0 了,就停止 QTimer,接下来 QTimer 也就不会触发 timeout 信号了。

image-20250116211546619

  • 可以看到每隔一秒钟,显示的数字就减少 1:通过 timer ms & lcd -1 实现

💡 欸,针对上面代码我们来两个操作 >

操作一:如果直接在上述 Widget 构造函数中,通过一个循环 + sleep 的方式是否可以呢?

image-20250116212048666

  • 显然,上面这段代码是不行的,循环会使 *Widget 的构造函数无法执行完毕*,此时界面是不能正确构造和显示的。

操作二:如果直接在上述 Widget 构造函数中,另起一个线程,在新线程中完成循环 + sleep 是否可以呢?

image-20250116212404395

  • 上面在 thread 的构造函数中传递了 一个 lambda 表达式,然后在在 lambda 表达式内部,定义了一个无限循环(while (true)),用于持续更新 QLCDNumber 的显示值。

image-20250116212542167

这个代码同样也是不行的

“理想很美好,现实很骨感”

  • Qt 中规定:任何对于 GUI 上内容的操作必须在主线程中完成
  • 像 Widget 构造函数,以及 connect 连接的 slot 函数,都是在主线程中调用的。
  • 而我们自己创建的线程则不是,当我们自己的线程中尝试对界面元素进行修改时,Qt 程序往往会直接崩溃。

这样的约定主要是因为 GUI 中的状态往往是牵一发动全身的,修改一个地方,就需要同步的对其他内容进行调整。

  • 比如调整了某个元素的尺存,就可能影响到内部的文字位置,或者其他元素的位置。这里一连串的修改都是需要按照一定的顺序来完成的。

  • 由于多线程执行的顺序无法保障,因此 Qt 从根本上禁止了其他线程修改 GUI 状态,避免后续的一系列问题。

  • 对于 Qt 的槽函数来说,默认情况下,槽函数都是由主线程调用到,在槽函数中修改界面是没有任何问题的。

综上所述,使用定时器是实现上述功能的最合理方案。后续如果也有类似的需要 “周期性修改界面状态” 的需求也需要优先考虑使用定时器。

3.3 ProgressBar

使用 QProgress Bar 表示一个进度条

  • 注意:不要把 ProgessBar 拼写成 ProcessBar

image-20250116213513843

属性说明
minimum进度条最小值。定义进度条的起始值,默认为 0
maximum进度条最大值。定义进度条的结束值,默认为 100
value进度条当前值。表示进度条中已完成的部分,介于 minimummaximum 之间。
alignment文本在进度条中的对齐方式:
- Qt::AlignLeft:左对齐
- Qt::AlignRight:右对齐
- Qt::AlignCenter:居中对齐
- Qt::AlignJustify:两端对齐
extVisible进度条的数字是否可见。设置为 true 时显示进度数值,false 则隐藏。
orientation进度条的方向是水平还是垂直。
- Qt::Horizontal:水平方向
- Qt::Vertical:垂直方向
invertAppearance是否朝反方向增长进度。如果设为 true,则进度从最大值向最小值递减。
textDirection文本的朝向。影响文本在进度条中的排列方向。
format展示的数字格式:
- %p:表示进度的百分比(0-100)
- %v:表示进度的数值(0-100)
- %m:表示剩余时间(以毫秒为单位)
- %t:表示总时间(以毫秒为单位)

【实现进度条按时间增长功能】

(1)在界面上创建进度条,objectNameprogressBar,其中最小值设为 0,最大值设为 100,当前值设为 0:

image-20250116213536771

(2)修改 widget.h,创建 QTimer 和 handle 函数

image-20250116213536771


这里有个小小的问题:虽然在 widget.h 中用到了 QTimer,但是却没在 widget.h 文件中包含 头文件,为什么这个代码编译没有出错呢?

上述问题其实是通过 Qt 内部提供的一个特殊技巧来实现的。

  • 在 Qt 中有一个专门的头文件(#include ),这个头文件中包含了 Qt 中所有类的 “前置声明”class QWidgetclass QPushButtonclass QTimer)。

  • 这个头文件我们一般不会直接接触到,但是包含其它的 Qt 的头文件,都会间接的包含到这个头文件。

  • 如果 Widget 类的前面以及提供了 QTimer 类的声明的话,此时就可以在 Widget 中声明 QTimer 的指针 / 引用类型的成员。

  • 后续如果要真正使用 QTimer 的头文件(包括创建实例,使用里面的成员),仍然要包含 QTimer 的头文件(包含了 QTimer 的详细的类的定义)。

那么Qt 为什么要使用上述技巧呢?上述技巧能解决什么问题?有什么提升呢?

主要解决的是编译速度的问题。

  • C/C++ 代码,编译速度在其他语言横向对比中是非常慢的。
  • C++ 编译速度慢和 #include 头文件有直接关系
  • 由于 include 关系错综复杂,所以尽可能减少 include 头文件的个数就可以有效地减少编译时间
  • Qt 中就使用 class 前置声明的方式来尽量减少头文件的包含。通过前置声明的方式,Qt 中每个头文件包含的其它头文件数量都能得到一定的降低。

(3)修改 widget.cpp,初始化 QTimer,此处设置 100 ms 触发一次 timeout 信号,也就是 ⼀秒钟触发 10 次,并且实现 handle

image-20250116214551637

在实际开发中,进度条的取值往往是根据当前任务的实际进度来进行设置的

  • 比如需要读取一个很大的文件,就可以获取文件的总的大小和当前读取完毕的大小,来设置进度条的比例。

  • 由于前面我们介绍了 Qt 禁止在其他线程修改界面,因此进度条的更新往往也是需要搭配定时器来完成的。

  • 通过 定时器周期触发信号,主线程调用对应的 slot 函数,再在 slot 函数中对当前的任务进度进行计算,并更新进度条的界面效果。


【实现其他颜色进度条】

上述的进度条是用绿色表示的,但是考虑到有些人可能不喜欢绿⾊,因此我们改成一个红色的进度条。

QProgressBar 同样也是 QWidget 的子类,因此我们可以使用 styleSheet 通过样式来修改进度条的颜色。

(1)代码不变,然后去在 Qt Designer 右侧的属性编辑器中找到 QWidget 的 styleSheet 属性(之前有讲过),编辑内容:其中的 chunk 是选中进度条中的每个 “块”,使用 QProgressBar::text 则可以选中文本。

image-20250116215429395

  • 但是我们发现当我们设置完之后,进度条中的数字会跑到左上角,因此我们还需要把 QProcessBaralignment属性设置为垂直水平居中

image-20250116215243314

此时就可以得到同上面效果一样,但是颜色不同的进度条了,同样的,通过上述方式,也可以修改文字的颜色,字体大小等样式。

3.4 Calendar Widget

QCalendarWidget 表示⼀个 “日历”,形如:

image-20250116215740767

核心属性说明
selectDate当前选中的日期。
minimumDate最小日期,定义用户可以选择的最早日期。
maximumDate最大日期,定义用户可以选择的最晚日期。
firstDayOfWeek每周的第一天(也就是日历的第一列)是周几。
gridVisible是否显示表格的边框,默认为 true 显示边框。
selectionMode是否允许选择日期。可以设置为单选或不选。
navigationBarVisible日历上方标题是否显示,默认为 true 显示导航栏。
horizontalHeaderFormat日历上方标题显示的日期格式,控制顶部标题栏的内容。
verticalHeaderFormat日历第一列显示的内容格式,控制左侧垂直标题栏的内容。
dateEditEnabled是否允许日期被编辑,默认为 false 不可编辑。
重要信号说明
selectionChanged(const QDate&)当选中的日期发生改变时发出。参数是一个 QDate 类型,保存了新的选中日期。
activated(const QDate&)当双击一个有效的日期或者按下回车键时发出。参数是一个 QDate 类型,保存了选中的日期。
currentPageChanged(int, int)当年份月份改变时发出。参数表示改变后的新年份和月份,分别为 int 类型。

【获取选中的日期】

(1)在界面上创建一个 QCalendarWidget 和一个 label,objectName 分别为 calendarWidget,label

image-20250116220455567

(2)给 QCalendarWidget 添加 slot 函数 selectionChanged

image-20250116220711232

  • 上面当选择不同的日期时,label 中的内容也会随之改变

3. 共勉 🔥

★,°:.☆( ̄▽ ̄)/$:.°★ 】那么本篇到此就结束啦,如果有不懂 和 发现问题的小伙伴可以在评论区说出来哦,同时我还会继续更新关于【QT】的内容,请持续关注我 !!
在这里插入图片描述

相关文章:

【QT】 控件 -- 显示类

🔥 目录 [TOC]( 🔥 目录) 1. 前言 2. 显示类控件2.1 Label 1、显示不同文本2、显示图片3、文本对齐、自动换行、缩进、边距4、设置伙伴 3.2 LCD Number 3.3 ProgressBar 3.4 Calendar Widget 3. 共勉 🔥 1. 前言 之前我在上一篇文章【QT】…...

AI语言模型竞争加剧:新秀崛起 格局生变

标题:AI语言模型竞争加剧:新秀崛起 格局生变 文章信息摘要: AI语言模型领域呈现加速发展和分化态势。在LMSYS排行榜上,Claude 3 Opus超越GPT-4 Turbo,DBRX超越Mixtral成为最佳开源模型,显示领先位置更替频…...

RK3568使用opencv(使用摄像头捕获图像数据显示)

文章目录 一、opencv相关的类1. **cv::VideoCapture**2. **cv::Mat**3. **cv::cvtColor**4. **QImage**5. **QPixmap**总结 二、代码实现 一、opencv相关的类 1. cv::VideoCapture cv::VideoCapture 是 OpenCV 中用于视频捕捉的类,常用于从摄像头、视频文件、或者…...

leetcode——排序链表(java)

给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。 示例 1: 输入:head [4,2,1,3] 输出:[1,2,3,4] 示例 2: 输入:head [-1,5,3,4,0] 输出:[-1,0,3,4,5] 示例 3: …...

Windows安装Miniconda和PySide6以及配置PyCharm

目录 1. 选择Miniconda 2. 下载Miniconda 3. 安装Miniconda 4. 在base环境下创建pyside6环境 5. 安装pyside6环境 6. 配置PyCharm环境 7. 运行第一个程序效果 1. 选择Miniconda 选择Miniconda而没有选择Anaconda,是因为它是一个更小的Anaconda发行版&#x…...

floodfill算法(6题)

本质就是找出性质相似的连通块 目录 1.图像渲染 2.岛屿数量 3.岛屿的最大面积 4.被围绕的区域 5.太平洋大西洋水流问题 6.扫雷游戏 1.图像渲染 733. 图像渲染 - 力扣(LeetCode) 我们使用深度优先遍历去遍历即可,也不需要返回值。 值得…...

Spring集成Redis|通用Redis工具类

一、基础使用 概述 在SpringBoot中一般使用RedisTemplate提供的方法来操作Redis。那么使用SpringBoot整合Redis需要 那些步骤呢。 1、 JedisPoolConfig (这个是配置连接池) 2、 RedisConnectionFactory 这个是配置连接信息,这里的RedisConnectionFactory是一个接 …...

python:洛伦兹变换

洛伦兹变换(Lorentz transformations)是相对论中的一个重要概念,特别是在讨论时空的变换时非常重要。在四维时空的背景下,洛伦兹变换描述了在不同惯性参考系之间如何变换时间和空间坐标。在狭义相对论中,洛伦兹变换通常…...

题单:插入排序

题目描述 给定 n 个元素的数组(下标从1开始计),请使用插入排序对其进行排序(升序)。 输入格式 两行,第一行为一个整数 n,表示元素的个数。 第二行 n 个空格分隔的整数,表示数组的…...

【Spring】Spring启示录

目录 前言 一、示例程序 二、OCP开闭原则 三、依赖倒置原则DIP 四、控制反转IOC 总结 前言 在软件开发的世界里,随着项目的增长和需求的变化,如何保持代码的灵活性、可维护性和扩展性成为了每个开发者必须面对的问题。传统的面向过程或基于类的设计…...

【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.30 性能巅峰:NumPy代码优化全攻略

1.30 性能巅峰:NumPy代码优化全攻略 目录 #mermaid-svg-CMVXy3CN2tNmW8RJ {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-CMVXy3CN2tNmW8RJ .error-icon{fill:#552222;}#mermaid-svg-CMVXy3CN2tNmW8RJ …...

C#方法(练习)

1.定义一个函数,输入三个值,找出三个数中的最小值 2.定义一个函数,输入三个值,找出三个数中的最大值 3.定义一个函数,输入三个值,找出三个数中的平均值 4.定义一个函数,计算一个数的 N 次方 Pow(2, 3)返回8 5.传入十一…...

Node.js 的底层原理

Node.js 的底层原理 1. 事件驱动和非阻塞 I/O Node.js 基于 Chrome V8 引擎,使用 JavaScript 作为开发语言。它采用事件驱动和非阻塞 I/O 模型,使其轻量且高效。通过 libuv 库实现跨平台的异步 I/O,包括文件操作、网络请求等。 2. 单线程事…...

react native在windows环境搭建并使用脚手架新建工程

截止到2024-1-11,使用的主要软件的版本如下: 软件实体版本react-native0.77.0react18.3.1react-native-community/cli15.0.1Android Studio2022.3.1 Patch3Android SDKAndroid SDK Platform 34 35Android SDKAndroid SDK Tools 34 35Android SDKIntel x…...

实战:如何快速让新网站被百度收录?

本文来自:百万收录网 原文链接:https://www.baiwanshoulu.com/22.html 要让新网站快速被百度收录,可以采取以下实战策略: 一、网站基础优化 网站结构清晰:确保网站的结构简洁清晰,符合百度的抓取规则。主…...

Nuxt:利用public-ip这个npm包来获取公网IP

目录 一、安装public-ip包1.在Vue组件中使用2.在Nuxt.js插件中使用public-ip 一、安装public-ip包 npm install public-ip1.在Vue组件中使用 你可以在Nuxt.js的任意组件或者插件中使用public-ip来获取公网IP。下面是在一个Vue组件中如何使用它的例子&#xff1a; <template…...

572. 另一棵树的子树

前导题&#xff1a;100. 相同的树 回顾一下 判断两棵二叉树相同&#xff0c;根结点相同 且 左子树相同 且 右子树相同。 于是判断如下&#xff1a; 根结点都为null&#xff0c;返回true根结点不都为null&#xff0c;返回false根结点都不为null&#xff0c;但是值不相同&#…...

LLMs之WebRAG:STORM/Co-STORM的简介、安装和使用方法、案例应用之详细攻略

LLMs之WebRAG&#xff1a;STORM/Co-STORM的简介、安装和使用方法、案例应用之详细攻略 目录 STORM系统简介 1、Co-STORM 2、更新新闻 STORM系统安装和使用方法 1、安装 pip安装 直接克隆GitHub仓库 2、模型和数据集 两个数据集 FreshWiki数据集 WildSeek数据集 支持…...

菜鸟之路Day11-12一一集合进阶(四)

菜鸟之路Day11-12一一集合进阶&#xff08;四&#xff09; 作者&#xff1a;blue 时间&#xff1a;2025.1.29-1.30 文章目录 菜鸟之路Day11-12一一集合进阶&#xff08;四&#xff09;0.概述1.可变参数2.Collections3.综合练习4.不可变的集合5.Stream流 0.概述 内容学习自黑…...

在Ubuntu下编译VLC

参考链接&#xff1a; https://blog.csdn.net/zyhse/article/details/113662686...

python开发,最好的环境是什么

目录 1. 集成开发环境&#xff08;IDE&#xff09; 1.1 PyCharm 1.2 Visual Studio Code (VSCode) 2. 文本编辑器 2.1 Sublime Text 2.2 Vim/NeoVim 3. 虚拟环境管理 4. 版本控制与协作 5. 容器化开发 6. 项目管理与依赖管理工具 7. 单元测试与调试 最佳组合推荐 …...

Maui学习笔记- SQLite简单使用案例02添加详情页

我们继续上一个案例&#xff0c;实现一个可以修改当前用户信息功能。 当用户点击某个信息时&#xff0c;跳转到信息详情页&#xff0c;然后可以点击编辑按钮导航到编辑页面。 创建项目 我们首先在ViewModels目录下创建UserDetailViewModel。 实现从详情信息页面导航到编辑页面…...

创建前端项目的方法

目录 一、创建前端项目的方法 1.前提&#xff1a;安装Vue CLI 2.方式一&#xff1a;vue create项目名称 3.方式二&#xff1a;vue ui 二、Vue项目结构 三、修改Vue项目端口号的方法 一、创建前端项目的方法 1.前提&#xff1a;安装Vue CLI npm i vue/cli -g 2.方式一&…...

好用的AI/解析网站

文件解析 json文件解析&#xff1a;http://www.yunjson.com/jsoncheck/...

C语言练习(31)

有5个学生&#xff0c;每个学生有3门课程的成绩&#xff0c;从键盘输入以上数据&#xff08;包括学号、姓名、3门课程成绩&#xff09;&#xff0c;计算出平均成绩&#xff0c;将原有数据和计算出的平均分数存放在磁盘文件stud中。 设5名学生的学号、姓名和3门课程成绩如下&am…...

《深入浅出HTTPS​​​​​​​​​​​​​​​​​》读书笔记(31):HTTPS和TLS/SSL

《深入浅出HTTPS​​​​​​​​​​》读书笔记&#xff08;31&#xff09;&#xff1a;HTTPS和TLS/SSL TLS/SSL协议和应用层协议无关&#xff0c;它只是加密应用层协议&#xff08;比如HTTP&#xff09;并传递给下层的TCP。 HTTP和TLS/SSL协议组合在一起就是HTTPS, HTTPS等…...

SpringBoot AOP 和 事务

SpringBoot 整合 AOP 动态代理技术 JDK 动态代理 JDK 动态代理是 Java 自带的一种代理方式。它要求目标类必须有接口&#xff0c;基于这个接口&#xff0c;JDK 在运行时会动态生成一个代理对象。这个代理对象和目标对象就像 “拜把子” 的兄弟&#xff0c;因为它们都实现了相同…...

如何使用Python调用大语言模型的API接口?

以下是使用 Python 调用几种常见大语言模型 API 接口的详细步骤和示例代码&#xff1a; 1. 调用 OpenAI 的 GPT 模型 API OpenAI 提供了强大的 GPT 系列模型&#xff0c;使用其 API 需要先注册 OpenAI 账号并获取 API 密钥。 步骤&#xff1a; 安装openai库&#xff1a;pip…...

如何监控ubuntu系统某个程序的运行状态,如果程序出现异常,对其自动重启。

在Ubuntu系统中&#xff0c;可以通过编写脚本结合cron或systemd来监控程序的运行状态&#xff0c;并在程序异常时自动重启。以下是具体步骤&#xff1a; 方法一&#xff1a;使用Shell脚本和Cron 编写监控脚本 创建一个Shell脚本来检查程序是否运行&#xff0c;并在程序异常时重…...

Kafka 压缩算法详细介绍

文章目录 一 、Kafka 压缩算法概述二、Kafka 压缩的作用2.1 降低网络带宽消耗2.2 提高 Kafka 生产者和消费者吞吐量2.3 减少 Kafka 磁盘存储占用2.4 减少 Kafka Broker 负载2.5 降低跨数据中心同步成本 三、Kafka 压缩的原理3.1 Kafka 压缩的基本原理3.2. Kafka 压缩的工作流程…...

启元世界(Inspir.ai)技术浅析(二):深度强化学习

深度强化学习(Deep Reinforcement Learning, DRL)是启元世界在人工智能领域的一项核心技术,广泛应用于游戏AI、智能决策等领域。 一、状态(State) 1.1 概念与作用 **状态(State)**是指智能体对环境的感知,是智能体进行决策的基础。在深度强化学习中,状态通常是一个高…...

在K8s中部署动态nfs存储provisioner

背景 之前&#xff0c;我已经在一台worker node上安装了local lvm 的provisioner来模拟需要本地高IOPS的数据库等stafeful应用的实现。 为了后续给虚拟机里的K8s集群安装可用的metrics和logs监控系统&#xff08;metrics和logs的时序数据库需要永久存储&#xff09;&#xff0…...

SQL注入漏洞之绕过[前端 服务端 waf]限制 以及 防御手法 一篇文章给你搞定

目录 绕过手法 前端代码绕过 后端代码绕过 各种字段进行验证 union 大小写绕过 双写逃过 强制类型判断 引号特殊编码处理。 内联注释绕过 注释符绕过 or/and绕过 空格绕过 防御SQL注入的方法 使用预编译语句 使用存储过程 检查数据类型 绕过手法 前端代码绕过…...

C++ 写一个简单的加减法计算器

************* C topic&#xff1a;结构 ************* Structure is a very intersting issue. I really dont like concepts as it is boring. I would like to cases instead. If I want to learn something, donot hesitate to make shits. Like building a house. Wh…...

Effective C++ 规则50:了解 new 和 delete 的合理替换时机

1、背景 在 C 中&#xff0c;new 和 delete 是动态分配内存的核心操作符。然而&#xff0c;直接使用它们有时会增加程序的复杂性&#xff0c;甚至导致内存泄漏和其他问题。因此&#xff0c;了解何时替换 new 和 delete 并选择更适合的内存管理策略&#xff0c;是编写高效、健壮…...

水果实体店品牌数字化:RWA + 智能体落地方案

一、方案背景 随着数字化技术的迅猛发展&#xff0c;实体零售行业正面临前所未有的挑战与机遇。传统的零售模式难以满足消费者对个性化、便捷化、智能化的需求&#xff0c;尤其是在水果等生鲜商品领域&#xff0c;如何通过技术手段提升运营效率、增强顾客体验、拓宽盈利模式&a…...

Docker小游戏 | 使用Docker部署FC-web游戏模拟器

Docker小游戏 | 使用Docker部署FC-web游戏模拟器 前言一、项目介绍项目简介项目预览二、系统要求环境要求环境检查Docker版本检查检查操作系统版本三、部署FC-web游戏模拟器下载镜像创建容器检查容器状态检查服务端口安全设置四、访问FC-web游戏模拟器试玩游戏FC游戏的操作方法…...

【视频+图文详解】HTML基础3-html常用标签

图文教程 html常用标签 常用标签 1. 文档结构 <!DOCTYPE html>&#xff1a;声明HTML文档类型。<html>&#xff1a;定义HTML文档的根元素。<head>&#xff1a;定义文档头部&#xff0c;包含元数据。<title>&#xff1a;设置网页标题&#xff0c;浏览…...

年化19.3%策略集|ctpbee_api替换成openctp整合backtrader实盘方案(代码+数据)

原创内容第782篇&#xff0c;专注量化投资、个人成长与财富自由。 昨天我们把backtraderctpbee的实盘整合代码跑通了&#xff0c;年化19.3%&#xff0c;回撤仅8%的实盘策略&#xff0c;以及backtrader整合CTPBee做实盘&#xff08;附python代码和数据&#xff09; 这两周我们加…...

谭浩强C语言程序设计(3) 7章

1、递归实现N的阶乘 c复制 #include <cstdio> // 包含标准输入输出库// 计算n的阶乘 int total 0; // 定义全局变量total用于存储阶乘结果// 递归函数计算阶乘 int fac(int a){// 如果输入的数小于0&#xff0c;输出错误信息if (a < 0){printf("%d < 0,err…...

国产SiC碳化硅功率器件技术成为服务器电源升级的核心引擎

在服务器电源应用中&#xff0c;国产650V碳化硅&#xff08;SiC&#xff09;MOSFET逐步取代传统超结&#xff08;Super Junction, SJ&#xff09;MOSFET&#xff0c;其核心驱动力源于SiC材料在效率、功率密度、可靠性和长期经济性上的显著优势&#xff0c;叠加产业链成熟与政策…...

深入探讨:服务器如何响应前端请求及后端如何查看前端提交的数据

深入探讨&#xff1a;服务器如何响应前端请求及后端如何查看前端提交的数据 一、服务器如何响应前端请求 前端与后端的交互主要通过 HTTP 协议实现。以下是详细步骤&#xff1a; 1. 前端发起 HTTP 请求 GET 请求&#xff1a;用于从服务器获取数据。POST 请求&#xff1a;用…...

深度学习指标可视化案例

TensorBoard 代码案例&#xff1a;from torch.utils.tensorboard import SummaryWriter import torch import torchvision from torchvision import datasets, transforms# 设置TensorBoard日志路径 writer SummaryWriter(runs/mnist)# 加载数据集 transform transforms.Comp…...

unity学习24:场景scene相关生成,加载,卸载,加载进度,异步加载场景等

目录 1 场景数量 SceneManager.sceneCount 2 直接代码生成新场景 SceneManager.CreateScene 3 场景的加载 3.1 用代码加载场景&#xff0c;仍然build setting里先加入配置 3.2 卸载场景 SceneManager.UnloadSceneAsync(); 3.3 同步加载场景 SceneManager.LoadScene 3.3.…...

网易云音乐歌名可视化:词云生成与GitHub-Pages部署实践

引言 本文将基于前一篇爬取的网易云音乐数据, 利用Python的wordcloud、matplotlib等库, 对歌名数据进行深入的词云可视化分析. 我们将探索不同random_state对词云布局的影响, 并详细介绍如何将生成的词云图部署到GitHub Pages, 实现数据可视化的在线展示. 介绍了如何从原始数据…...

Web-3.0(Solidity)基础教程

Solidity 是 以太坊智能合约编程语言&#xff0c;用于编写 去中心化应用&#xff08;DApp&#xff09;。如果你想开发 Web3.0 应用&#xff0c;Solidity 是必学的。 Remix - Ethereum IDE&#xff08;在线编写 Solidity&#xff09; 特性Remix IDEHardhat适用场景适合 初学者 …...

android获取EditText内容,TextWatcher按条件触发

android获取EditText内容&#xff0c;TextWatcher按条件触发 背景&#xff1a;解决方案&#xff1a;效果&#xff1a; 背景&#xff1a; 最近在尝试用原生安卓实现仿element-ui表单校验功能&#xff0c;其中涉及到EditText组件内容的动态校验&#xff0c;初步实现功能后&#…...

题单:冒泡排序1

题目描述 给定 n 个元素的数组&#xff08;下标从 1 开始计&#xff09;&#xff0c;请使用冒泡排序对其进行排序&#xff08;升序&#xff09;。 请输出每一次冒泡过程后数组的状态。 要求&#xff1a;每次从第一个元素开始&#xff0c;将最大的元素冒泡至最后。 输入格式…...

我的毕设之路:(2)系统类型的论文写法

一般先进行毕设的设计与实现&#xff0c;再在现成毕设基础上进行描述形成文档&#xff0c;那么论文也就成形了。 1 需求分析&#xff1a;毕业设计根据开题报告和要求进行需求分析和功能确定&#xff0c;区分贴合主题的主要功能和拓展功能能&#xff0c;删除偏离无关紧要的功能…...

JVM_类的加载、链接、初始化、卸载、主动使用、被动使用

①. 说说类加载分几步&#xff1f; ①. 按照Java虚拟机规范,从class文件到加载到内存中的类,到类卸载出内存为止,它的整个生命周期包括如下7个阶段: 第一过程的加载(loading)也称为装载验证、准备、解析3个部分统称为链接(Linking)在Java中数据类型分为基本数据类型和引用数据…...