发送到qml的python @QmlElement类签名者数据无法解析

问题描述 投票:0回答:1

我创建了一个 PySide6 QML 项目,其中

QmlElement
类具有可从 QML 接口调用的槽函数。调用此槽后,类实例异步发出信号以将文本发送到 QML 控件,但意外地收到了一个对象。我该如何解决这个问题?

  1. main.py 包含我定义的
    @QmlElement
import sys
from argparse import ArgumentParser
from pathlib import Path

from PySide6.QtCore import QObject, Signal, Slot, Property
from PySide6.QtGui import QGuiApplication
from PySide6.QtQml import QmlElement, QQmlApplicationEngine, QQmlDebuggingEnabler

QML_IMPORT_NAME = "my.ext"
QML_IMPORT_MAJOR_VERSION = 1

@QmlElement
class MyClass(QObject):
    valueChanged = Signal(str)

    @Slot()
    def setText(self):
        self.valueChanged.emit('str')


if __name__ == '__main__':



    app = QGuiApplication(sys.argv)

    engine = QQmlApplicationEngine()

    engine.addImportPath(Path(__file__).parent)

    qml_file = Path(__file__).parent / 'main.qml'

    engine.load(qml_file)

    if not engine.rootObjects():
        sys.exit(-1)

    sys.exit(app.exec())
  1. main.qml 文件
import QtQuick
import QtQuick.Controls
import my.ext

ApplicationWindow {
    id: appWindow

    width: 800
    height: 600
    visible: true

    title: "Application"

    Text {
        id: text
        anchors.centerIn: parent
        text: "Hello World!"
    }

    MouseArea {
        anchors.fill: parent
        onClicked: {
            myObj.setText()
        }
    }

    MyClass {
        id: myObj
        onValueChanged: {
            text.text = '' + data
            console.log("Value changed: " + data)
        }
    }
}
  1. run:显示“Hello World” result

  2. 点击后显示:

QQuickItem(0x1f5169ed150),QQuickContentItem(0x1f5169ed6c0, "ApplicationWindow")

result2

python qml signals pyside6
1个回答
0
投票

您假设“数据”是通过信号发送的对象。 data是ApplicationWindow的一个属性:

data : list<Object>

数据属性允许您自由混合视觉子项、资源 和窗口中的其他窗口。

如果您将另一个窗口分配给数据列表,则嵌套窗口将 成为外窗口的“瞬态”。

如果将一个项目分配给数据列表,它就会成为 窗口的 contentItem,以便它出现在窗口内。该项目的 Parent 将是窗口的 contentItem,它是 Item 的根 该窗口内的所有权树。

如果您分配任何其他对象类型,它将作为资源添加。

通常不需要引用数据属性,因为 它是 Window 的默认属性,因此所有子项都是 自动分配给该属性。

另请参见 QWindow::transientParent()。

这就是打印对象列表的原因。

一个可能的解决方案是使用 arguments 来设置发送对象的名称:

valueChanged = Signal(str, arguments=["val"])

然后:

MyClass {
    id: myObj
    onValueChanged: {
        text.text = '' + val
        console.log("Value changed: " + val)
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.