Qt QML自定义LIstView
QML ListView组合拳做列表,代码不可直接复制使用,需要小改
- 先上图看效果
- · 样式1
- · 样式2
- · 样式3
- 原理:
- 操作:
- 技术点:
- 代码片段:
先上图看效果
· 样式1
三个表格组合成要给,上下滚动时,三个同时滚动,表格2可以左右滚动展示数据,三个表格每一列都可以自定义宽度,列的内容样式(文本、单个按钮、多个按钮、单选框)
· 样式2
两个表格组合,左侧可以拖动
· 样式3
正常一个表格,没有组合
原理:
通过三个ListView组合起来,左侧的ListView完全显示,右侧的ListView也完全展示,中间的通过width以及contentWidth实现拖动
操作:
- 设置
itemWidthDic
,通过下标控制每一列的宽度 - 设置
titleKeyList
给标题赋值 - 设置
itemTypeDic
,控制数据项具体哪一列展示什么样式 - 设置
itemTitleTypeDic
,控制标题具体哪一列展示什么样式 - 设置
middleItemBeginIndex
设置中间列表从哪个下标开始 - 设置
rightItemBeginIndex
设置右侧列表从哪个下标开始。同第四点都设置为0则为效果3。middleItemBeginIndex
设置为0,rightItemBeginIndex
大于0则为效果2。都设置大于0则为效果1 - 设置
onXXXXXXXXX
信号,则可以监听具体的事件 - 重写
getIsCheckByCR
getTextObjComColor
这些函数可以设置具体的数据列 - 监听
onOnListMoving
对 视野距离进行判断Math.abs(totalHeight - Math.abs(contentY)) <= viewHeight * 1.5
距离底部小于1.5倍视野时可以继续请求数据等等,实现滚动加载数据 - 设置其他项可以控制是否有列的分割线、标题、内容的透明度,标题是否有灰色背景等等
技术点:
- 每个控件类型都是
Component
组件,使用Loader
动态加载组件,已Item作为父节点,让Item充满整个列宽度,Item受到外部约束。具体的Button
Text
之类的组件作为子节点可以控制样式,因此外部Loader
传递给每个组件的参数均一致,具体的组件按需使用 - 通过每一个
ListView
的onContentYChanged
,结合!rightData.moving && !leftData.moving
属性,让列表一起滚动时,不会出现中间列表控制其他一起滚动,其他列表又反过来作用中间列表的情况
代码片段:
注意项:代码不可直接粘贴使用,TextObj,CheckButton之类的组件都是封装过的,TextObj封装了Text, CheckButton 则是勾选按钮,需要自己重写样式即可,需要改动的都在Component
里面,其他的按照自己的需求继续扩写
import QtQuick 2.15
import QtQuick.Controls 2.15
// import QtQuick.Controls 1.4
// import QtGraphicalEffects 1.15
import QtQuick.Layouts 1.15//暂时只设置左右两个列表,不设置左中右三个列表, 右侧列表完全展示
//2023/04/23日补充左边列表,共左中右三列,左列完全展示,右侧完全展示
Item {width: 1184height: 444// property var totalWidth: 1184//当自动设置autoItemWidth,itemWidth失效,minItemWidth始终生效,可以通过设置itemWidthDic指定宽度property var itemWidth: 200property var minItemWidth: 200property var itemWidthDic: ({})//列类型property var itemTypeDic: ({})//标题列类型property var itemTitleTypeDic: ({})property var autoItemWidth: false//两边的边距property var leftRightMargin: 24//是否显示竖条property var needSplitLine: false//是否标题灰底property var needTitleGrayColor: false//标题透明度property var titleTextComOpacity: 0.4property var contentTextComOpacity: 0.8//数据property var itemDataList: []property var titleKeyList: []property var titleKeyReplaceDic: ({})//已这个下标开始往后,认定为在右侧列表里面, 设置为0时,左侧列表消失,完全展示右侧列表property var rightItemBeginIndex: 0//同理上面参数,小于middleItemBeginIndex为左侧,大于等于middleItemBeginIndex,小于rightItemBeginIndex为中间property var middleItemBeginIndex: 0property alias listViewOfData: rightDataproperty var alignDic: ({})//信号=============================signal onClickButtonObj(var index)signal onClick2ButtonObj(var cIndex, var rIndex, var num)//当高度发生类似光滑渐变时,派发高度变化的信号(表示列表正在滚动,而不是外界设置高度发生骤变)signal onListMoving(var contentY, var totalHeight, var viewHeight)signal onClickRadioButtonObj(var cIndex, var rIndex, var isTitle, bool isOn)//上滑返回true,下滑返回falsesignal onFlickTopOrBottom(bool isToBottom)//================================//privateproperty var everyKeyWidth: 0//列枚举类型类型property int rowTextObj: 0property int columnRowTextObj: 1property int columnRowButton: 2property int columnRowRadio: 3property int columnRow2Button: 4property var keyOfItemType: ({})function update(){keyOfItemType[columnRowTextObj] = textObjCom// keyOfItemType[columnRowTextObj] = textObjCom1keyOfItemType[columnRowButton] = buttonObjComkeyOfItemType[columnRowRadio] = radioBtnkeyOfItemType[columnRow2Button] = twoButtonObjComlet totalKeyCount = 0let leftWidth = width - leftRightMargin * 2//计算之前去掉已经固定宽度的列表for(let i = 0; i < titleKeyList.length; i++){if(!itemWidthDic.hasOwnProperty(i)){totalKeyCount += titleKeyList[i].length}else{leftWidth -= itemWidthDic[i]}}console.log("宽度", titleKeyList, totalKeyCount)if(totalKeyCount == 0){return}everyKeyWidth = (leftWidth / totalKeyCount).toFixed(2)//let rightTitleWidth = 0let middleTitleWidth = 0let leftTitleWidth = 0for(let i = 0; i < titleKeyList.length; i++){if(i >= rightItemBeginIndex){rightTitleWidth += getRowWidthByIndex(i)}else if(i >= middleItemBeginIndex && i < rightItemBeginIndex){middleTitleWidth += getRowWidthByIndex(i)}else{leftTitleWidth += getRowWidthByIndex(i)}}rightFilckableItem.width = Math.min(rightTitleWidth, width - leftRightMargin * 2)rightFilckableItem.contentWidth = rightTitleWidthmiddleFilckableItem.width = width - leftRightMargin * 2 - rightTitleWidth - leftTitleWidthmiddleFilckableItem.contentWidth = middleTitleWidthleftFilckableItem.width = Math.min(leftTitleWidth, width - leftRightMargin * 2)leftFilckableItem.contentWidth = leftTitleWidth// middleTitle.width = width - leftRightMargin * 2 - rightTitleWidth//middleTitleWidthrightTitle.width = rightTitleWidthmiddleTitle.width = middleTitleWidthleftTitle.width = leftTitleWidthconsole.log("宽度1", leftWidth, totalKeyCount, rightTitleWidth, middleTitleWidth, titleKeyList.length - rightItemBeginIndex, rightItemBeginIndex, itemDataList.length)// rightTitleModel.clear()// rightTitleModel.append(new Array(titleKeyList.length - rightItemBeginIndex))rightTitle.model = getRightRowCount()middleTitle.model = getMiddleRowCount()leftTitle.model = getLeftRowCount()middleData.model = itemDataList.lengthrightData.model = itemDataList.lengthleftData.model = itemDataList.length// tableModel.appendRow({display: "name"})// tableModel.appendRow({display: "sex"})// tableModel.appendRow({display: "id"})// let TableModelColumn// console.log(tableView.columns)// console.log(tableModel.columnCount())// console.log()// tableModel.colums}function getRowWidthByIndex(index){if(itemWidthDic.hasOwnProperty(index)){return itemWidthDic[index]}if(autoItemWidth == false){return itemWidth}// console.log("计算宽度", index, everyKeyWidth, titleKeyList[index].length, itemWidthDic[index], itemWidth)//不是固定宽度,也不是自己设置,通过everyKeyWidth来计算return Math.max(everyKeyWidth * titleKeyList[index].length, minItemWidth)}function getMiddleRowCount(){return rightItemBeginIndex - middleItemBeginIndex}function getRightRowCount(){return titleKeyList.length - rightItemBeginIndex}function getLeftRowCount(){return middleItemBeginIndex}function getDataByColumAndRow(colum, row){// console.log("数据个hi", titleKeyList[row], itemDataList[colum], itemDataList[colum][titleKeyList[row]])let test = {}// if(test.hasOwnProperty())let answer = ""if(itemDataList[colum] == undefined){return ""}if(itemDataList[colum].hasOwnProperty(titleKeyList[row])){answer = itemDataList[colum][titleKeyList[row]]}else{answer = itemDataList[colum][row]}// let returnData = itemDataList[colum][titleKeyList[row]]return answer == undefined ? "" : answer}function getTitleKeyReplaceKey(index, raw = true){let key = titleKeyList[index]if(raw || !titleKeyReplaceDic.hasOwnProperty(key)){return key}return titleKeyReplaceDic[key]}function getItemTypeByIndex(index){if(itemTypeDic.hasOwnProperty(index)){return keyOfItemType[itemTypeDic[index]]}return textObjCom}//标题控件哦~哦!哦~~function getTitleTypeByIndex(index){if(itemTitleTypeDic.hasOwnProperty(index)){return keyOfItemType[itemTitleTypeDic[index]]}return textObjCom}//==================== 外部可以重写的接口 ================//从外部获取的设置项function getIsCheckByCR(c, r, isTitle){return false}function getTextObjComColor(c, r, isTitle){return "#FFFFFFFF"}//=====================================================function getCurTopShowIndex(){let mY = middleData.contentYlet topIndex = Math.ceil(mY / 48)return topIndex}function getCurBottomShowIndex(){let mY = middleData.contentY + middleData.heightlet topIndex = Math.ceil(mY / 48)return topIndex}//跳转到具体的下标function jumpToIndex(index){let cY = index * 48let newCY = Math.max(0, Math.min(cY, middleData.contentHeight - middleData.height))// console.log("硬控???", middleData.contentY, cY, newCY)middleData.contentY = newCY}//删除具体的下标function deleteIndex(index){itemDataList.splice(index, 1)middleData.model = itemDataList.lengthrightData.model = itemDataList.lengthleftData.model = itemDataList.length}//刷新界面function updateListView(){let middleContentY = middleData.contentYmiddleData.contentY = 0rightData.contentY = 0leftData.contentY = 0middleData.model = 0rightData.model = 0leftData.model = 0middleData.model = itemDataList.lengthrightData.model = itemDataList.lengthleftData.model = itemDataList.lengthmiddleData.contentY = middleContentYrightData.contentY = middleContentYleftData.contentY = middleContentY}Rectangle{anchors.fill: parentcolor: "#05FFFFFF"radius: 4border.width: 2border.color: "#1AFFFFFF"Rectangle{width: parent.width - 4anchors.left: parent.leftanchors.leftMargin: 2anchors.top: parent.topanchors.topMargin: 50height: 2color: "#1AFFFFFF"}}Component{id: textObjComItem{property int rIndex: parent.rIndex != undefined ? parent.rIndex : 0property int cIndex: parent.cIndex != undefined ? parent.cIndex : 0property real comOpacity: parent.comOpacity != undefined ? parent.comOpacity : 0property bool isTitleText: parent.isTitle != undefined ? parent.isTitle : trueTextObj{label: parent.isTitleText ? getTitleKeyReplaceKey(parent.rIndex, false) : getDataByColumAndRow(parent.cIndex, parent.rIndex)width: parent.width - 32height: parent.heightanchors.left: parent.leftanchors.leftMargin: 16horizontalAlignment: alignDic.hasOwnProperty(parent.rIndex) ? alignDic[parent.rIndex] : Text.AlignLeftmaximumLineCount: 2color: getTextObjComColor(cIndex, rIndex, isTitle)wrapMode: Text.WordWrapopacity: parent.comOpacity}}}Component{id: buttonObjComItem{id: buttonObjComItemproperty int rIndex: parent.rIndex != undefined ? parent.rIndex : 0property int cIndex: parent.cIndex != undefined ? parent.cIndex : 0property real comOpacity: parent.comOpacity != undefined ? parent.comOpacity : 0// opacity: 0.2Button{width: 69height: 32background: Rectangle{color: "transparent"border.color: "#33FFFFFF"border.width: 2radius: 4}TextObj{anchors.fill: parentlabel: "详情"}// anchors.centerIn: parentanchors.right: parent.rightanchors.rightMargin: 8anchors.verticalCenter: parent.verticalCenterMouseArea{anchors.fill: parentonClicked: {console.log("点击下标", buttonObjComItem.cIndex)// onClickDetail(buttonObjComItem.cIndex)onClickButtonObj(buttonObjComItem.cIndex)}}}}}Component{id: radioBtnItem{id: radioBtnComItemproperty int rIndex: parent.rIndex != undefined ? parent.rIndex : 0property int cIndex: parent.cIndex != undefined ? parent.cIndex : 0property real comOpacity: parent.comOpacity != undefined ? parent.comOpacity : 0property bool isTitle: parent.isTitle != undefined ? parent.isTitle : true// opacity: 0.2CheckButton{width: 24height: 24anchors.horizontalCenter: parent.horizontalCenteranchors.verticalCenter: parent.verticalCenterchecked: getIsCheckByCR(cIndex, rIndex, isTitle)onClicked: {onClickRadioButtonObj(cIndex, rIndex, isTitle, isOn)}}}}Component{id: twoButtonObjComItem{id: twoButtonObjComItemproperty int rIndex: parent.rIndex != undefined ? parent.rIndex : 0property int cIndex: parent.cIndex != undefined ? parent.cIndex : 0property real comOpacity: parent.comOpacity != undefined ? parent.comOpacity : 0// opacity: 0.2ButtonCancel{id: button1width: 69height: 32labelTxt: "View"// anchors.centerIn: parentanchors.right: parent.rightanchors.rightMargin: (parent.width - (69 + 69 + 16)) / 2anchors.verticalCenter: parent.verticalCenteronClicked: {onClick2ButtonObj(cIndex, rIndex, 1)}}ButtonCancel{id: button2width: 69height: 32labelTxt: "Delete"// anchors.centerIn: parentanchors.right: button1.leftanchors.rightMargin: 16anchors.verticalCenter: parent.verticalCenteronClicked: {onClick2ButtonObj(cIndex, rIndex, 2)}}}}//右侧阴影条效果Rectangle{id: markItemwidth: 16height: rightFilckableItem.height - 4// - middleTitle.heightanchors.top: parent.topanchors.topMargin: 2anchors.right: rightFilckableItem.leftanchors.rightMargin: 0// 定义线性渐变gradient: Gradient {orientation: Gradient.Horizontal// GradientStop { position: 0.0; color: "#2196F3" } // 起始颜色(蓝色)// GradientStop { position: 1.0; color: "#4CAF50" } // 结束颜色(绿色)GradientStop { position: 0.0; color: "#01000000" } // 起始颜色(蓝色)GradientStop { position: 1.0; color: "#1A000000" } // 结束颜色(绿色)}visible: rightItemBeginIndex > 0}//右侧东西Flickable {id: rightFilckableItemwidth: 0height: parent.height// - middleTitle.heightanchors.top: parent.topanchors.topMargin: 0anchors.right: parent.rightanchors.rightMargin: leftRightMargincontentWidth: 0clip: trueListView{id: rightTitlewidth: 0height: 50anchors.top: parent.topanchors.topMargin: 0anchors.left: parent.leftanchors.leftMargin: 0orientation: ListView.Horizontalclip: truemodel: 0delegate: Item{property var dataIndex: rightItemBeginIndex + indexwidth: getRowWidthByIndex(dataIndex)height: rightTitle.heightRectangle{anchors.fill: parentcolor: "#0DFFFFFF"visible: needTitleGrayColor}Rectangle{width: 2height: parent.height - 2color: "#1AFFFFFF"anchors.left: parent.leftanchors.leftMargin: 0anchors.top: parent.topanchors.topMargin: 2visible: needSplitLine && dataIndex != 0}// 动态加载组件Loader {id: loader// 根据模型中的type字段决定加载哪个组件// anchors.fill: parentwidth: parent.widthheight: parent.heightsourceComponent: getTitleTypeByIndex(dataIndex)// 将模型数据传递给子组件property int rIndex: dataIndexproperty real comOpacity: titleTextComOpacityproperty bool isTitle: true}}interactive: false}ListView{id: rightDatawidth: rightTitle.widthheight: parent.height - rightTitle.heightanchors.top: rightTitle.bottomanchors.topMargin: 0anchors.left: parent.leftanchors.leftMargin: 0clip: truemodel: 0delegate: Item{//行property var dataCIndex: indexwidth: rightFilckableItem.contentWidthheight: 48ListView{id: rightDataItemwidth: rightFilckableItem.contentWidthheight: 48orientation: ListView.Horizontalclip: truemodel: getRightRowCount()delegate: Item{property var dataRIndex: rightItemBeginIndex + indexwidth: getRowWidthByIndex(dataRIndex)height: rightDataItem.heightRectangle{width: 2height: parent.height - 2color: "#1AFFFFFF"anchors.left: parent.leftanchors.leftMargin: 0anchors.top: parent.topanchors.topMargin: 0visible: needSplitLine && dataRIndex != 0}Loader {id: loader1width: parent.widthheight: parent.height// 根据模型中的type字段决定加载哪个组件sourceComponent: getItemTypeByIndex(dataRIndex)// 将模型数据传递给子组件property int rIndex: dataRIndexproperty int cIndex: dataCIndexproperty real comOpacity: contentTextComOpacityproperty bool isTitle: false}}interactive: false}Rectangle{width: parent.widthanchors.left: parent.leftanchors.leftMargin: 0anchors.bottom: parent.bottomanchors.bottomMargin: 0height: 2color: "#1AFFFFFF"}}onFlickStarted: {console.log("##########. " + contentY)}onFlickEnded: {if(verticalVelocity <= 0){onFlickTopOrBottom(true)}else{onFlickTopOrBottom(false)}}onContentYChanged: {if (!middleData.moving && !leftData.moving) {middleData.contentY = contentYleftData.contentY = contentY}}// onContentYChanged: {// middleData.contentY = contentY// }}}//中间列表Flickable {id: middleFilckableItemwidth: 0height: parent.height// - middleTitle.heightanchors.top: parent.topanchors.topMargin: 0anchors.right: rightFilckableItem.leftanchors.rightMargin: 0contentWidth: 0clip: trueboundsBehavior: Flickable.StopAtBoundsListView{id: middleTitlewidth: 0height: 50anchors.top: parent.topanchors.topMargin: 0anchors.left: parent.leftanchors.leftMargin: 0orientation: ListView.Horizontalclip: truemodel: 0delegate: Item{property var dataIndex: middleItemBeginIndex + indexwidth: getRowWidthByIndex(dataIndex)height: rightTitle.heightRectangle{anchors.fill: parentcolor: "#0DFFFFFF"visible: needTitleGrayColor}Rectangle{width: 2height: parent.height - 2color: "#1AFFFFFF"anchors.left: parent.leftanchors.leftMargin: 0anchors.top: parent.topanchors.topMargin: 2visible: needSplitLine && dataIndex != 0}// 动态加载组件Loader {id: loader2width: parent.widthheight: parent.heightsourceComponent: getTitleTypeByIndex(dataIndex)// 将模型数据传递给子组件property int rIndex: dataIndexproperty real comOpacity: titleTextComOpacityproperty bool isTitle: true}}interactive: false}ListView{id: middleDatawidth: middleTitle.widthheight: parent.height - middleTitle.heightanchors.top: middleTitle.bottomanchors.topMargin: 0anchors.left: parent.leftanchors.leftMargin: 0clip: truemodel: 0delegate: Item{//行property var dataCIndex: indexwidth: middleFilckableItem.contentWidthheight: 48ListView{id: middleDataItemwidth: middleFilckableItem.contentWidthheight: 48orientation: ListView.Horizontalclip: truemodel: getMiddleRowCount()delegate: Item{property var dataRIndex: middleItemBeginIndex + indexwidth: getRowWidthByIndex(dataRIndex)height: middleDataItem.heightRectangle{width: 2height: parent.height - 2color: "#1AFFFFFF"anchors.left: parent.leftanchors.leftMargin: 0anchors.top: parent.topanchors.topMargin: 0visible: needSplitLine && dataRIndex != 0}Loader {id: loader4width: parent.widthheight: parent.height// 根据模型中的type字段决定加载哪个组件sourceComponent: getItemTypeByIndex(dataRIndex)// 将模型数据传递给子组件property int rIndex: dataRIndexproperty int cIndex: dataCIndexproperty real comOpacity: contentTextComOpacityproperty bool isTitle: false}}interactive: false}Rectangle{width: parent.widthanchors.left: parent.leftanchors.leftMargin: 0anchors.bottom: parent.bottomanchors.bottomMargin: 0height: 2color: "#1AFFFFFF"}}onFlickStarted: {console.log("##########. " + contentY)}onMovingChanged: {if(moving == false){middleData.listSuddentlyChange = false}}onFlickEnded: {if(verticalVelocity <= 0){onFlickTopOrBottom(true)}else{onFlickTopOrBottom(false)}}onContentYChanged: {if (!rightData.moving && !leftData.moving) {rightData.contentY = contentYleftData.contentY = contentY}onListMoving(contentY, contentHeight, height)// console.log("高度发生了改变", contentY, contentHeight)}// onContentYChanged: {// rightData.contentY = contentY// }}}//左侧东西Flickable {id: leftFilckableItemwidth: 0height: parent.height// - middleTitle.heightanchors.top: parent.topanchors.topMargin: 0anchors.right: middleFilckableItem.leftanchors.rightMargin: 0contentWidth: 0clip: trueListView{id: leftTitlewidth: 0height: 50anchors.top: parent.topanchors.topMargin: 0anchors.left: parent.leftanchors.leftMargin: 0orientation: ListView.Horizontalclip: truemodel: 0delegate: Item{property var dataIndex: indexwidth: getRowWidthByIndex(dataIndex)height: rightTitle.heightRectangle{anchors.fill: parentcolor: "#0DFFFFFF"visible: needTitleGrayColor}Rectangle{width: 2height: parent.height - 2color: "#1AFFFFFF"anchors.left: parent.leftanchors.leftMargin: 0anchors.top: parent.topanchors.topMargin: 2visible: needSplitLine && dataIndex != 0}// 动态加载组件Loader {id: leftLoader// 根据模型中的type字段决定加载哪个组件// anchors.fill: parentwidth: parent.widthheight: parent.heightsourceComponent: getTitleTypeByIndex(dataIndex)// 将模型数据传递给子组件property int rIndex: dataIndexproperty real comOpacity: titleTextComOpacityproperty bool isTitle: true}}interactive: false}ListView{id: leftDatawidth: leftTitle.widthheight: parent.height - leftTitle.heightanchors.top: leftTitle.bottomanchors.topMargin: 0anchors.left: parent.leftanchors.leftMargin: 0clip: truemodel: 0delegate: Item{//行property var dataCIndex: indexwidth: leftFilckableItem.contentWidthheight: 48ListView{id: leftDataItemwidth: leftFilckableItem.contentWidthheight: 48orientation: ListView.Horizontalclip: truemodel: getRightRowCount()delegate: Item{property var dataRIndex: indexwidth: getRowWidthByIndex(dataRIndex)height: leftDataItem.heightRectangle{width: 2height: parent.height - 2color: "#1AFFFFFF"anchors.left: parent.leftanchors.leftMargin: 0anchors.top: parent.topanchors.topMargin: 0visible: needSplitLine && dataRIndex != 0}Loader {id: loader13width: parent.widthheight: parent.height// 根据模型中的type字段决定加载哪个组件sourceComponent: getItemTypeByIndex(dataRIndex)// 将模型数据传递给子组件property int rIndex: dataRIndexproperty int cIndex: dataCIndexproperty real comOpacity: contentTextComOpacityproperty bool isTitle: false}}interactive: false}Rectangle{width: parent.widthanchors.left: parent.leftanchors.leftMargin: 0anchors.bottom: parent.bottomanchors.bottomMargin: 0height: 2color: "#1AFFFFFF"}}onFlickStarted: {console.log("##########. " + contentY)// selectListview.contentY = contentY// movePos = contentY}onFlickEnded: {if(verticalVelocity <= 0){onFlickTopOrBottom(true)}else{onFlickTopOrBottom(false)}}onContentYChanged: {if (!middleData.moving && !rightData.moving) {middleData.contentY = contentYrightData.contentY = contentY}}}}
}
相关文章:

