QML中Connections如何自动关联目标 无需手动指定target id
问题解答
完全可以实现target自动关联,不需要在每个ChargeBar实例手动写绑定逻辑,全部逻辑都可以封装到ChargeBar组件内部:
核心修改思路
你已经给每个ChargeBar实例绑定了独立的llc属性,直接在组件内部监听llc的nextNumber信号即可,不需要额外定义自定义信号再绕一圈监听自身。
修改后的ChargeBar.qml代码
import QtQuick 2.12 import QtQuick.Controls 2.12 Drawer { x:0 y:0 property var llc // 冗余的reNextNumber信号可直接删除 // signal reNextNumber(int number) width: 0.66 * window.width height: window.height // 直接在组件内部定义Connections,target绑定自身llc属性即可自动适配每个实例 Connections { target: llc function onNextNumber(number) { print(number) print("emitted") } } Button{ id: button anchors.centerIn: parent height: 320 width: 320 onClicked: { llc.start() } } }
精简后的main.qml代码
移除每个实例里冗余的信号绑定和Connections逻辑,只需要传入必要属性即可:
import QtQuick 2.12 import QtQuick.Controls 2.2 import QtQuick.Window 2.12 Window { id: window width: 1080 height: 1920 //visibility: "FullScreen" visible: true ChargeBar{ id: drawerL edge: Qt.LeftEdge llc: llcLeft } ChargeBar{ id: drawerR edge: Qt.RightEdge llc: llcRight } Component.onCompleted: drawerR.open() }
原理说明
每个ChargeBar实例的llc属性都对应独立的Python侧LowLevelControler实例,组件内部Connections的target直接绑定自身的llc属性,实例化时会自动关联对应实例的llc对象,不需要手动指定每个实例的id,所有逻辑都封装在组件内部,复用的时候仅需传入llc属性即可。
如果确实有需要先处理信号再向外转发的场景,也不需要额外写Connections监听自身,直接在组件根节点下写onReNextNumber: {处理逻辑}即可,无需指定target。
内容的提问来源于stack exchange,提问作者Steffer
相关产品推荐
相关产品推荐

