#python #qt #pyqt5 #gauge
#python #qt #pyqt5 #датчик
Вопрос:
Привет, я знаю, что это старый и простой вопрос, но я действительно его не понимаю. Как я могу динамически изменять свойство значения моего кругового датчика из 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()) Ошибка выполнения: инициализация суперкласса () типа Celsius никогда не вызывалась.
И значение не в моем датчике. Есть идеи?
Комментарии:
1. В C вы должны создать
QObject
производный класс, который имеет свойство с типом, совместимым соvalue
свойством элемента QML. Затем экспортируйте экземпляр этого класса черезengine.rootContext().setContextProperty()
Я предполагаю, что это также работает с Python, просто не уверен в синтаксисе свойств2. Спасибо за помощь, мистер Краммер, но я могу делать то, что хочу, не заставляя это работать, у кого-нибудь есть простой пример записи значения из Python в qml?
3. Важная часть заключается не в том, чтобы «записывать в QML», а в том, чтобы предоставить свойство и привязать его к нему на стороне QML.
4. Я опубликовал редактирование своего вопроса, вопрос в том, как это сделать 🙂
5. Ах, извините, этого не видел. Я предполагаю, что ваш 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_())
Комментарии:
1. Разве это не просто экспорт единственного значения для «rot»? Т.е. Если вы измените свойство
rotatevalue
, изменится ли значение в QML?2. Вы имеете в виду, что он присваивает значение qml только один раз и не обновляется при запуске программы и изменении значения?
3. да, так это выглядит, но python может делать здесь что-то по-другому
4. Проверим это как можно скорее и дадим комментарий здесь.