我创建了一个 PySide6 QML 项目,其中
QmlElement
类具有可从 QML 接口调用的槽函数。调用此槽后,类实例异步发出信号以将文本发送到 QML 控件,但意外地收到了一个对象。我该如何解决这个问题?
@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())
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)
}
}
}
run:显示“Hello World”
点击后显示:
QQuickItem(0x1f5169ed150),QQuickContentItem(0x1f5169ed6c0, "ApplicationWindow")
您假设“数据”是通过信号发送的对象。 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)
}
}