更改圆形量规的值属性

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 在这里可能会做不同的事情 将尽快检查并在此处发表评论。

以上是关于更改圆形量规的值属性的主要内容,如果未能解决你的问题,请参考以下文章

如何根据标签更新 MicroMeter 量规

如何在Javascript中使用其旁边元素的值更改单元格的元素?

更改 AngularJS 属性会更改 HTML 属性的值

如何创建更改特定 uicollectionviewcell 属性的操作?

SSAS属性中更改AllowedBrowsingFolders的值后才能更改其它文件夹的值

Knockout JS,如何在更改可观察数组中的值时更改样式属性