Qt QML自定义LIstView
QML ListView组合拳做列表,代码不可直接复制使用,需要小改 先上图看效果 样式1 样式2 样式3 原理:操作:技术点:代码片段: 先上图看效果 样式1 三个表格组合成要给,上下滚动时,三个同时滚动&am…...

C++进阶--红黑树的实现
文章目录 红黑树的实现红黑树的概念红黑树的规则红黑树的效率 红黑树的实现红黑树的结构红黑树的插入变色单旋(变色)双旋(变色) 红黑树的查找红黑树的验证 总结:结语 很高兴和大家见面,给生活加点impetus&a…...

WPF之值转换器
文章目录 目录什么是值转换器IValueConverter接口Convert方法ConvertBack方法 创建和使用值转换器定义转换器类在XAML中使用转换器转换器参数(ConverterParameter) 常用转换器实现布尔值转可见性(BoolToVisibilityConverter)数值转…...
黄金、碳排放期货市场API接口文档
StockTV 提供了多种期货市场的数据接口,包括获取K线图表数据、查询特定期货的实时行情等。以下为对接期货市场的详细接口说明。 一、获取K线图表数据 通过调用/futures/kline接口,您可以获取指定期货合约的历史K线数据(例如开盘价、最高价、…...
云上系统CC攻击如何进行检测与防御?
云上系统遭受CC攻击(Challenge Collapsar,一种针对应用层的DDoS攻击)时,检测与防御需结合流量分析、行为识别和技术手段,以下是核心方法: 一、检测方法 异常流量分析 监控请求量突增&#…...

qml中的TextArea使用QSyntaxHighlighter显示高亮语法
效果图,左侧显示行号,右侧用TextArea显示文本内容,并且语法高亮。 2025年5月8号更新 1、多行文本注释 多行文本注释跟普通的高亮规则代码不太一样,代码需要修改,这里以JavaScript举例。 先制定多行文本注释规则&…...
QuecPython+腾讯云:快速连接腾讯云l0T平台
该模块提供腾讯 IoT 平台物联网套件客户端功能,目前的产品节点类型仅支持“设备”,设备认证方式支持“一机一密”和“动态注册认证”。 BC25PA系列不支持该功能。 初始化腾讯 IoT 平台 TXyun TXyun(productID, devicename, devicePsk, ProductSecret)配置腾讯 IoT…...
RocketMQ 深度解析:架构设计与最佳实践
在分布式系统架构日益复杂的今天,消息中间件作为系统间通信的桥梁,扮演着至关重要的角色。RocketMQ 作为阿里开源的高性能分布式消息中间件,凭借其卓越的性能、丰富的功能以及高可用性,在电商、金融、互联网等众多领域得到广泛应用…...

Transformer编码器+SHAP分析,模型可解释创新表达!
目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 基本介绍 基于SHAP分析的特征选择和贡献度计算,Matlab2023b代码实现;基于MATLAB的SHAP可解释Transformer编码器回归模型,敏感性分析方法。 详细介绍 引言 在正向渗透(…...

[特殊字符]适合母亲节的SVG模版[特殊字符]
宝藏模版 往期推荐(点击阅读): 趣味效果|高大上|可爱风|年终总结I|年终总结II|循环特效|情人节I|情人节II|情人节IIII|妇女节I&…...

浅蓝色调风格人像自拍Lr调色预设,手机滤镜PS+Lightroom预设下载!
调色教程 浅蓝色调风格人像自拍 Lr 调色是利用 Adobe Lightroom 软件针对人像自拍照进行后期处理的一种调色方式。它通过对照片的色彩、对比度、亮度等参数进行精细调整,将画面的主色调打造为清新、柔和的浅蓝色系,赋予人像自拍独特的清新、文艺风格&…...

isp流程介绍(yuv格式阶段)
一、前言介绍 前面两章里面,已经分别讲解了在Raw和Rgb域里面,ISP的相关算法流程,从前面文章里面可以看到,在Raw和Rgb域里面,很多ISP算法操作,更像是属于sensor矫正或者说sensor标定操作。本质上来说&#x…...

数巅智能携手北京昇腾创新中心深耕行业大模型应用
当前,AI技术正在加速向各行业深度渗透,成为驱动产业转型和社会经济发展的重要引擎。构建开放协作的AI应用生态体系、推动技术和应用深度融合,已成为行业发展的重要趋势。 近日,数巅智能与北京昇腾人工智能计算中心(北京昇腾创新中…...

【LangChain高级系列】LangGraph第一课
前言 我们今天直接通过一个langgraph的基础案例,来深入探索langgraph的核心概念和工作原理。 基本认识 LangGraph是一个用于构建具有LLMs的有状态、多角色应用程序的库,用于创建代理和多代理工作流。与其他LLM框架相比,它提供了以下核心优…...
增强学习(Reinforcement Learning)简介
增强学习(Reinforcement Learning)简介 增强学习是机器学习的一种范式,其核心目标是让智能体(Agent)通过与环境的交互,基于试错机制和延迟奖励反馈,学习如何选择最优动作以最大化长期累积回报。…...

常见降维算法分析
一、常见的降维算法 LDA线性判别PCA主成分分析t-sne降维 二、降维算法原理 2.1 LDA 线性判别 原理 :LDA(Linear Discriminant Analysis)线性判别分析是一种有监督的降维方法。它的目标是找到一个投影方向,使得不同类别的数据在…...

计算机二级(C语言)已过
非线性结构:树、图 链表和队列的结构特性不一样,链表可以在任何位置插入、删除,而队列只能在队尾入队、队头出队 对长度为n的线性表排序、在最坏情况下时间复杂度,二分查找为O(log2n),顺序查找为O(n),哈希查…...

2025年3月,韩先超对国网宁夏进行Python线下培训
大家好,我是韩先超!在2025年3月3号和4号,为 宁夏国网 的运维团队进行了一场两天的 Python培训 ,培训目标不仅是让大家学会Python编程,更是希望大家能够通过这门技术解决实际工作中的问题,提升工作效率。 对…...
ATH12K驱动框架架构图
ATH12K驱动框架架构图 ATH12K驱动框架架构图(分层描述)I. 顶层架构II. 核心数据结构层次关系III. 主要模块详解1. 核心模块 (Core)2. 硬件抽象层 (HAL)3. 无线管理接口 (WMI)4. 主机目标通信 (HTC)5. 复制引擎 (CE)6. MAC层7. 数据路径 (DP)IV. 关键数据流路径1. 发送数据流 …...
pcb样板打样厂家哪家好?
国内在PCB样板加工领域具有较强竞争力的企业主要包括以下几家,综合技术实力、市场份额、客户评价及行业认可度进行推荐: 1. 兴森科技 行业地位:国内最大的PCB样板生产商,细分领域龙头企业,月订单品种数可达25,000种&…...

[计算机网络]物理层
文章目录 物理层的概述与功能传输介质双绞线:分类:应用领域: 同轴电缆:分类: 光纤:分类: 无线传输介质:无线电波微波:红外线:激光: 物理层设备中继器(Repeater):放大器:集线器(Hub)&…...

幂等操作及处理措施
利用token模式去避免幂等操作 按以上图所示,除了token,应该也可以把传入的参数用MD5加密,当成key放入redis里面,业务执行完后再删除这个key.如还没有执行完,则请不要重复操作。纯属个人理解...

Matlab 数控车床进给系统的建模与仿真
1、内容简介 Matlab217-数控车床进给系统的建模与仿真 可以交流、咨询、答疑 2、内容说明 略 摘 要:为提高数控车床的加工精度,对数控 车床进给系统中影响加工精度的主要因素进行了仿真分析研 动系统的数学模型,利用MATLAB软件中的动态仿真工具 究:依据机械动力学原理建立了…...

低成本自动化改造的18个技术锚点深度解析
执行摘要 本文旨在深入剖析四项关键的低成本自动化技术,这些技术为工业转型提供了显著的运营和经济效益。文章将提供实用且深入的指导,涵盖老旧设备联网、AGV车队优化、空压机系统智能能耗管控以及此类项目投资回报率(ROI)的严谨…...
【大数据】服务器上部署Apache Paimon
1. 环境准备 在开始部署之前,请确保服务器满足以下基本要求: 操作系统: 推荐使用 Linux(如 Ubuntu、CentOS)。 Java 环境: Paimon 依赖 Java,推荐安装 JDK 8 或更高版本。 Flink 环境: Paimon 是基于 Apache Flink 的…...

我国脑机接口市场规模将破38亿元,医疗领域成关键突破口
当人类仅凭"意念"就能操控无人机编队飞行,当瘫痪患者通过"脑控"重新站立行走,这些曾只存在于科幻电影的场景,如今正通过脑机接口技术变为现实。作为"十四五"规划中重点发展的前沿科技,我国脑机接口…...

Edu教育邮箱申请成功下号
这里是第2部分 如你所见,我根本就没有考虑流量的问题, 如果你有幸看到前面的内容,相信你能自己找到这个后续。...
kotlin中枚举带参数和不带参数的区别
一 ✅ 代码对比总结 第一段(带参数 工具方法) enum class SeatPosition(val position: Int) {DRIVER_LEFT(0),DRIVER_RIGHT(1),SECOND_LEFT(2),SECOND_RIGHT(3);companion object {fun fromPosition(position: Int): SeatPosition? {return SeatPosi…...

【Linux进程控制一】进程的终止和等待
【Linux进程控制一】进程的终止和等待 一、进程终止1.main函数的return2.strerror函数3.库函数exit4.系统调用_exit和库函数exit的区别5.异常信号6.变量errno 二、进程等待1.什么是进程等待?2.wait接口3.status4.waitpid接口 一、进程终止 1.main函数的return 写C…...
修改docker为国内源
一、编辑docker配置文件 vi /etc/docker/daemon.json二、配置国内源和修改docker数据目录 {"registry-mirrors":["http://hub-mirror.c.163.com","https://mirrors.tuna.tsinghua.edu.cn","http://mirrors.sohu.com","https://u…...