You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 11:09:03