Привет, я знаю, что это старый и простой вопрос, но я действительно не понимаю. Как я могу изменить значение свойства моей круговой калибровки динамически из python в qml-файл? Я много старался, но стоял снова в начале. Потому что я очень новичок в QT и Python, может кто-нибудь объяснить мне, как это сделать? Я скопировал QML и пустой питона файл здесь:Изменить значение свойства Circular gauge
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" : "")
}
Большое спасибо за помощь нуб :)
На самом деле, имеющие этот питон:
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' производный класс который имеет свойство с типом, совместимым с свойством 'value' элемента QML. Затем экспортируйте экземпляр этого класса через 'engine.rootContext(). SetContextProperty()' Я предполагаю, что это также работает с Python, просто не уверен в синтаксисе свойств –
Спасибо за помощь г-на Краммера, но я могу сделать то, что Я хочу, чтобы он не работал, у кого-нибудь есть простой пример написания значения из Python в qml? –
Важной частью является не «писать в QML», а раскрывать свойство и связываться с ним на стороне QML. –