[Qt] 万字详解 | 常用控件 | Button | Label | LCD | ProgressBar
目录
按钮类控件
1、Push Button 按钮
2、Radio Buttion 单选
click、press、release、toggled 的区别
3、Check Box 复选
4、Tool Button
显示类控件
1、Label
2、LCD Number
3、ProgressBar
4、Calendar Widget
按钮类控件
1、Push Button 按钮
- 概述:
QPushButton
是一个表示按钮的控件,继承自QAbstractButton
。QAbstractButton
是其他按钮类型的父类,提供了一系列通用属性和方法。
- 继承关系:在 Qt Designer 中可以看到
QPushButton
的继承层次结构,它继承了QWidget
的所有属性,并添加了一些特有的属性。
QAbstractButton 中,和 QPushButton 相关性较大的属性:
属性 | 说明 |
text | 按钮中的文本。用于显示在按钮上的文字内容。 |
icon | 按钮中的图标。可以为按钮设置一个图标,增强视觉效果或指示功能。 |
iconSize | 按钮中图标的尺寸。指定图标的大小,确保图标在不同分辨率下都能正确显示。 |
shortCut | 按钮对应的快捷键。允许用户通过键盘快捷键触发按钮的点击事件。 |
autoRepeat | 按钮是否会重复触发。当鼠标左键按住不放时: |
autoRepeatDelay | 重复触发的延时时间。按住按钮多久之后,开始重复触发。 |
autoRepeatInterval | 重复触发的周期。即每次重复触发之间的时间间隔。 |
- QAbstractButton 作为 QWidget 的子类,当然也继承了 QWidget 的属性。上面介绍的 QWidget 里的各种属性用法,对于 QAbstractButton 同样适勇。因此表格仅列出 QAbstractButton 独有的属性。
- Qt 的 api 设计风格是非常清晰的,此处列出的属性都是可以获取和设置的。例如,使用 text() 获取按钮文本,使用 setText() 设置文本。
事实上,QPushButton 的核心功能都是 QAbstractButton 提供的,自身提供的属性都比较简单。其中,default 和 audoDefault 影响的是按下 enter 时自动点击哪个按钮的行为,flat 把按钮设置为扁平的样式。
【带有图标的按钮】
(1)创建 resource.qrc 文件并导入图片
具体操作步骤参见 QWidget 中的 windowIcon 部分。
(2)在界面上创建一个按钮
(3)修改 widget.cpp,给按钮设置图标
运行:
【带有快捷键的按钮 】
(1)在界面中拖五个按钮
五个按钮的 objectName 分别为 pushButton_target、pushButton_up、pushButton_down、pushButton_left、pushButton_right。
(2)创建 resource.qrc,并导入 5 个图片
矢量图标库
(3)修改 widget.cpp,设置图标资源和快捷键
- 使用 setShortcut 给按钮设置快捷键,参数是⼀个 QKeySequence 对象,表示一个按键序列,支持持组合键(Ctrl + C 这种)。
- QKeySequence 的构造函数参数,可以直接使用 "Ctrl + C" 这样的按键名字符串表示,也可以使用预定义好的常量(形如 Qt::CTRL + Qt::Key_C)表示。
(4)修改 widget.cpp,设置四个方向键的 slot 函数
(5)运行程序
此时点击按钮,或者使用 wasd 均可让 537 移动~
【按钮的重复触发】
在上述案例中按住快捷键,是可以进行重复触发的,但是鼠标点击则不能。
(1)修改 widget.cpp,在构造函数中开启重复触发
此时按住鼠标时,即可让 “537” 连续移动。
2、Radio Buttion 单选
QRadioButton 是单选按钮,可以让我们在多个选项中选择一个。
作为 QAbstractButton 和 QWidget 的子类,上面介绍的属性和用法,对于 QRadioButton 同样适用。
QAbstractButton 中和 QRadioButton 关系较大的属性:
属性 | 说明 |
checkable | 是否能选中。如果设置为 |
checked | 是否已经被选中。只有当 |
autoExclusive | 是否排他。对于一组按钮而言,如果其中一个按钮被选中,则其他按钮的选中状态将被取消。此属性通常用于单选按钮(如 |
【选择性别】
(1)在界面上创建⼀个 label 和 3 个单选按钮
设置的文本如下图,3 个单选按钮的 objectName 分别为:radioButton_male、radioButton_female、radioButton_other
(2)修改 widget.cpp,编辑三个 QRadioButton 的 slot 函数
(3)运行程序
可以看到随着选择不同的单选按钮,label 中的提示文字就会随之变化:
(4)当前代码中,如果程序启动,则不会选择任何选项
可以修改代码,让程序启动默认选中性别男:
此时运行程序,即可看到性别男已经被选中了。
(5)当前代码中,也可以禁⽤ “其他” 被选中
修改 widget.cpp 的构造函数:
运行程序可以看到,点击 “其他” 按钮的时候,虽然不会被选中,但是可以触发点击事件,使上面的 label 显示性别为其他:
使用 setEnabled 是更彻底的禁用按钮的方式,此时该按钮无法被选中,也无法响应任何输入:
click、press、release、toggled 的区别
- clicked 表示⼀次 “点击”
- pressed 表示鼠标 “按下”
- released 表示鼠标 “释放”
- toggled 表示按钮状态切换
(1)在界面上创建四个单选按钮
objectName 分别为 radioButton、radioButton_2、radioButton_3、radioButton_4
(2)给 1 创建 clicked 槽函数,给 2 创建 pressed 槽函数,给 3 创建 released 槽函数,给 4 创建 toggled 槽函数
(3)运行程序
可以看到:
- clicked 是⼀次鼠标按下 + 鼠标标释放触发的
- pressed 是鼠标按下触发的
- released 是鼠标释放触发的
- toggled 是 checked 属性改变时触发的
总的来说,toggled 是最适合 QRadioButton 的。
【单选框分组】
(1)在界面上创建 6 个单选框,用来模拟麦当劳点餐界面。
objectName 分别为 radioButton 到 radioButton_6
此时直接运行程序可以看到,这六个 QRadioButton 之间都是排他的。我们希望每一组内部来控制排他,但是组和组之间不能排他。
(2)引入 QButtonGroup 进行分组
A. 修改 widget.cpp
再次执行程序可以看到可以按照正确的分组方式来完成排他了。
3、Check Box 复选
QCheckBox 表示复选按钮,可以允许选中多个。和 QCheckBox 最相关的属性也是 checkable 和 checked,都是继承自 QAbstractButton。
至于 QCheckBox 独有的属性 tristate 用来实现 “三态复选框”,这个东西比较冷门,这里暂时不讲述。
【获取复选按钮的取值】
(1)在界面上创建三个复选按钮和一个普通按钮
objectName 分别为 checkBox_study、checkBox_game、checkBox_work 以及 pushButton
(2)给 pushButton 添加 slot 函数
(3)运行程序
可以看到点击确认按钮时,就会在控制台中输出选中的内容:
4、Tool Button
QToolButton 的大部分功能和 QPushButton 是一致的,但 QToolButton 主要应用在工具栏、菜单等场景。
显示类控件
1、Label
QLabel 可以用来显示文本和图片。
核心属性如下:
属性 | 说明 |
text |
|
textFormat | 文本的格式: |
pixmap |
|
scaledContents | 设置为 |
alignment | 对齐方式。可以设置水平和垂直方向如何对齐,例如居中、左对齐等。 |
wordWrap | 设置为 |
indent | 设置文本缩进。影响水平和垂直方向的缩进。具体生效的方向取决于 |
margin | 内部文本和边框之间的边距。不同于 |
openExternalLinks | 是否允许打开一个外部链接。当 |
buddy | 给 |
【显示不同格式的文本】
(1)在界面上创建三个 QLabel
尺存放大一些,objectName 分别为 label、label_2、label_3
⭕ (2)修改 widget.cpp,设置三个 label 的属性
(3)运行程序
【显示图片】
虽然 QPushButton 也可以通过设置图标的方式设置图片,但是并非是一个好的选择,更多的时候还是希望通过 QLabel 来作为一个更单纯的显示图片的方式。
(1)在界面上创建一个 QLabel、objectName 为 label
(2)创建 resource.qrc 文件,并把图片导入到 qrc 中
(3)修改 widget.cpp,给 QLabel 设置图片
这个图片本身的尺寸是 1280 * 150,超出了窗口的大小(800 * 800)。
执行程序,观察结果:
(4)修改代码,设置 scaledContents 属性
再次运行程,观察效果,可以看到图片已经被拉伸,可以把窗口填满了:
此时,如果拖动窗口大小,可以看到图片并不会随着窗口大小的改变而同步变化。
为了解决这个问题,可以在 Widget 中重写 resizeEvent 函数:
(要记得把函数 在.h 文件中,声明一下~)
执行程序,此时改变窗口大小,图片也会随之变化:
注意:这里的 resizeEvent 函数我们没有手动调用,但是能在窗口大小变化时被自动调用,这个过程就是依赖 C++ 中的多态来实现的。
- Qt 框架内部管理着 QWidget 对象表示我们的窗口,在窗口大小发生改变时,Qt 就会自动调用 resizeEvent 函数。
- 但是由于实际上这个表示窗口的并非是 QWidget,而是 QWidget 的子类,也就是我们自己写的 Widget。
- 此时虽然是通过父类调用函数,但是实际上执行的是子类的函数(也就是我们重写后的 resizeEvent)。
- 获取到窗口的 event,进行 resize 处理~
此处属于是多态机制的⼀种经典用法。通过上述过程就可以把自定义的代码插入到框架内部执行,相当于 “注册回调函数”
【文本对齐、自动换行、缩进、边距】
(1)创建四个 label,objectName 分别是 label 到 label_4,并且在 QFrame 中设置 frameShape 为 Box(设置边框之后看起来会更清晰一些)
QFrame 是 QLabel 的父类,其中 frameShape 属性用来设置边框性质:
- QFrame::Box:矩形边框
- QFrame::Panel:带有可点击区域的面板边框
- QFrame::WinPanel:Windows 风格的边框
- QFrame::HLine:水平线边框
- QFrame::VLine:垂直线边框
- QFrame::StyledPanel:带有可点击区域的面板边框,但样式取决于窗口主题。
(2)编写 widget.cpp,给这四个 label 设置属性
(3)运行程序
【设置伙伴】
(1)创建两个 label 和 两个 radioButton
objectName 分别为 label、label_2、radioButton、radioButton_2
此处把 label 中的文本设置为 “快捷键 &A” 这样的形式。
- 其中 & 后面跟着的字符就是快捷键,可以通过 alt + A 的方式来触发该快捷键。
- 但是注意,这里的快捷键和 QPushButton 的不同 需要搭配 alt 和 单个字母的方式才能触发。
- 绑定了伙伴关系之后,通过快捷键就可以选中对应的单选按钮 / 复选按钮。
(2)编写 widget.cpp,设置 buddy 属性
这里也可以使用 Qt Designer 直接设置:
(3)运行程序
可以看到,按下快捷键 alt + a 或者 alt + b,即可选中对应的选项:
2、LCD Number
QLCDNumer 是一个专门用来显示数字的控件,类似于 “老式计算器” 的效果。
核心属性:
属性 | 说明 |
intValue |
|
value |
|
digitCount | 显示几位数字。设置可以显示的最大位数。 |
mode | 数字显示形式: |
segmentStyle | 设置显示风格: |
smallDecimalPoint | 设置较小的小数点。当启用时,小数点将使用更小的段来表示,节省空间并提高显示密度。 |
【倒计时】
(1)在界面上创建⼀个 QLCDNumber,初始值设为 10
objectName 为 lcdNumber
(2)修改 widget.h 代码,创建一个 QTimer 成员和一个 handle 函数
(3)修改 widget.cpp,在构造函数中初始化 QTimer
- QTimer 表示定时器,通过 start 方法启动定时器之后,就会每隔一定周期触发一次 QTimer::timeout 信号
- 使用 connect 把 QTimer::timeout 信号和 Widget::updateTime 连接起来,意味着每次触发 QTimer::timeout 都会执行 Widget::updateTime
(4)修改 widget.cpp,实现 handle
- 通过 intValue 获取到 QLCDNumber 内部的数值。
- 如果 value 的值归 0 了,就停止 QTimer,接下来 QTimer 也就不会触发 timeout 信号了。
(5)执行程序
可以看到每隔一秒钟,显示的数字就减少 1:
通过 timer ms & lcd -1 实现
(6)针对上述代码,存在两个问题
A. 上述代码如果直接在 Widget 构造函数中,通过一个循环 + sleep 的方式是否可以呢?
显然,上面这段代码是不行的,循环会使 Widget 的构造函数无法执行完毕,此时界面是不能正确构造和显示的。
B. 上述代码如果是在 Widget 构造函数中,另起一个线程,在新线程中完成循环 + sleep 是否可以呢?
步骤解释:
- 创建
std::thread
对象:
-
- 使用
std::thread
的构造函数来创建一个新的线程。 - 构造函数接受一个 lambda 表达式作为参数,该 lambda 表达式定义了新线程将执行的代码。
- 使用
- lambda 表达式:
-
std::thread
的构造函数中传递了一个 lambda 表达式[this]()
,表示新线程将访问当前对象 (this
) 的成员变量和方法。- 在 lambda 表达式内部,定义了一个无限循环(
while (true)
),用于持续更新QLCDNumber
的显示值。
- 线程逻辑:
-
- 获取
QLCDNumber
的当前值。 - 每隔一秒(
std::this_thread::sleep_for(std::chrono::seconds(1))
)更新一次显示值,并检查是否达到终止条件(value <= 0
)。
- 获取
- 启动线程:
-
- 创建
std::thread
对象时,线程立即开始执行。
- 创建
代码:
#include "widget.h"
#include "ui_widget.h"
#include <thread>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 创建并启动新线程std::thread t([this]() {int value = this->ui->lcdNumber->intValue();while (true) {std::this_thread::sleep_for(std::chrono::seconds(1));if (value <= 0)break;value -= 1;this->ui->lcdNumber->display(value);}});// 启动线程t.detach(); // 或者使用 t.join() 来等待线程结束
}Widget::~Widget()
{delete ui;
}
注意事项:
- 线程安全:确保在多线程环境中正确处理 UI 更新,避免竞态条件。
- 线程分离:使用
t.detach()
将线程分离,使其独立运行。如果需要等待线程结束,可以使用t.join()
。
实现在主线程之外的 另一个线程中更新 QLCDNumber
的显示值,从而避免阻塞用户界面。
这个代码同样是不行的。
“理想很美好,现实很骨感”
- Qt 中规定:任何对于 GUI 上内容的操作必须在主线程中完成。
- 像 Widget 构造函数,以及 connect 连接的 slot 函数,都是在主线程中调用的。
- 而我们自己创建的线程则不是,当我们自己的线程中尝试对界面元素进行修改时,Qt 程序往往会直接崩溃。
这样的约定主要是因为 GUI 中的状态往往是牵一发动全身的,修改一个地方,就需要同步的对其他内容进行调整。
- 比如调整了某个元素的尺存,就可能影响到内部的文字位置,或者其他元素的位置。这里一连串的修改都是需要按照一定的顺序来完成的。
- 由于多线程执行的顺序无法保障,因此 Qt 从根本上禁止了其他线程修改 GUI 状态,避免后续的一系列问题。
- 对于 Qt 的槽函数来说,默认情况下,槽函数都是由主线程调用到,在槽函数中修改界面是没有任何问题的。
综上所述,使用定时器是实现上述功能的最合理方案。后续如果也有类似的需要 “周期性修改界面状态” 的需求也需要优先考虑使用定时器。
3、ProgressBar
使用 QProgress Bar 表示一个进度条。
注意,不要把 ProgessBar 拼写成 ProcessBar !
核心属性:
属性 | 说明 |
minimum | 进度条最小值。定义进度条的起始值,默认为 |
maximum | 进度条最大值。定义进度条的结束值,默认为 |
value | 进度条当前值。表示进度条中已完成的部分,介于 |
alignment | 文本在进度条中的对齐方式: |
textVisible | 进度条的数字是否可见。设置为 |
orientation | 进度条的方向是水平还是垂直。 |
invertAppearance | 是否朝反方向增长进度。如果设为 |
textDirection | 文本的朝向。影响文本在进度条中的排列方向。 |
format | 展示的数字格式: |
【设置进度条按时间增长】
(1)在界面上创建进度条,objectName 为 progressBar
其中最小值设为 0,最大值设为 100,当前值设为 0:
(2)修改 widget.h,创建 QTimer 和 handle 函数
虽然在 widget.h 中用到了 QTimer,但是却没在 widget.h 文件中包含 <QTimer> 头文件,为什么这个代码编译没有出错呢?
上述问题其实是通过 Qt 内部提供的一个特殊技巧来实现的。
- 在 Qt 中有一个专门的头文件(#include <QWidget>),这个头文件中包含了 Qt 中所有类的 “前置声明”(class QWidget,class QPushButton,class QTimer)。
- 这个头文件我们一般不会直接接触到,但是包含其它的 Qt 的头文件,都会间接的包含到这个头文件。
- 如果 Widget 类的前面以及提供了 QTimer 类的声明的话,此时就可以在 Widget 中声明 QTimer 的指针 / 引用类型的成员。
- 后续如果要真正使用 QTimer 的头文件(包括创建实例,使用里面的成员),仍然要包含 QTimer 的头文件(包含了 QTimer 的详细的类的定义)。
Qt 为什么要使用上述技巧呢?上述技巧能解决什么问题?有什么提升呢?
主要解决的是编译速度的问题。
- C/C++ 代码,编译速度在其他语言横向对比中是非常慢的。
- C++ 编译速度慢和 #include 头文件有直接关系。
- 由于 include 关系错综复杂,所以尽可能减少 include 头文件的个数就可以有效地减少编译时间。
- Qt 中就使用 class 前置声明的方式来尽量减少头文件的包含。通过前置声明的方式,Qt 中每个头文件包含的其它头文件数量都能得到一定的降低。
(3)修改 widget.cpp,初始化 QTimer
此处设置 100ms 触发一次 timeout 信号,也就是⼀秒钟触发 10 次
(4)修改 widget.cpp,实现 handle
(5) 运行程序
可以看到进度条中的进度在快速增长:
在实际开发中,进度条的取值往往是根据当前任务的实际进度来进行设置的。
- 比如需要读取一个很大的文件,就可以获取文件的总的大小和当前读取完毕的大小,来设置进度条的比例。
- 由于前面我们介绍了 Qt 禁止在其他线程修改界面,因此进度条的更新往往也是需要搭配定时器来完成的。
- 通过定时器周期触发信号,主线程调用对应的 slot 函数,再在 slot 函数中对当前的任务进度进行计算,并更新进度条的界面效果。
【创建一个红色的进度条】
上述的进度条是用绿⾊表示的,但是考虑到有些人可能不喜欢绿⾊,因此我们改成一个红色的进度条。
QProgressBar 同样也是 QWidget 的子类,因此我们可以使用 styleSheet 通过样式来修改进度条的颜色。
(1)在界面上创建一个进度条
(2)在 Qt Designer 右侧的属性编辑器中找到 QWidget 的 styleSheet 属性
编辑内容:其中的 chunk 是选中进度条中的每个 “块”,使用 QProgressBar::text 则可以选中文本。
同时把 QProcessBar 的 alignment 属性设置为垂直水平居中:
此处如果不设置 alignment,进度条中的数字会跑到左上角。
(3)执行程序
可以看到如下效果,就得到了一个红色的进度条:
通过上述方式,也可以修改文字的颜色,字体大小等样式。
4、Calendar Widget
QCalendarWidget 表示⼀个 “日历”,形如:
核心属性:
属性 | 说明 |
selectDate | 当前选中的日期。 |
minimumDate | 最小日期,定义用户可以选择的最早日期。 |
maximumDate | 最大日期,定义用户可以选择的最晚日期。 |
firstDayOfWeek | 每周的第一天(也就是日历的第一列)是周几。 |
gridVisible | 是否显示表格的边框,默认为 |
selectionMode | 是否允许选择日期。可以设置为单选或不选。 |
navigationBarVisible | 日历上方标题是否显示,默认为 |
horizontalHeaderFormat | 日历上方标题显示的日期格式,控制顶部标题栏的内容。 |
verticalHeaderFormat | 日历第一列显示的内容格式,控制左侧垂直标题栏的内容。 |
dateEditEnabled | 是否允许日期被编辑,默认为 |
重要信号:
信号 | 说明 |
selectionChanged(const QDate&) | 当选中的日期发生改变时发出。参数是一个 |
activated(const QDate&) | 当双击一个有效的日期或者按下回车键时发出。参数是一个 |
currentPageChanged(int, int) | 当年份月份改变时发出。参数表示改变后的新年份和月份,分别为 |
【获取选中的日期】
(1)在界面上创建一个 QCalendarWidget 和一个 label
objectName 为 calendarWidget,label
(2)给 QCalendarWidget 添加 slot 函数
(3)执行程序
可以看到当选择不同的日期时,label 中的内容就会随之改变:
相关文章:
[Qt] 万字详解 | 常用控件 | Button | Label | LCD | ProgressBar
目录 按钮类控件 1、Push Button 按钮 2、Radio Buttion 单选 click、press、release、toggled 的区别 3、Check Box 复选 4、Tool Button 显示类控件 1、Label 2、LCD Number 3、ProgressBar 4、Calendar Widget 按钮类控件 1、Push Button 按钮 概述:…...
【数据仓库】hadoop3.3.6 安装配置
文章目录 概述下载解压安装伪分布式模式配置hdfs配置hadoop-env.shssh免密登录模式设置初始化HDFS启动hdfs配置yarn启动yarn 概述 该文档是基于hadoop3.2.2版本升级到hadoop3.3.6版本,所以有些配置,是可以不用做的,下面仅记录新增操作&#…...
ffmpeg八大开发库
FFmpeg八大库是指FFmpeg项目中最重要的八个库,它们各自承担不同的功能,共同构成了FFmpeg的强大功能。以下是这八大库的详细介绍: libavcodec:负责音频和视频的编解码。它支持多种编解码器,如H.264、AAC、MP3、…...
Uniapp中使用`wxml-to-canvas`开发DOM生成图片功能
Uniapp中使用wxml-to-canvas开发DOM生成图片功能 在移动端开发中,生成图片是一个常见需求,例如用于分享海报、生成动态二维码等。在Uniapp框架中,我们可以通过wxml-to-canvas插件轻松实现将DOM转化为图片的功能。本文将详细介绍如何在Uniapp…...
【09】深入解析 Three.js 官网示例:下雪粒子特效与场景渲染的实现(webgpu_compute_particles_snow.html)
引言 Three.js 是一个强大的 JavaScript 库,用于在网页上创建和渲染 3D 场景。本文将深入分析一段 Three.js 官网示例代码,详细解释其实现思路和主要功能代码,帮助读者更好地理解和掌握 Three.js 的应用。官网代码地址:https://g…...
电子价签会是零售界的下一个主流?【新立电子】
电子价签,作为一种能够替代传统纸质标签的数字显示屏,已经在零售行业中展现出其巨大的潜力。它具有实时更新、集中管理、高效节能的特点,实现价格的实时更新,大大减少更新价格的工作量和时间。为消费者带来更加便捷、准确的购物体…...
uniapp——App下载文件,保存、打开文件(二)
uniapp如何下载文件、保存、打开文件 时光荏苒,2024即将过去! 迈向2025,祝大家新的一年工作顺利、万事如意,少一点BUG,涨一点工资…↖(ω)↗ 文章目录 uniapp如何下载文件、保存、打开文件下载文件保存并打开文件处理 …...
如何轻松关闭 iPhone 上的 HEIC [HEIC 图像技巧]
您是否正在为关闭 iPhone 上的 HEIC 而烦恼?你不是一个人; Apple 的首选图像文件格式仍可能存在一些兼容性问题。当您与某人共享照片或尝试在Windows计算机上打开图像时,就会出现此问题。幸运的是,Apple 使关闭 HEIC iPhone 变得更加容易。 …...
库伦值自动化功耗测试工具
1. 功能介绍 PlatformPower工具可以自动化测试不同场景的功耗电流,并可导出为excel文件便于测试结果分析查看。测试同时便于后续根据需求拓展其他自动化测试用例。 主要原理:基于文件节点 coulomb_count 实现,计算公式:电流&…...
[paddle] 非线性拟合问题的训练
利用paddlepaddle建立神经网络,模拟有限个数据的非线性拟合 本文仍然考虑 f ( x ) sin ( x ) x f(x)\frac{\sin(x)}{x} f(x)xsin(x) 函数在区间 [-10,10] 上固定数据的拟合。 import paddle import paddle.nn as nn import numpy as np import matplotlib.…...
Vue2: table加载树形数据的踩坑记录
table中需要加载树形数据,如图: 官网给了两个例子,且每个例子中的tree-props都是这么写的: :tree-props="{children: children, hasChildren: hasChildren}" 给我一种错觉,以为数据结构中要同时指定children和hasChildren字段,然而,在非懒加载模式下,数据结…...
全国计算机设计大赛大数据主题赛(和鲸赛道)经验分享
全国计算机设计大赛大数据主题赛(和鲸赛道)经验分享 这是“和鲸杯”辽宁省普通高等学校本科大学生计算机设计竞赛启动会汇报—大数据主题赛的文档总结。想要参加2025年此比赛的可以借鉴。 一、关于我 人工智能专业 计赛相关奖项: 2022年计…...
C# 设计模式(行为型模式):责任链模式
C# 设计模式(行为型模式):责任链模式 责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,用于让多个对象有机会处理同一个请求,避免请求发送者与接收者之间的耦合。它通过将请…...
人工智能之机器学习算法
所有的机器学习算法都是要优化的,优化的必要条件是确定优化的目标函数(损失函数),目标函数是根据实际问题(数据)转成的数学公式。 一.线性回归原理推导 (1)回归问题概述 在机器学习的有监督算法中,分类与回归二种情…...
17爬虫:关于DrissionPage相关内容的学习01
概述 前面我们已经大致了解了selenium的用法,DerssionPage同selenium一样,也是一个基于Python的网页自动化工具。 DrissionPage既可以实现网页的自动化操作,也能够实现收发数据包,也可以把两者的功能合二为一。 DressionPage的…...
Ubuntu如何安装jdk并切换到不同的jdk版本
参考:https://www.cnblogs.com/Jakson/articles/4615768.html 摘要 :因为ubuntu 会自带open-jdk预装在系统内,当我们需要在 ubuntu下 安装jdk 的时候 ,发现 即使配置好环境变量后 输入 java -version 版本还是依然没有发生变化,我们需要以下2个步骤切换/usr/local/…...
Python基础语法(上)
目录 一、print函数及常量表达式 1.print函数 2.常量表达式 二、变量 1.定义变量的规则 2.python的动态类型特性 3.字符串 三、注释 四、input函数 1.input函数 2.变量类型转换 五、运算符 1.算数运算符 2.关系运算符 (1)整形的比较 &am…...
k8s系列--docker拉取镜像导入k8s的containerd中
# 确认一下当前集群中正在运行的 Pod 和命名空间 kubectl get pods -A# 示例一:拉取并导入 CoreDNS 镜像 docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:v1.11.1 docker save registry.cn-hangzhou.aliyuncs.com/google_containers/cor…...
深入理解 Android 中的 ComponentInfo
深入理解 Android 中的 ComponentInfo 在 Android 开发中,ComponentInfo 是一个非常重要的类,它用于描述应用程序中的组件信息,包括 Activity、Service、BroadcastReceiver 和 ContentProvider。理解 ComponentInfo 的结构和使用方式&#x…...
阿里云 ECS 服务器绑定多个公网IP
阿里云 ECS 服务器绑定多个公网IP 一、弹性公网IP绑定ECS服务器 单台ECS一般只能直接绑定一个弹性公网IP,但是可以绑定多张弹性网卡,如果把弹性公网IP绑定到弹性网卡上,那么单台ECS就能间接绑定多个弹性公网IP。但有的服务器系统镜像可能不…...
模块化通讯管理机在物联网系统中的应用
安科瑞刘鸿鹏 摘要 随着能源结构转型和智能化电网的推进,电力物联网逐渐成为智能电网的重要组成部分。本文以安科瑞ANet系列智能通信管理机为例,探讨其在电力物联网中的应用,包括数据采集、规约转换、边缘计算、远程控制等技术实践&#…...
Kafka Offset explorer使用
Kafka集群配置好以后以后运维这边先用工具测试一下,便于rd展开后续的工作,本地调试时一般使用Offset explorer工具进行连接 使用SASL(Simple Authentication and Security Layer)验证方式 使用SCRAM-SHA-256(Salted Challenge Response Authentication…...
小程序学习07—— uniapp组件通信props和$emit和插槽语法
目录 一 父组件向子组件传递消息 1.1 props (a)传递静态或动态的 Prop (b)单向数据流 二 子组件通知父组件 2.1 $emit (a)定义自定义事件 (b)绑定自定义事件 三 插槽语法…...
行为模式1.模板方法模式
行为型模式 模板方法模式(Template Method Pattern)命令模式(Command Pattern)迭代器模式(Iterator Pattern)观察者模式(Observer Pattern)中介者模式(Mediator Pattern…...
【模型】Qwen2-VL 服务端UI
1. 前言 最近在测试VLM模型,发现官方的网页demo,代码中视频与图片分辨率可能由于高并发设置的很小,导致达不到预期效果,于是自己研究了一下,搞了一个简单的前端部署,自己在服务器部署了下UI界面࿰…...
ImageNet 2.0?自动驾驶数据集迎来自动标注新时代
引言: 3DGS因其渲染速度快和高质量的新视角合成而备受关注。一些研究人员尝试将3DGS应用于驾驶场景的重建。然而,这些方法通常依赖于多种数据类型,如深度图、3D框和移动物体的轨迹。此外,合成图像缺乏标注也限制了其在下游任务中的…...
京东一面:MySQL 主备延迟有哪些坑?主备切换策略
作为一名开发同学,大家对 MySQL 一定不陌生,像常见的 事务特性、隔离级别 、索引等也都是老生常谈。 今天,我们就来聊个深度话题,关于 MySQL 的 高可用 一、什么是高可用? 维基百科定义: 高可用性&#x…...
Linux(Ubuntu24.04)安装Eigen3库
本次安装Eigen3是在WSL2的Ubuntu24.04环境下进行。 Eigen3是一个C模板库,用于线性代数、矩阵运算和数值计算。它提供了一组高性能的矩阵和向量操作,以及常用的线性代数算法,如矩阵分解、特征值求解和最小二乘解等。 1、安装Eigen3 有两种安…...
ABP框架8——仓储的作用及其基础Demo
一、使用仓储的好处 1.提高CRUD接口复用性2.解耦业务逻辑(BLL)和增删改查(CRUD),换ORM特别方便,不需要改应用层,直接改仓储层3.做复杂查询4.事务支持 二、Demo public class BookRepository …...
【Multisim用74ls92和90做六十进制】2022-6-12
缘由Multisim如何用74ls92和90做六十进制-其他-CSDN问答 74LS92、74LS90参考...
利用KPaaS平台提升企业审批流程的透明度
企业的审批流程不仅影响决策效率,还直接关联到组织的透明度和运营效果。传统的审批流程通常由多个环节和系统构成,每一个环节都可能存在信息不对称的现象。例如,某一审批节点的负责人可能并不清楚当前的审批状态,而在其他环节&…...
Python 数据可视化的完整指南
目录 一、为什么选择 Python 进行数据可视化? 二、常用 Python 可视化库及其特点 三、常用图表类型及其代码示例 折线图:用于展示数据随时间或其他连续变量的变化趋势。 柱状图:用于比较不同类别的数据大小。 散点图:用于展示两个变量之间的关系,并发现数据中的模式…...
ZYNQ初识7(zynq_7010)RAM_IP核
学习汇总正点原子bi站教学视频。但由于目前的学习板PL端缺乏时钟晶振,所以需要从PS端调用时钟供给PL端使用,也就造成顶层文件的设置出现一些问题,在IP核创建调用和例化过程中一些功能会受到限制,所以以下仅作汇总参考。 zynq_7000…...
.e01, ..., .e0n的分卷压缩包怎么解压
用BandiZip,这些分卷压缩中还有一个.exe的文件,这个不是可执行文件,是一个解压缩的开头。 安装好bandiZip后,右键这个.exe文件 点击打开就是开始解压了: 最后解压后是这些。然后一个个再次解压....
linux网络管理
网络配置文件 网卡信息文件 :::color3 /etc/sysconfig/network-scripts ::: 配置描述DEVICE网卡设备名-必填BOOTPROTO必填:none,static(静态 IP),dhcp(动态 IP)HWADDRMAC 地址NM_CONTROLLED是否启用Network Manager图形管理工具,建议 noONBOOT是否默认…...
宽带、光猫、路由器、WiFi、光纤之间的关系
1、宽带(Broadband) 1.1 宽带的定义宽带指的是一种高速互联网接入技术,通常包括ADSL、光纤、4G/5G等不同类型的接入方式。宽带的关键特点是能够提供较高的数据传输速率,使得用户可以享受到稳定的上网体验。 1.2 宽带的作用宽带是…...
Momentum Contrast for Unsupervised Visual Representation Learning论文笔记
文章目录 论文地址动量队列对比学习的infoNCE loss为什么需要动量编码器对比学习moco方法中的动量Encoder为什么不能与梯度Encoder完全相同为什么动量编码器和梯度编码器不能完全相同?总结: 我理解,正负样本应该经过同一个encoder,…...
linux-26 文件管理(四)install
说一个命令,叫install,man install,install是什么意思?安装,install表示安装的意思,那你猜install是用来干什么的?猜一猜干什么的?安装软件,安装第三方软件,错…...
day-104 组合总和 Ⅳ
思路 动态规划 解题过程 假设dfs(target)表示组成target的组合数,可得转换方程dfs(target)dfs(target-nums[0])dfs(target-nums[1])…以此类推 注意:nums[i]需要小于等于当前的target Code class Solution {public int combinationSum4(int[] nums, i…...
Gitlab-runner 修改默认的builds_dir并使用custom_build_dir配置
gitlab-runner 修改默认的builds_dir并使用custom_build_dir配置 1. 说明2. 实操(以docker执行器为例)2.1 修改默认的builds_dir2.1.1 调整gitlab-runner的配置文件2.1.2 CI文件 2.2 启用custom_build_dir2.2.1 调整gitlab-runner的配置文件2.2.2 CI文件…...
代码随想录算法训练营day21
代码随想录算法训练营 —day21 文章目录 代码随想录算法训练营前言一、669. 修剪二叉搜索树递归法迭代法 二、108.将有序数组转换为二叉搜索树递归法迭代法 三、538.把二叉搜索树转换为累加树递归法 总结 前言 今天是算法营的第21天,希望自己能够坚持下来…...
苹果系统MacOS下ObjectC建立的App程序访问opencv加载图片程序
前言 苹果系统下使用opencv感觉还是有些不太方便,总是感觉有点受到限制。本博客描述的是在MacOS下建立App程序然后调用opencv显示图片时出现的一些问题并最后解决的一个过程。 一、程序的建立 选择程序的类型: 选择界面模式和编程语言: 其余…...
滴滴工作流引擎Turbo与logicFlow研究
目录 logicFlow turbo 工作流引擎很多,也都提供了前端UI库,但是太过于冗杂了,元数据表都几十个,logincFlow和Turbo的组合提供了轻量化方式,turbo后端代码只有5个元数据表,logicFlow也提供了bpm的相关扩展功能,但缺点是turbo社区不活跃,logicFlow个人认为跟echarts这种…...
快速将索尼手机联系人导出为 HTML 文件
我想将 Sony Xperia 手机上的联系人导出到计算机上进行备份,并在需要时进行编辑。这可以做到吗?如何做到?作为助手我需要下载什么工具吗? 当您的 Android 手机上存储了如此多的重要联系人,而您又不想丢失它们时&#…...
长时间序列预测算法---Informer
目录 一、传统的 Transformer 模型二、Informer原理2.1 Attention计算2.2 “积极”的Q筛选2.2.1 KL散度2.2.2 “懒惰”的q处理 2.3 Encoder结构2.4 Decoder结构2.4.1 Transformer的Decoder操作2.4.2 Informer的Decoder操作 2.5 Informer模型的改进 三、模型应用 时间序列相关参…...
深入理解连接池:从数据库到HTTP的优化之道
在现代应用开发中,高效的资源管理是关键,其中连接池(Connection Pool)技术起到了至关重要的作用。本文将带你深入了解连接池的概念及其在数据库和HTTP通信中的应用,结合 JDBC 与 Druid 的关系,以及 HttpURL…...
LLM(十二)| DeepSeek-V3 技术报告深度解读——开源模型的巅峰之作
近年来,大型语言模型(LLMs)的发展突飞猛进,逐步缩小了与通用人工智能(AGI)的差距。DeepSeek-AI 团队最新发布的 DeepSeek-V3,作为一款强大的混合专家模型(Mixture-of-Experts, MoE&a…...
IIS设置IP+端口号外网无法访问的解决方案
在IIS将站点设置为IP端口访问,假设端口为8080,设好后,服务器上可以访问,外网无法访问。 通常是端口8080没有加入【入站规则】的缘故,将8080端口加入【入站规则】即可,操作如下: 一、ctrlr 输入 …...
Leetcode 最大正方形
java 实现 class Solution {public int maximalSquare(char[][] matrix) {//处理特殊情况if(matrix null || matrix.length 0 || matrix[0].length 0) return 0;int rows matrix.length;int cols matrix[0].length;int[][] dp new int[rows][cols]; //dp[i][j]的含义是以…...
数据结构与算法之动态规划: LeetCode 3105. 最长的严格递增或递减子数组 (Ts版)
最长的严格递增或递减子数组 https://leetcode.cn/problems/longest-strictly-increasing-or-strictly-decreasing-subarray/description/ 描述 给你一个整数数组 nums返回数组 nums 中 严格递增 或 严格递减的最长非空子数组的长度 示例 1 输入:nums [1,4,3,…...