2016-10-11 9 views
1

Привет, я знаю, что это старый и простой вопрос, но я действительно не понимаю. Как я могу изменить значение свойства моей круговой калибровки динамически из 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() типа Цельсия никогда не называли.

И значение не в моей калибровке. Есть идеи?

+0

В C++ вы можете создать 'QObject' производный класс который имеет свойство с типом, совместимым с свойством 'value' элемента QML. Затем экспортируйте экземпляр этого класса через 'engine.rootContext(). SetContextProperty()' Я предполагаю, что это также работает с Python, просто не уверен в синтаксисе свойств –

+0

Спасибо за помощь г-на Краммера, но я могу сделать то, что Я хочу, чтобы он не работал, у кого-нибудь есть простой пример написания значения из Python в qml? –

+0

Важной частью является не «писать в QML», а раскрывать свойство и связываться с ним на стороне QML. –

ответ

0

Я, к сожалению, не в состоянии помочь вам с синтаксисом Python, но это, как это будет выглядеть в

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(); 
}; 

C++ Может кто-то с PytQt ноу-хау может предложить редактировать или основывать свой ответ на это ,

+0

спасибо alot попробует как можно скорее и напишет комментарий ... –

0

Для anybode с той же проблемой, я узнал, вот код, который, кажется, идет вправо, спасибо за все порцией:

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_()) 
+0

Разве это не просто экспорт единственного значения для «гниения»? То есть если вы измените свойство 'rotatevalue', изменится ли значение в QML? –

+0

Вы имеете в виду, что он дает значение qml один раз и не обновляется при запуске программы и изменении значения? –

+0

Да, это то, на что это похоже, но python может поступить иначе. –