更改圆形量规的值属性
Posted
技术标签:
【中文标题】更改圆形量规的值属性【英文标题】:Change value property of Circular gauge 【发布时间】:2016-10-11 12:28:50 【问题描述】:嗨,我知道这是一个古老而简单的问题,但我真的不明白。如何将我的圆形仪表的 value 属性从 python 动态更改为 qml 文件?我尝试了很多,但在开始时又站了起来。因为我对 QT 和 Python 很陌生,有人可以解释我该怎么做吗?我在这里复制了 qml 和空的 python 文件:
Python:
import sys
from PyQt5.QtCore import QObject, QUrl, Qt
from PyQt5.QtWidgets import QApplication
from PyQt5.QtQml import QQmlApplicationEngine
from PyQt5 import QtCore, QtGui
if __name__ == "__main__":
app = QApplication(sys.argv)
engine = QQmlApplicationEngine()
engine.load('dashboard.qml')
win = engine.rootObjects()[0]
win.textUpdated.connect(show)
win.show()
sys.exit(app.exec_())
还有 QML:
CircularGauge
value: 66 **(Thats the value I want to change from Python)**
maximumValue: 1
width: parent.width
height: parent.height * 0.7
y: parent.height / 2 + container.height * 0.01
style: IconGaugeStyle
id: tempGaugeStyle
icon: "qrc:/images/temperature-icon.png"
maxWarningColor: Qt.rgba(0.5, 0, 0, 1)
tickmarkLabel: Text
color: "white"
visible: styleData.value === 0 || styleData.value === 1
font.pixelSize: tempGaugeStyle.toPixels(0.225)
text: styleData.value === 0 ? "C" : (styleData.value === 1 ? "H" : "")
非常感谢你帮助一个菜鸟:)
居然有这个python:
class Celsius(QObject):
def __init__(self, temperature = 0.6):
self._temperature = temperature
@property
def temperature(self):
print("Getting value")
return self._temperature
@temperature.setter
def temperature(self, value):
if value < -273:
raise ValueError("Temperature below -273 is not possible")
print("Setting value")
self._temperature = value
rotatevalue = Celsius()
print(rotatevalue.temperature)
if __name__ == "__main__":
app = QApplication(sys.argv)
engine = QQmlApplicationEngine()
engine.load('dashboard.qml')
view = QQuickView()
root_context = view.rootContext().setContextProperty("valuepy", Celsius())
win = engine.rootObjects()[0]
win.textUpdated.connect(show)
win.show()
sys.exit(app.exec_())
QML 也是一样。如果我打印 rotatevalue.temperature,我在这个变量中有正确的值,但与 qml 的连接仍然是一个问题。 Python 在运行以下命令时说:
root_context = view.rootContext().setContextProperty("valuepy", Celsius()) RuntimeError: 从未调用过摄氏度类型的超类 init()。
而且这个值不在我的量表中。有什么想法吗?
【问题讨论】:
在 C++ 中,您将创建一个QObject
派生类,该派生类的属性类型与 QML 元素的 value
属性兼容。然后通过engine.rootContext().setContextProperty()
导出该类的实例我假设这也适用于Python,只是不确定属性的语法
感谢 Krammer 先生的帮助,但我可以做我想做的事,而不是让它工作,有没有人有一个简单的例子,将值从 Python 写入 qml?
重要的部分不是“写入 QML”,而是公开一个属性并绑定到 QML 端。
我发布了我的问题的编辑,问题是如何正确地做到这一点:)
啊,抱歉,没看到。我假设您的 QML 现在类似于 value: valuepy.temperature
?
【参考方案1】:
很遗憾,我无法在 Python 语法方面为您提供帮助,但这就是在 C++ 中的样子
class Celsius : public QObject
Q_OBJECT
Q_PROPERTY(double temperature READ temperature WRITE setTemperature NOTIFY temperatureChanged)
public:
explicit Celsius(double temperature = 0.6, QObject *parent = 0)
: QObject(parent), m_temperature(temperature)
double temperature() const return m_temperature;
void setTemperature(double temperature)
if (temperature == m_temperature) return;
if (temperature < -273) return;
m_temperature = temperature;
emit temperatureChanged();
signals:
void temperatureChanged();
;
也许有 PytQt 专业知识的人可以提出修改建议或基于此提出自己的答案。
【讨论】:
【参考方案2】:对于遇到同样问题的任何人,我发现,这里的代码似乎是正确的,非常感谢所有的帮助:
class Celsius(QObject):
def __init__(self, parent=None):
super().__init__(parent)
self.temperature = 0.3
@pyqtProperty(int)
def temperature(self):
return self._temperature
# Define the setter of the 'temperature' property.
@temperature.setter
def temperature(self, temperature):
self._temperature = temperature
rotatevalue = Celsius()
print(rotatevalue.temperature)
rot = rotatevalue.temperature
if __name__ == "__main__":
app = QApplication(sys.argv)
qmlRegisterType(Celsius, 'Celsius', 1, 0, 'Celsius')
view = QQuickView()
engine = QQmlApplicationEngine()
engine.rootContext().setContextProperty('valuepy', rot)
engine.load('dashboard.qml')
win = engine.rootObjects()[0]
win.show()
sys.exit(app.exec_())
【讨论】:
这不只是导出“rot”的单个值吗? IE。如果更改rotatevalue
的属性,QML 中的值会改变吗?
你的意思是它只给qml一次值而不是在程序运行和值改变时更新吗?
是的,它看起来像,但 python 在这里可能会做不同的事情
将尽快检查并在此处发表评论。以上是关于更改圆形量规的值属性的主要内容,如果未能解决你的问题,请参考以下文章
如何在Javascript中使用其旁边元素的值更改单元格的元素?
如何创建更改特定 uicollectionviewcell 属性的操作?