【QT】常用控件 【多元素类 | 容器类 | 布局类】

🌈 个人主页:Zfox_
🔥 系列专栏:Qt

目录
- 一:🔥 QT 常用控件【多元素类】
- 🦋 List Widget -- 列表
- 🦋 Table Widget -- 表格
- 🦋 Tree Widget -- 树形
- 二:🔥 QT 常用控件【容器类】
- 🦋 Group Box -- 分组框
- 🦋 Tab Widget -- 标签页
- 三:🔥 QT 常用控件【布局类】
- 🦋 垂直布局
- 🎀 【使用 QVBoxLayout 管理多个控件】
- 🎀 【创建两个 QVBoxLayout】
- 🦋 水平布局
- 🎀【使用 QHBoxLayout 管理控件】
- 🎀【嵌套的 layout】
- 🦋 网格布局
- 🎀 【使用 QGridLayout 管理元素】
- 🎀 【设置 QGridLayout 中元素的大小比例】
- 🎀 【设置垂直方向的拉伸系数】
- 🦋 表单布局
- 🦋 Space
- 四:🔥 共勉
一:🔥 QT 常用控件【多元素类】
🚇 Qt 中提供的多元素控件有:
- QListWidget
- QListView
- QTableWidget
- QTableView
- QTreeWidget
- QTreeView
xxWidget 和 xxView 之间的区别
以 QTableWidget 和 QTableView 为例
QTableView 是基于 MVC 设计的控件
-
MVC:M(model) 数据,V(view) 界面,C(controller)控制器 数据和视图之间的业务流程
-
QTableView 自身不持有数据,使用 QTableView 的时候需要用户创建一个 Model 对象(比如 QStandardModel),并且把 Model 和 QTableView 关联起来。
-
后续修改 Model 中的数据就会影响 QTableView 的显示,修改 QTableView 的显示也会影响到 Model 中的数据(双向绑定)。
QTableWidget
是 QTableView
的子类,对 QTableView
进行了扩展,将 Model 进行了封装,不需要用户手动创建 Model 对象,直接就可以往 QTableWidget
中添加数据了。
🦋 List Widget – 列表
使用 QListWidget 能够显示一个纵向的列表组件。形如:
核心属性 | 说明 |
---|---|
currentRow | 当前被选中的是第几行 |
count | 一共有多少行 |
sortingEnabled | 是否允许排序 |
isWrapping | 是否允许换行 |
itemAlignment | 元素的对齐方式 |
selectRectVisible | 被选中的元素矩形是否可见 |
spacing | 元素之间的间隔 |
核心方法 | 说明 |
---|---|
addItem(const QString& label) addItem(QListWidgetItem *item) | 列表中添加元素 |
currentItem() | 返回 QListWidgetItem* 表示当前选中的元素 |
setCurrentItem(QListWidgetItem* item) | 设置选中哪个元素 |
setCurrentRow(int row) | 设置选中第几行的元素 |
insertItem(const QString& label, int row) insertItem(QListWidgetItem *item, int row) | 在指定的位置插入元素 |
item(int row) | 返回 QListWidgetItem* 表示第 row 行的元素 |
takeItem(int row) | 删除指定行的元素, 返回 QListWidgetItem* 表示是哪个元素被删除了 |
核心信号 | 说明 |
---|---|
currentItemChanged(QListWidgetItem* current, QListWidgetItem* old) | 选中不同元素时会触发. 参数是当前选中的元素和之前选中的元素 |
currentRowChanged(int) | 选中不同元素时会触发. 参数是当前选中元素的行数 |
itemClicked(QListWidgetItem* item) | 点击某个元素时触发 |
itemDoubleClicked(QListWidgetItem* item) | 双击某个元素时触发 |
itemEntered(QListWidgetItem* item) | 鼠标进入元素时触发 |
在上述介绍中涉及到⼀个关键的类:QListWidgetItem,这个类表示 QListWidget
中的一个元素。核心方法如下,本质上就是⼀个 “文本+图标” 构成的
- setFont: 设置字体
- setIcon: 设置图标
- setHidden: 设置隐藏
- setSizeHint: 设置尺寸
- setSelected: 设置是否选中
- setText: 设置文本
- setTextAlignment: 设置文本对齐方式
这些方法允许我们自定义 Q List Widget Item 的外观和行为。
通过结合使用 QListWidget 的属性、方法和信号,以及 QListWidgetItem
的方法,可以创建高度定制化的列表控件。
使用 ListWidget
(1)在界面上创建一个 ListView,右键 => 变形为 => ListWidget,再创建一个 lineEdit 和两个按钮
注意:
- ListWidget 是 ListView 的子类,功能比 ListView 更丰富。
- 我们使用 ListWidget 即可。
(2)编写 widget.cpp,在构造函数中添加初始元素 或者 直接在图形化界面选择 “编辑项目”,编写 listWidget 的 slot 函数,然后编写按钮的 slot 函数
- 此处编写 listWidget 的 slot 函数:需要判定 current 和 previous 非空,初始情况下是没有元素选中的,就导致这两个指针可能是 NULL。
- 注意:这里需要给 widget.h 前⾯加上 #include ,不然会出现报错
结果如下:
🦋 Table Widget – 表格
使用 QTableWidget 表示一个表格控件。一个表格中包含若干行,每一行又包含若干列。
表格中的每个单元格,是一个 QTableWidge tItem
对象。
QTableWidget 核心方法
方法 | 说明 |
---|---|
item(int row, int column) | 根据行数列数获取指定的 QTableWidgetItem* |
setItem(int row, int column, QTableWidgetItem*) | 根据行数列数设置表格中的元素 |
currentItem() | 返回被选中的元素 QTableWidgetItem* |
currentRow() | 返回被选中元素是第几行 |
currentColumn() | 返回被选中元素是第几列 |
row(QTableWidgetItem*) | 获取指定 item 是第几行 |
column(QTableWidgetItem*) | 获取指定 item 是第几列 |
rowCount() | 获取行数 |
columnCount() | 获取列数 |
insertRow(int row) | 在第 row 行处插入新行 |
insertColumn(int column) | 在第 column 列插入新列 |
removeRow(int row) | 删除第 row 行 |
removeColumn(int column) | 删除第 column 列 |
setHorizontalHeaderItem(int column, QTableWidgetItem*) | 设置指定列的表头 |
setVerticalHeaderItem(int row, QTableWidgetItem*) | 设置指定行的表头 |
QTableWidget tltem 核心信号
核心信号 | 说明 |
---|---|
cellClicked(int row, int column) | 点击单元格时触发 |
cellDoubleClicked(int row, int column) | 双击单元格时触发 |
cellEntered(int row, int column) | 鼠标进入单元格时触发 |
currentCellChanged(int row, int column, int previousRow, int previousColumn) | 选中不同单元格时触发 |
QTableWidget tltem 核心方法
核心方法 | 说明 |
---|---|
row() | 获取当前是第几行 |
column() | 获取当前是第几列 |
setText(const QString&) | 设置文本 |
setTextAlignment(int) | 设置文本对齐 |
setIcon(const QIcon&) | 设置图标 |
setSelected(bool) | 设置被选中 |
setSizeHint(const QSize&) | 设置尺寸 |
setFont(const QFont&) | 设置字体 |
可以通过这些 属性和方法来动态地添加、移除或修改表格内容,以及定制单元格的表现形式,包括文本、对齐方式、图标等。
同时,利用信号可以实现用户交互逻辑,如当用户点击或双击单元格时执行特定的操作。
使用 TableWidget
(1)在界面上创建 QTableWidget 和 四个按钮,一个输入框
- 注意:
QTableWidget
是QTableView
的子类,功能比QTableView
更丰富。我们使用QTableWidget
即可。
- lineEdit 的文本是 右下角的 PlaceholderText 里设置的
(2)编写 widget.cpp 构造函数,构造表格中的初始数据
(3)编写对应按钮的槽函数
(4)执行程序,即可完成表格的基本操作
- 默认情况下,单元格中的内容直接就是可编辑的。
- 如果不想让用户编辑,可以设置
ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);
🦋 Tree Widget – 树形
使用 QTreeWidget
(树整体 的管理) 表示一个树形控件,里面的每个元素都是一个 QTreeWidge tItem(选中的 某个节点 管理),每个 QTreeWidgetItem 可以包含多个文本和图标,每个文本 / 图标为一个列
- 虽然
QTreeWidget
是树形结构,但是这个树形结构没有体验出根节点的,是从根节点的下一次子节点开始 - 可以给
QTreeWidget
设置顶层节点(顶层节点可以有多个),然后再给顶层节点添加子节点,从而构成树形结构。
QTreeWidget 核心方法
核心方法 | 说明 |
---|---|
clear() | 清空所有子节点 |
addTopLevelItem(QTreeWidgetItem* item) | 新增顶层节点 |
topLevelItem(int index) | 获取指定下标的顶层节点 |
topLevelItemCount() | 获取顶层节点个数 |
indexOfTopLevelItem(QTreeWidgetItem* item) | 查询指定节点是顶层节点中的下标 |
takeTopLevelItem(int index) | 删除指定的顶层节点,返回 QTreeWidgetItem* 表示被删除的元素 |
currentItem() | 获取当前选中的节点,返回 QTreeWidgetItem* |
setCurrentItem(QTreeWidgetItem* item) | 选中指定节点 |
setExpanded(bool) | 展开/关闭节点 |
setHeaderLabel(const QString& text) | 设置 TreeWidget 的 header 名称 |
QTreeWidget 核心信号
核心信号 | 说明 |
---|---|
currentItemChanged(QTreeWidgetItem* current, QTreeWidgetItem* old) | 切换选中元素时触发 |
itemClicked(QTreeWidgetItem* item, int col) | 点击元素时触发 |
itemDoubleClicked(QTreeWidgetItem* item, int col) | 双击元素时触发 |
itemEntered(QTreeWidgetItem* item, int col) | 鼠标进入时触发 |
itemExpanded(QTreeWidgetItem* item) | 元素被展开时触发 |
itemCollapsed(QTreeWidgetItem* item) | 元素被折叠时触发 |
QTreeWidget tltem 核心属性
属性 | 说明 |
---|---|
text | 持有的文本 |
textAlignment | 文本对齐方式 |
icon | 持有的图标 |
font | 文本字体 |
hidden | 是否隐藏 |
disabled | 是否禁用 |
expanded | 是否展开 |
sizeHint | 尺寸大小 |
selected | 是否选中 |
QTreeWidget tltem 核心信号
方法 | 说明 |
---|---|
addChild(QTreeWidgetItem* child) | 新增子节点 |
childCount() | 子节点的个数 |
child(int index) | 获取指定下标的子节点,返回 QTreeWidgetItem* |
takeChild(int index) | 删除对应下标的子节点 |
removeChild(QTreeWidgetItem* child) | 删除对应的子节点 |
parent() | 获取该元素的父节点 |
通过上述提供的方法和信号,可以创建、管理和操作树形结构的数据,并响应用户的交互。QTreeWidgetItem
提供了更多的细粒度控制,允许 定制每个项的表现形式和行为。
使用 TreeWidget
(1)在界面上创建一个 TreeView,右键 => 变形为 => TreeWidget,再创建一个 lineEdit 和两个按钮
- 注意:TreeWidget 是 TreeView 的子类,功能比 TreeView 更丰富。我们使用 TreeWidget 即可。
(2)编写代码,构造初始数据
(3)编写代码,实现按钮的 slot 函数
(4)执行程序,可以针对树形框进行编辑,如下:
二:🔥 QT 常用控件【容器类】
🦋 Group Box – 分组框
使用 QGroupBox
实现一个带有标题的分组框,可以把其他的控件放到里面作为一组,这样看起来能更好看一点。
注意:不要把 QGroupBox 和 QButtonGroup 混淆(之前在介绍 QRadionButton 的时候提到了 QButtonGroup)。
属性 | 说明 |
---|---|
title | 分组框的标题 |
alignment | 分组框内部内容的对齐方式 |
flat | 是否是 “扁平” 模式;设置为 true 时,分组框将不显示边框,呈现扁平化外观 |
checkable | 是否可选择;设为 true ,则在 title 前方会多出一个可勾选的部分 |
checked | 描述分组框的选择状态(前提是 checkable 为 true ) |
- 分组框 只是一个用来 “美化界面” 这样的组件,并不涉及到用户交互和业务逻辑,属于 “锦上添花"。
使用 Group Box
在界面上创建两个分组框,并且在分组框内部创建下拉框和微调框
- 注意:在复制粘贴控件的时候,一定要先选中对应的父控件,再粘贴
🦋 Tab Widget – 标签页
使用 QTabWidget
实现一个带有标签页的控件,可以往里面添加一些 widget,进一步的就可以通过标签页切换。
属性 | 说明 |
---|---|
tabPosition | 标签页所在的位置: - North 上方 - South 下方 - West 左侧 - East 右侧 |
currentIndex | 当前选中了第几个标签页(从0开始计算) |
currentTabText | 当前选中的标签页的文本 |
currentTabName | 当前选中的标签页的名字 |
currentTabIcon | 当前选中的标签页的图标 |
currentTabToolTip | 当前选中的标签页的提示信息 |
tabsClosable | 标签页是否可以关闭 |
movable | 标签页是否可以移动 |
信号 | 说明 |
---|---|
currentChanged(int) | 在标签页发生切换时触发,参数为被点击的选项卡编号。 |
tabBarClicked(int) | 在点击选项卡的标签条的时候触发,参数为被点击的选项卡编号。 |
tabBarDoubleClicked(int) | 在双击选项卡的标签条的时候触发,参数为被点击的选项卡编号。 |
tabCloseRequested(int) | 在标签页关闭请求时触发,参数为被请求关闭的选项卡编号。 |
使用标签页管理多组控件
(1)在界面上创建一个 QTabWidget 和两个按钮
注意 :
- QTabWidget 中的每个标签页都是⼀个 QWidget
- 点击标签页就可以直接切换
- 右键 QTabWidget,可以添加标签页或者删除标签页
(2)编写 widget.cpp,进行初始化,给标签页中放个简单的 label
- 注意新创建的 label 的父元素,是 ui->tab 和 ui->tab_2
- Qt 中使用父子关系决定该控件 “在哪里”
然后再编写按钮的 slot 函数 和 QTabWidget 的 currentChanged
函数
- 使用 count() 获取到标签页的个数
- 使用 addTab 新增标签页
- 使用 removeTab 删除标签页
- 使用 currentIndex 获取到当前标签页的下标
- 使用 setCurrentIndex 切换当前标签页
(3)运行程序
- 点击新建标签页,可以创建出新的标签
- 点击删除当前标签页,可以删除标签
- 切换标签页时,可以看到 qDebug 打印出的标签页编号
三:🔥 QT 常用控件【布局类】
-
之前使用 Qt 在界面上创建的控件都是通过 “绝对定位” 的方式来设定的,也就是每个控件所在的位置都需要计算坐标,最终通过 setGeometry 或者 move 方式摆放过去
-
这种设定方式其实并不方便,尤其是界面如果 内容比较多,不好计算,而且一个窗口大小往往是可以调整的,按照绝对定位的方式,也无法自适应窗口大小。
-
因此 Qt 引入 “布局管理器”(Layout)机制 来解决上述问题。
当然,布局管理器并非 Qt 独有。其他的 GUI 开发框架,像 Android、前端等也有类似的机制。
🦋 垂直布局
🎢 使用 QVBoxLayout 表示垂直的布局管理器,V 是 vertical 的缩写。
属性 | 说明 |
---|---|
layoutLeftMargin | 左侧边距,设置或获取布局内容与容器左边界的距离 |
layoutRightMargin | 右侧边距,设置或获取布局内容与容器右边界的距离 |
layoutTopMargin | 上方边距,设置或获取布局内容与容器上边界的距离 |
layoutBottomMargin | 下方边距,设置或获取布局内容与容器下边界的距离 |
layoutSpacing | 相邻元素之间的间距,设置或获取布局中各元素之间的默认间隔 |
Layout 只是用于界面布局,并没有提供信号
🎀 【使用 QVBoxLayout 管理多个控件】
编写代码,创建布局管理器和三个按钮,并且把按钮添加到布局管理器中
- 使用 addWidget 把控件添加到布局管理器中
- 使用 setLayout 设置该布局管理器到 widget 中
- 可以看到此时界面上的按钮就存在于布局管理器中,随着窗口尺存变化而发生改变。
- 此时的三个按钮的尺存和位置都是自动计算出来的。
🎀 【创建两个 QVBoxLayout】
🔥 在上面通过上述代码的方式,只能给这个 widget 设定一个布局管理器。实际上也可以通过 Qt Design 在一个窗口中创建多个布局管理器,如下操作:
(1)在界面上创建两个 QVBoxLayout
,每个 QVBoxLayout
各放三个按钮
(2)运行程序
- 可以看到这些按钮已经自动排列好,只不过当前这些按钮的位置不能随着窗口大小自动变化。
通过 Qt Designer
创建的布局管理,其实是先创建了一个 widget,设置过 geometry 属性的,再把这个 layout 设置到这个 widget 中
- 实际上,一个 widget 只能包含一个 layout。
- 打开 ui 文件的原始 xml,可以看到其中的端倪。这种情况下 layout 并非是窗口 widget 的布局管理器,因此不会随着窗口大小改变。
🦋 水平布局
使用 QHBoxLayout 表示垂直的布局管理器,H 是 horizontal 的缩写。
- 核心属性(和 QVBoxLayout 属性是一致的)
属性 | 说明 |
---|---|
layoutLeftMargin | 左侧边距 |
layoutRightMargin | 右侧边距 |
layoutTopMargin | 上方边距 |
layoutBottomMargin | 下方边距 |
layoutSpacing | 相邻元素之间的间距 |
🎀【使用 QHBoxLayout 管理控件】
编写代码,创建布局管理器和三个按钮,并且把按钮添加到布局管理器中,并且运行
- 可以看到此时界面上的按钮就存在于布局管理器中,随着窗口尺寸变化而发生改变。
- 此时的三个按钮的尺存和位置都是自动计算出来的
Layout 里面可以再嵌套上其他的 layout,从而达到更复杂的布局效果
🎀【嵌套的 layout】
在代码中创建以下内容,使用 addLayout
给 layout 中添加子 layout,并且运行程序
结论:结合 QHBoxLayout 和 QVBoxLayout, 就可以做出各种复杂的界面了
🦋 网格布局
Qt 中还提供了 QGridLayout 用来实现网格布局的效果,可以达到 *M * N* 的这种网格的效果。
属性 | 说明 |
---|---|
layoutLeftMargin | 左侧边距 |
layoutRightMargin | 右侧边距 |
layoutTopMargin | 上方边距 |
layoutBottomMargin | 下方边距 |
layoutHorizontalSpacing | 相邻元素之间水平方向的间距 |
layoutVerticalSpacing | 相邻元素之间垂直方向的间距 |
layoutRowStretch | 行方向的拉伸系数 |
layoutColumnStretch | 列方向的拉伸系数 |
整体和 QVBoxLayout
以及QHBoxLayout
相似
但是设置 spacing 的时候是按照垂直水平两个方向来设置的。
🎀 【使用 QGridLayout 管理元素】
代码中创建 QGridLayout 和 4 个按钮
- 使用 addWidget 添加控件到布局管理器中,但是添加的同时会指定两个坐标,表示放在第几行,第几列。
- 当然如果调整行列坐标全部为0的话,那么这四个按钮都在一行,就相当于 QHBoxLayout
注意 :
- 设置行和列的时候,如果设置的是一个很大的值,但是这个值和上一个值之间并没有其他的元素,那么并不会在中间腾出额外的空间
- 比如:把 button4 设置在第 100 行,但是由于 3-99 行没有元素,因此 button4 仍然会紧挨在 button3 下方看起来和上面的 0 1 2 3 的情况是相同的。
🎀 【设置 QGridLayout 中元素的大小比例】
创建 6 个按钮,按照 2 行 3 列的方式排列,使用 setColumnStretch
设置每一列的拉伸系数:
- 另外,QGridLayout 也提供了
setRowStretch
设置行之间的拉伸系数 - 上述案例中,直接设置
setRowStretch
效果不明显,因为每个按钮的高度是固定的。 - 需要把按钮的垂直方向的 sizePolicy 属性设置为
QSizePolicy::Expanding
尽可能填充满布局管理器,才能看到效果。
如果拉伸系数设为 0,意思是不参与拉伸,此时按钮的宽度是固定值。
🎀 【设置垂直方向的拉伸系数】
编写代码, 创建 6 个按钮, 按照 3 行 2 列方式排列,使用 setSizePolicy 设置按钮的尺寸策略,可选的值如下:
- QSizePolicy::Ignored:忽略控件的尺寸,不对布局产生影响。
- QSizePolicy::Minimum:控件的最小尺寸为固定值,布局时不会超过该值。
- QSizePolicy::Maximum:控件的最大尺寸为固定值,布局时不会小于该值。
- QSizePolicy::Preferred:控件的理想尺寸为固定值,布局时会尽量接近该值。
- QSizePolicy::Expanding:控件的尺寸可以根据空间调整,尽可能占据更多空间。
- QSizePolicy::Shrinking:控件的尺寸可以根据空间调整,尽可能缩小以适应空间。
此时的按钮垂直方向都舒展开了,并且调整窗口尺寸,也会按照设定的比例同步变化。
💡 结论:
-
总的来说,使用
QGridLayout
能够代替很多QHBoxLayout
和QVBoxLayout
嵌套的场景。毕竟嵌套的代码写起来是比较麻烦的。 -
另外不要忘了,
QGridLayout
里面也能嵌套QHBoxLayout
和QVBoxLayout
,QHBoxLayout
和QVBoxLayout
里面也能嵌套QGridLayout
-
灵活使用上述布局管理器就可以实现出任意的复杂界面。
🦋 表单布局
除了上述的布局管理器之外,Qt 还提供了 QFormLayout,属于是 QGridLayout 的特殊情况,专门用于实现两列表单的布局。
这种表单布局多用于让用户 填写信息的场景,左侧列为提示,右侧列为输入框
【使用 QFormLayout 创建表单】
编写代码,创建 QFormLayout
,以及两个 label 和两个 lineEdit
- 使用 addRow 方法来添加一行,每行包含两个控件。
- 第一个控件固定是 QLabel / 文本,第二个控件则可以是任意控件。
- 如果把第⼀个参数填写为
NULL
,则什么都不显示。
🦋 Space
使用布局管理器的时候,可能需要在控件之间添加一段空白,就可以使用 QSpacerItem
来表示。
属性 | 说明 |
---|---|
width | 宽度 |
height | 高度 |
hData | 水平方向的 sizePolicy - QSizePolicy::Ignored: 忽略控件的尺寸,不对布局产生影响。 - QSizePolicy::Minimum: 控件的最小尺寸为固定值,布局时不会超过该值。 QSizePolicy::Maximum: 控件的最大尺寸为固定值,布局时不会小于该值。 QSizePolicy::Preferred: 控件的理想尺寸为固定值,布局时会尽量接近该值。 QSizePolicy::Expanding: 控件的尺寸可以根据空间调整,尽可能占据更多空间。 QSizePolicy::Shrinking: 控件的尺寸可以根据空间调整,尽可能缩小以适应空间。 |
vData | 垂直方向的 sizePolicy 选项同上。 |
- 注意:上述属性在构造函数设置即可
【创建一组左右排列的按钮】
在界面上创建一个 QVBoxLayout
,并添加两个按钮,在上面运行结果中我们可以知道这个肯定是紧挨的,但是如果在两个按钮中间添加一个 spacer,会咋样呢,如下:
- 在 Qt Designer 中,也可以直接给界面上添加 spacer:
四:🔥 共勉
😋 以上就是我对 【QT】常用控件 【多元素类 | 容器类 | 布局类】
的理解, 觉得这篇博客对你有帮助的,可以点赞收藏关注支持一波~ 😉
相关文章:
【QT】常用控件 【多元素类 | 容器类 | 布局类】
🌈 个人主页:Zfox_ 🔥 系列专栏:Qt 目录 一:🔥 QT 常用控件【多元素类】 🦋 List Widget -- 列表🦋 Table Widget -- 表格🦋 Tree Widget -- 树形 二:&#x…...
uniapp实现图文聊天功能
Uniapp 实现图文聊天功能 下面我将介绍如何在 Uniapp 中实现一个基本的图文聊天功能,包括消息发送、接收和展示。 一、准备工作 创建 Uniapp 项目准备后端接口(可以使用云开发、自己的服务器或第三方服务) 二、实现步骤 1. 页面结构 &l…...
【场景应用9】多语言预训练语音模型进行自动语音识别
一、理论介绍 “多语言预训练语音模型进行自动语音识别”这个模块是近年来语音识别(ASR, Automatic Speech Recognition)领域非常重要的发展方向。下面我来为你系统地讲解这个模块的基础理论与算法流程,尤其聚焦在如 wav2vec 2.0 multilingual、XLSR(cross-lingual speech…...
华为HCIE-openEuler认证:能否成为国产操作系统领域的技术稀缺人才?
HCIE-openEuler是华为面向开源操作系统领域的高级专家认证,聚焦openEuler系统的深度运维、性能调优与生态集成。作为华为鲲鹏计算生态的核心技术栈,该认证要求持证者具备从底层内核优化到上层云原生适配的全栈能力。以下从技术能力、实验设计、行业适配三…...
Uniapp:列表选择提示框
目录 一、出现场景二、效果展示三、具体使用 一、出现场景 在项目的开发过程中,有这样一种场景,就是点击按钮走后续的逻辑之前还需要选择前提条件,就一个条件的情况下如果使用弹出框就显示比较多余,列表选择提示框刚好能够满足我…...
uni-app 开发安卓 您的应用在运行时,向用户索取(定位、相机、存储)等权限,未同步告知权限申请的使用目的,不符合相关法律法规要求
您的应用在运行时,向用户索取(定位、相机、存储)等权限,未同步告知权限申请的使用目的,不符合相关法律法规要求。 测试步骤:1、 工作台 -打卡,申请定位权限;2、工作台-设置-编辑资料-更换头像,申请相机、存 储权限。 修改建议:APP在申请敏感权限时,应同步说明权限申…...
李宏毅NLP-4-语音识别part3-CTC
Connectionist Temporal Classification|CTC 基于连接主义时间分类(CTC)的语音识别架构,具体描述如下: 输入层:底部的 x 1 , x 2 , x 3 , x 4 x^1, x^2, x^3, x^4 x1,x2,x3,x4代表输入的语音信号分帧数据…...
基于.NET后端实现图片搜索图片库 核心是计算上传图片与库中图片的特征向量相似度并排序展示结果
基于.NET 后端实现图片搜索图片库的方案,核心是计算上传图片与库中图片的特征向量相似度并排序展示结果。 整体思路 图像特征提取:使用深度学习模型(如 ResNet)提取图片的特征向量。特征向量存储:将图片的特征向量存…...
数据中台(大数据平台)之数据仓库建设
数据中台作为企业数据管理的核心枢纽,应支持并促进企业级数据仓库的建设,确保数据的有效整合、治理和高效应用。在建设数据仓库的过程中,设计和规划显得尤为重要,需要深入理解业务需求,制定合理的技术架构,…...
设计模式之工厂模式(factory pattern):在商品对象创建系统中的应用
目录 一、设计思路 1. 简单工厂模式 2. 工厂方法模式 3. 抽象工厂模式 二、UML类图(PlantUML格式) 1.简单工厂模式 2.工厂方法模式 3.抽象工厂模式 三、实现过程与结果 1. 简单工厂模式 2. 工厂方法模式 3. 抽象工厂模式 四、总结 在面向对…...
在ubuntu20.04+系统部署VUE及Django项目的过程记录——以腾讯云为例
目录 1. 需求2. 项目准备3. VUE CLI项目部署3.1 部署前的准备3.1.1 后端通信路由修改3.1.2 导航修改 3.2 构建项目3.3 配置nginx代理 4. 后端配置4.1 其他依赖项4.2 单次执行测试4.3 创建Systemd 服务文件4.4 配置 Nginx 作为反向代理 5. 其他注意事项 1. 需求 近期做一些简单…...
解决前端vue项目在linux上,npm install,node-sass 安装失败的问题
Unable to save binary /var/lib/jenkins/workspace/xxx/node_modules/node-sass/vendor/linux-x64-72 : Error: EACCES: permission denied, mkdir ‘/var/lib/jenkins/workspace/x/node_modules/node-sass/vendor’ 这个是node-sass安装失败导致的。 #将npm的默认仓库更改为…...
FPGA_YOLO(四)用HLS实现循环展开以及存储模块
Vivado HLS(High-Level Synthesis,高层次综合)是赛灵思(Xilinx)在其 Vivado 设计套件 中提供的一款工具,用于将 高级编程语言(如 C、C、SystemC) 直接转换为 硬件描述语言࿰…...
用户组与用户
用户组管理: 创建用户组: groupadd 用户组名 删除用户组: groupdel 用户组名 用户管理: 创建用户 useradd [-g -d] 用户名 -g:指定用户的组 -d:指定用户的home路径,如果不加上&…...
npm install 报错常见的解决方法
npm install 报错的情况有很多种,每种错误的具体解决方案也有所不同。这里我将汇总一些常见的npm install报错及其解决办法: 1. 下载速度慢/网络问题 解决办法:更换npm包的镜像源至国内镜像,如淘宝npm镜像:npm confi…...
暂存一下等会写
#include<easyx.h> IMAGE SNOW 图形变量 struct MOVE生存结构体 {int x0;int y0; bool livefalse;}; initgraph(800, 800);初始化图形界面 MOVE snowflake[5000];目标数量 loadimage(&SNOW, "snow.png");加载图片 BeginBatchDraw(); 开始批量绘图。…...
C语言 —— 指尖跃迁 刻印永恒 - 文件操作
目录 1. 什么是文件 1.1 程序文件 1.2 数据文件 1.3 文件名 2. 二进制文件和文本文件 3. 文件的打开与关闭 3.1 流和标准流 3.2 文件指针 3.3 文件的打开与关闭 fopen fclose 4. 文件的顺序读写 4.1 fgetc和fputc fgetc fputc 4.2 fgets和fputs fgets fputs…...
第二章 DQL查询语句
第一章:基础查询 一、SELECT 语句 作用 SELECT 语句用于从数据库中选取数据。 结果被存储在一个结果表中,称为结果集。 语法 SELECT column1, column2, … FROM table_name; 与 SELECT * FROM table_name; 参数说明: column1, column2, …...
系统与网络安全------弹性交换网络(1)
资料整理于网络资料、书本资料、AI,仅供个人学习参考。 Trunk原理与配置 Trunk原理概述 Trunk(虚拟局域网中继技术)是指能让连接在不同交换机上的相同VLAN中的主机互通。 VLAN内通信 实现跨交换的同VLAN通信,通过Trunk链路&am…...
有哪些哲学流派适合创业二
好的,让我们更深入地探讨如何将哲学与数学深度融合,构建一套可落地的创业操作系统。以下从认知框架、决策引擎、执行算法三个维度展开,包含具体工具和黑箱拆解: 一、认知框架:用哲学重构商业本质 1. 本体…...
Python(18)Python中JSON的妙用:详解序列化与反序列化原理及实战案例
目录 一、背景:为什么Python需要JSON?二、核心技术解析:序列化与反序列化2.1 核心概念2.2 类型映射对照表 三、Python操作JSON的四大核心方法3.1 基础方法库3.2 方法详解1. json.dumps()2. json.loads()3. json.dump()4. json.load() 四、实战…...
Nautilus 正式发布:为 Sui 带来可验证的链下隐私计算
作为 Sui 安全工具包中的强大新成员,Nautilus 现已上线 Sui 测试网。它专为 Web3 开发者打造,支持保密且可验证的链下计算。Nautilus 应用运行于开发者自主管理的可信执行环境(Trusted Execution Environment,TEE)中&a…...
投资理财_从0到1:如何用1000元开启你的二级市场投资之旅?
投资理财_从0到1:如何用1000元开启你的二级市场投资之旅? 一、前言:投资不是赌博,而是科学与艺术的结合1.1 为什么学习二级市场投资?1.2 本篇博客的目标 二、投资的基本概念:先搞清楚“玩的是什么”2.1 二级…...
有没有适合企业用的局域网即时通讯聊天工具?
随着信息安全问题的日益凸显,用户对于即时通讯工具的安全性与隐私保护提出了更高的要求。 强大的即时通讯能力 BeeWorks提供了专业的IM即时通讯能力,支持多种消息类型,包括文字、语音、图片和文件等,满足不同场景下的沟通需求。…...
Web3技术如何提升用户数据保护
在这个信息爆炸的时代,用户数据保护已成为全球关注的焦点。Web3 技术,作为下一代互联网的代表,以其去中心化、安全性和用户主权等特点,为用户数据保护提供了新的解决方案。本文将探讨 Web3 技术如何提升用户数据保护。 去中心化存…...
CANoe自动化测试用例log保存(专栏:车载网络诊断测试攻略从零开始搭建一个UDS诊断自动化测试CANoe工程)
文章目录 前言实现思路以及对应的CAPL代码1.获取cfg工程路径2.获取系统时间3.html报告路径4.log路径5.保存报告6.用例示例在汽车电子系统的开发与测试中,CANoe作为主流的仿真测试工具,其自动化测试用例生成的Log是问题追溯、合规审计和数据分析的核心依据。然而,许多团队因日…...
理解 results = model(source, stream=True) 的工作原理和优势
1. 核心概念解析 (1) streamTrue 的作用 生成器模式:当处理视频或图像序列时,streamTrue 会将结果包装成一个 生成器(Generator),逐帧生成 Results 对象,而不是一次性返回所有结果。内存优化:…...
# 手写数字识别:使用PyTorch构建MNIST分类器
手写数字识别:使用PyTorch构建MNIST分类器 在这篇文章中,我将引导你通过使用PyTorch框架构建一个简单的神经网络模型,用于识别MNIST数据集中的手写数字。MNIST数据集是一个经典的机器学习数据集,包含了60,000张训练图像和10,000张…...
ios app的ipa文件提交最简单的方法
ipa文件是ios的app打包后生成的二级制文件,在上架app store connect或做testflight测试的时候,它提示我们需要使用xcode、transporter或xcode命令行等方式来上传。 而xcode、transporter或xcode命令行的安装都需要使用mac电脑,假如没有mac电…...
与/或形演绎推理——基于王永庆著《人工智能原理与方法》的深度解析
前文,我们已经写了两种演绎推理:自然演绎推理和归结演绎推理。 自然演绎推理:自然演绎推理——基于王永庆著《人工智能原理与方法》的深度解析-CSDN博客 归结演绎推理:归结演绎推理——基于王永庆著《人工智能原理与方法》的深度…...
【Qt】Qt 按钮控件详解,PushButton,RadioButton,CheckBox,ToolButton
🍑个人主页:Jupiter. 🚀 所属专栏:QT 欢迎大家点赞收藏评论😊 目录 📚按钮类控件🍑Push Button 🥥Radio Buttion🍃click, press, release, toggled 的区别🍁…...
跨平台开发选Java还是C?应用场景与性能深度对比
🎁个人主页:User_芊芊君子 🎉欢迎大家点赞👍评论📝收藏⭐文章 🔍系列专栏:AI 【前言】 在计算机技术快速发展的今天,跨平台开发已经成为众多开发者的核心需求。Java和C作为两种历史悠…...
Node.js 的定义、用途、安装方法
关于 Node.js 的定义、用途、安装方法,以及为什么不能使用 DOM、BOM 和与浏览器不同的顶级对象的简明总结: 💡 一、Node.js 的定义 Node.js 是一个基于 Chrome V8 引擎 的 JavaScript 运行时环境,它让 JavaScript 不再局限于浏览…...
5、Props:组件间的密语——React 19 数据传递全解
一、密语启封:咒语学徒的困惑 "教授,我的魔法傀儡为什么总是不听指令?"年轻的学徒举着发光的魔杖,组件树中的傀儡们却像打人柳一样混乱。"记住,艾薇,"赫敏的魔杖在空中划出金色数据流…...
LangGraph中预构件,creat_react_agent的实现流程
LangGraph Prebuilt Agent 流程图 本文档展示了LangGraph的prebuilt模块中Agent的实现流程,重点是create_react_agent函数构建的代理系统流程和结构。 ReAct Agent构建流程 #mermaid-svg-ubcEEuBeApApT624 {font-family:"trebuchet ms",verdana,arial,s…...
python-将文本生成音频
将文本生成音频通常需要结合 文本转语音(TTS,Text-to-Speech) 工具或库来实现,比如 Google TTS (gtts)、Amazon Polly、Microsoft Azure TTS 等。 一、使用 Google TTS (gtts) 将文本生成音频 gtts 是一个简单易用的 Python 库&a…...
【虚幻C++笔记】接口
目录 概述创建接口 概述 简单的说,接口提供一组公共的方法,不同的对象中继承这些方法后可以有不同的具体实现。任何使用接口的类都必须实现这些接口。实现解耦解决多继承的问题 创建接口 // Fill out your copyright notice in the Description page o…...
白酒制造主数据管理全链路解析:业务重塑与AI赋能
作为中国消费领域的支柱产业之一,白酒行业在消费升级、渠道多元化的浪潮下,企业正面临库存积压、串货乱价、质量追溯难等核心痛点。如何通过主数据管理实现业务全链路的标准化与智能化,已成为行业数字化转型的关键命题。 01政策背景与行业现…...
Java与C在典型场景下的性能对比深度剖析
🎁个人主页:User_芊芊君子 🎉欢迎大家点赞👍评论📝收藏⭐文章 🔍系列专栏:AI 【前言】 在计算机编程领域,Java和C语言都是举足轻重的编程语言。Java以其跨平台性、自动内存管理和丰富…...
基于springboot+vue的数码产品抢购系统
开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:Maven3.3.9 系统展示 系统首页 商品信…...
芯片封装制造技术分析
封装技术正由单一防护功能向集成化系统发展,核心需统筹电气参数、热耗散能力与生产成本之间的关系。 一、技术定义与基础功能 芯片封装指通过特定制程将半导体晶片封装于保护结构内的技术,核心作用包括: 环境隔离:阻隔机械冲击、…...
Linux:Makefile
编译器gcc 使用方式:gcc [ 选项 ] 要编译的⽂件 [ 选项 ] [ ⽬标⽂件 ] 编译分为以下几个步骤: 1.预处理(进⾏宏替换) 预处理功能主要包括宏定义,⽂件包含,条件编译,去注释等。 预处理指令是以#号开头的代码⾏。 实例: gcc –E hello.c –o hello…...
下篇:《高阶排序算法:分治思想与性能突破》
个人主页:strive-debug 1. 堆排序(Heap Sort) - **核心思想**:利用 **大根堆(升序)** 或 **小根堆(降序)** 进行选择排序。 - **关键步骤**: 1. **建堆**(…...
5G时代,视频分析设备平台EasyCVR实现通信基站远程安全便捷管控
一、背景介绍 随着移动通信行业的快速发展,各大运营商不断建设越来越多的无人值守通信基站。这些基站大多位于偏远地区,人烟稀少且交通不便,给日常维护带来了许多不便。特别是安装在空旷地带的基站设备,如空调、蓄电池等…...
第 4 篇:Motion 拖拽与手势动画(交互篇)—— 打造直觉化交互体验
Framer Motion 的拖拽与手势系统让实现复杂交互变得异常简单。本文将深入解析核心 API,并通过实战案例演示如何创造自然流畅的交互体验。 🧲 拖拽动画基础 1. 启用拖拽 使用 drag 属性即可开启拖拽能力。支持的值有:true(全方向…...
TDengine 语言连接器(R语言)
简介 R 语言是一种用于统计分析、绘图和数据挖掘的编程语言和软件环境 。 TDengine 支持 R 语言访问 TDengine 数据库,通过 R 语言中的 RJDBC 库可以使 R 语言程序支持访问 TDengine 数据。 以下是安装过程、配置过程以及 R 语言示例代码。 安装过程 在开始之前&…...
Vue Router(3)- 历史记录模式、路由元信息
历史记录模式 Vue Router 支持多种历史管理模式,主要区别在于 URL 的表现形式和页面刷新/直接访问时的处理方式。 如果需要最好的兼容性或没有服务器配置权限,使用 Hash 模式 如果需要干净的 URL 并能配置服务器,使用 History 模式ÿ…...
android studio 运行java main报错
运行某个带main函数的java文件报错 Could not create task :app:Test.main(). > SourceSet with name main not found. 解决办法:在工程的.idea/gradle.xml 文件下添加: <option name"delegatedBuild" value"false" /&g…...
TDengine 3.3.6.3 虚拟表简单验证
涛思新出的版本提供虚拟表功能,完美解决了多值窄表查询时需要写程序把窄表变成宽表的处理过程,更加优雅。 超级表定义如下: CREATE STABLE st01 (ts TIMESTAMP,v0 INT,v1 BIGINT,v2 FLOAT,v3 BOOL) TAGS (device VARCHAR(32),vtype VARCHAR(…...
什么是进程?
目录 冯诺依曼体系 操作系统(OperatorSystem) 设计OS的目的 进程 task_struct 操作 /proc文件夹 父子进程 创建子进程 了解进程之前,我们先说说冯诺依曼体系结构,这是计算机硬件方面的知识。 冯诺依曼体系 我们常见的计算机,如笔记…...