我注意到QML可以通过使用Connections对象接收Python发出的信号。不幸的是,我无法弄清楚如何让该对象接收该信号的参数。
我创建了一个最小的测试用例,演示了我想要做的事情:
min.py
from PySide import QtCore, QtGui, QtDeclarative
import sys
# init Qt
app = QtGui.QApplication(sys.argv)
# set up the signal
class Signaller(QtCore.QObject):
emitted = QtCore.Signal(str)
signaller = Signaller()
# Load the QML
qt_view = QtDeclarative.QDeclarativeView()
context = qt_view.rootContext()
context.setContextProperty('signaller', signaller)
qt_view.setResizeMode(QtDeclarative.QDeclarativeView.SizeRootObjectToView)
qt_view.setSource('min.qml')
qt_view.show()
# launch the signal
signaller.emitted.emit("Please display THIS text!")
# Run!
app.exec_()
和min.qml
import QtQuick 1.0
Rectangle {
width:300; height:100
Text {
id: display
text: "No signal yet detected!"
Connections {
target: signaller
onEmitted: {
display.text = "???" //how to get the argument?
}
}
}
}
谢谢!
答案 0 :(得分:3)
从Qt 4.8开始,PySide根本不处理信号参数名称。
但您可以创建一个带有命名参数的QML信号,并使用Javascript将您的python信号连接到它:
import QtQuick 1.0
Rectangle {
width:300; height:100
Text {
id: display
text: "No signal yet detected!"
signal reemitted(string text)
Component.onCompleted: signaller.emitted.connect(reemitted)
onReemitted: {
display.text = text;
}
}
}
答案 1 :(得分:3)
从Qt for Python版本5.12.5、5.13.1开始,其工作方式与PyQt中的相同:
| id | Date | Buyer | diff | Amount |
|----|:---------:|------:|------|--------|
| 4 | 6/15/2018 | Sandy | -243 | 1849 |
| 4 | 6/20/2018 | Sandy | 5 | 4193 |
QML:
from PySide2.QtCore import Signal
sumResult = Signal(int, arguments=['sum'])
sumResult.emit(42)
答案 2 :(得分:0)
对不起,我无法发表评论,因为我需要拥有更高的声誉。 响应“无法分配给不存在的属性”,这是由初始化应用程序的顺序引起的。 您的根上下文对象需要在引擎之前创建。
好:
context = Context()
engine = QQmlApplicationEngine()
engine.rootContext().setContextProperty("context", context)
不行:
engine = QQmlApplicationEngine()
context = Context()
engine.rootContext().setContextProperty("context", context)