如何使用 PySide2 在 qml 中设置值?
How to set values in qml using PySide2?
我想从 PySide2 将值写入 qml。此值动态变化。
此处为 PyQt5 示例:
main.py:
import sys
from PySide2.QtCore import QObject, Signal, Property, QUrl, QTimer, QDateTime
from PySide2.QtGui import QGuiApplication
from PySide2.QtQml import QQmlApplicationEngine
class Foo(QObject):
textChanged = Signal()
def __init__(self, parent=None):
QObject.__init__(self, parent)
self._text = ""
@Property(str, notify=textChanged)
def text(self):
return self._text
@text.setter
def text(self, value):
if self._text == value:
return
self._text = value
self.textChanged.emit()
def update_value():
obj.text = "values from PyQt5 :-D : {}".format(QDateTime.currentDateTime().toString())
if __name__ == "__main__":
app = QGuiApplication(sys.argv)
obj = Foo()
timer = QTimer()
timer.timeout.connect(update_value)
timer.start(100)
engine = QQmlApplicationEngine()
engine.rootContext().setContextProperty("obj", obj)
engine.load(QUrl("main.qml"))
if not engine.rootObjects():
sys.exit(-1)
sys.exit(app.exec_())
main.qml:
import QtQuick 2.5
import QtQuick.Window 2.2
Window {
id: parwin
visible: true
width: 640
height: 480
Text{
anchors.fill: parent
text: obj.text
}
}
我收到错误:
main.qml:11:9: Unable to assign [undefined] to QString
main.qml:11: TypeError: Cannot read property 'text' of null
告诉我哪里错了?
PySide2 似乎有 setter 的错误,所以它没有正确注册 属性,解决方案是创建一个 setter 和 getter不同的名称并分别使用 属性() 来公开它:
# ...
class Foo(QObject):
textChanged = Signal()
def __init__(self, parent=None):
QObject.__init__(self, parent)
self._text = ""
<b>def get_text(self):</b>
return self._text
<b>def set_text(self, value):</b>
if self._text == value:
return
self._text = value
self.textChanged.emit()
<b>text = Property(str, fget=get_text, fset=set_text, notify=textChanged)</b>
# ...
我想从 PySide2 将值写入 qml。此值动态变化。
此处为 PyQt5 示例:
main.py:
import sys
from PySide2.QtCore import QObject, Signal, Property, QUrl, QTimer, QDateTime
from PySide2.QtGui import QGuiApplication
from PySide2.QtQml import QQmlApplicationEngine
class Foo(QObject):
textChanged = Signal()
def __init__(self, parent=None):
QObject.__init__(self, parent)
self._text = ""
@Property(str, notify=textChanged)
def text(self):
return self._text
@text.setter
def text(self, value):
if self._text == value:
return
self._text = value
self.textChanged.emit()
def update_value():
obj.text = "values from PyQt5 :-D : {}".format(QDateTime.currentDateTime().toString())
if __name__ == "__main__":
app = QGuiApplication(sys.argv)
obj = Foo()
timer = QTimer()
timer.timeout.connect(update_value)
timer.start(100)
engine = QQmlApplicationEngine()
engine.rootContext().setContextProperty("obj", obj)
engine.load(QUrl("main.qml"))
if not engine.rootObjects():
sys.exit(-1)
sys.exit(app.exec_())
main.qml:
import QtQuick 2.5
import QtQuick.Window 2.2
Window {
id: parwin
visible: true
width: 640
height: 480
Text{
anchors.fill: parent
text: obj.text
}
}
我收到错误:
main.qml:11:9: Unable to assign [undefined] to QString
main.qml:11: TypeError: Cannot read property 'text' of null
告诉我哪里错了?
PySide2 似乎有 setter 的错误,所以它没有正确注册 属性,解决方案是创建一个 setter 和 getter不同的名称并分别使用 属性() 来公开它:
# ...
class Foo(QObject):
textChanged = Signal()
def __init__(self, parent=None):
QObject.__init__(self, parent)
self._text = ""
<b>def get_text(self):</b>
return self._text
<b>def set_text(self, value):</b>
if self._text == value:
return
self._text = value
self.textChanged.emit()
<b>text = Property(str, fget=get_text, fset=set_text, notify=textChanged)</b>
# ...