QML将信号连接到功能

时间:2018-11-26 14:14:33

标签: qt qml

我逐渐熟悉QT5中的QML。因此,我试图通过以下视频制作代码:video

在此视频中,使用了代码send.connect(target.receive());。但是这部分不起作用。我收到错误消息:

  

qrc:/Receiver.qml:8:错误:无法将[undefined]分配给QString

此方法被弃用还是我做错了什么?

main.qml

Window {
visible: true
width: 640
height: 480
title: qsTr("Jurassic World")

Background {
    id: background
    anchors.fill: parent
    target: sender

    Sender {
        id: sender
        y: 145
        displayText: "Sender"
        anchors.verticalCenter: parent.verticalCenter
        anchors.left: parent.left
        anchors.leftMargin: 50
        target: receiver
    }

    Receiver {
        id: receiver
        x: 376
        y: 158
        displayText: "Receiver"
        anchors.verticalCenter: parent.verticalCenter
        anchors.right: parent.right
        anchors.rightMargin: 50
        width: sender.width
    }
}
}

Receiver.qml

Cirkel {
id: receiveButton

function receive(value)
{
    displayText = value
    clicknotify.running = true
}

SequentialAnimation on buttonColor
{
    id: clicknotify
    running: false

    ColorAnimation {
        from: "#afc4cb"
        to: "red"
        duration: 200
    }

    ColorAnimation {
        from: "red"
        to: "#afc4cb"
        duration: 200
    }
}
}

Sender.qml

Cirkel {
id: sendButton

property int counter: 0
property Receiver target: null

signal send(string value)

onTargetChanged: {
    send.connect(target.receive());
}

MouseArea {
    anchors.fill: parent

    onClicked: {
        counter++
        parent.send(counter)
        displayText = counter
    }

    onPressed: parent.buttonColor = "green"
    onReleased: parent.buttonColor = "#afc4cb"
}
}

问题: 如何将信号从一个qml链接到另一个qml功能?

2 个答案:

答案 0 :(得分:0)

我想说的是,在Sender.qml中这样做:

signal send(int value)
...
sendButton.send(counter)

在main.qml中只是做

Sender {
    id: sender
    ...
    onSend: receiver.receive(value)
}

仅此而已。不需要整个目标分配。 顺便说一下,您在接收函数中遇到了数据类型问题(整数到字符串) 解决此问题:

function receive(value)
{
    displayText = "" + value
    clicknotify.running = true
}

通常,通过添加“ on”和大写首字母,可以将QML中的信号作为函数处理。

例如,一个Button公开了clicked信号,当您处理它时,您使用了onClicked

答案 1 :(得分:0)

您写:

send.connect(target.receive());

您在其中调用target.receive()并尝试将其返回值连接到send的地方。

您想要的是:

send.connect(target.receive);

send连接到功能receive本身。


推荐

  

也可以尝试使用Connection对象的声明方式。