文章目录
- 前言
- 分析
前言
修改 Column 控件下使用 Repeater 生成的子控件,但是没有 id 无法操作,使用 children 层层递归分析
分析
QML 代码
// https://doc.qt.io/qt-6/qml-qtquick-column.htmlColumn {id: columnspacing: 2// 定义模型property var comboBoxModel: [{ label: "端口号", id: "port", options: [] },{ label: "波特率", id: "baudrate", options: ["9600", "115200"], index: 1, editable: true },{ label: "数据位", id: "bytesize", options: [5, 6, 7, 8], index: 3 },{ label: "校验位", id: "parity", options: ["None", "Even", "Odd", "Space"]},{ label: "停止位", id: "stopbits", options: [1, 1.5, 2] }]// 复用项定义:https://doc.qt.io/qt-6/qml-qtqml-component.htmlComponent {id: comboBoxComponent// https://doc.qt.io/qt-6/qml-qtquick-row.htmlRow {spacing: 2// https://doc.qt.io/qt-6/qml-qtquick-controls-label.htmlLabel { width: 50; height: 20; text: label+':' }// https://doc.qt.io/qt-6/qml-qtquick-controls-combobox.htmlComboBox {property var name: labelwidth: 80height: 20model: optionscurrentIndex: index ? index : 0editable: edit ? edit : false}}}// 动态创建标签和下拉框:https://doc.qt.io/qt-6/qml-qtquick-repeater.htmlRepeater {model: column.comboBoxModel// https://doc.qt.io/qt-6/qml-qtquick-loader.htmlLoader {property var label: modelData.labelproperty var options: modelData.optionsproperty var index: modelData.indexproperty var edit: modelData.editablesourceComponent: comboBoxComponent}}// https://doc.qt.io/qt-6/qml-qtquick-controls-button.htmlButton {text: "打开"width: parent.widthonClicked: {for(var i = 0; i < 5; i++) {// print(column.children[i].children[0].children[1].name)var obj = column.children[i].children[0].children[1]print(obj.name)}}}}
分析:
- 设置 Column 控件 id 为 column,通过按键点击触发 children 打印;
- column.children.length:7
- column.children: [QQuickLoader_QML_23(0x22b66a9fc60),QQuickLoader_QML_23(0x22b66aa06e0),QQuickLoader_QML_23(0x22b66a9fd40),QQuickLoader_QML_23(0x22b66aa0b40),QQuickLoader_QML_23(0x22b66a9f3a0),QQuickRepeater(0x22b66874200),Button_QMLTYPE_13(0x22b66873cc0)];类型为 list,包含 Loader5,Repeater1,Button*1,与实际布局一致,其中五个 Loader 就是 Repeater 创建的子控件,通过 column.children[i] 进行访问;
- column.children[0].children:[QQuickRow(0x22b6685fd20)],需要使用 column.children[0].children[0] 进行访问;
- column.children[0].children[0].children[1]:即为需要访问的子控件的下拉列表控件