2016-10-11 2 views
1

Hallo Ich weiß, das ist eine alte und einfache Frage, aber ich verstehe es wirklich nicht. Wie kann ich die Werteigenschaft meines Kreismaßes dynamisch von Python in die qml-Datei ändern? Ich habe viel versucht, aber am Anfang wieder stehen. Weil ich neu bei QT und Python bin, kann mir jemand erklären, wie ich es machen soll? Ich kopierte die qml und die leere Python-Datei hier:Ändern Wert Eigenschaft der kreisförmigen Lehre

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

Und das 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" : "") 
        } 

Vielen Dank für einen Noob helfen :)

Eigentlich haben Dieser 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 ist das gleiche. Wenn ich rotatevalue.temperature drucke, habe ich den richtigen Wert in dieser Variablen, aber die Verbindung zu der qml ist immer noch ein Problem. Python sagt auf Lauf folgende:.

root_context = view.rootContext() setContextProperty ("valuepy", Celsius()) Runtime: super-Klasse init() vom Typ Celsius wurde nie genannt.

Und der Wert ist nicht in meinem Messgerät. Irgendwelche Ideen?

+0

In C++ Sie eine 'QObject' abgeleiteten Klasse schaffen würde Das hat eine Eigenschaft mit einem Typ, der mit der Eigenschaft 'value' des QML-Elements kompatibel ist. Dann exportieren Sie eine Instanz dieser Klasse über 'engine.rootContext(). SetContextProperty()' Ich nehme an, das funktioniert auch mit Python, nur nicht sicher über die Syntax für Eigenschaften –

+0

Danke für die Hilfe Herr Krammer, aber ich kann was tun Ich möchte, dass es nicht funktioniert, hat jemand ein einfaches Beispiel, einen Wert von Python in qml zu schreiben? –

+0

Der wichtige Teil besteht darin, nicht "in QML zu schreiben", sondern eine Eigenschaft anzuzeigen und diese auf der QML-Seite zu binden. –

Antwort

0

Ich bin leider nicht in der Lage Dir mit der Python-Syntax zu helfen, aber das ist, wie die 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(); 
}; 
schauen würde

Vielleicht hat jemand mit PytQt Know-How bearbeitet schlagen kann oder gründen ihre eigene Antwort auf dem .

+0

Vielen Dank versuchen Sie es so schnell wie möglich und schreiben Sie einen Kommentar ... –

0

Für anybode das gleiche Problem, fand ich heraus, hier ist der Code, der nach rechts zu gehen scheint, vielen Dank für den helfenden:

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

Ist das nicht nur den einzelnen Wert für "rot" zu exportieren? I.e. Wenn Sie die Eigenschaft 'rotatevalue' ändern, ändert sich der Wert in QML? –

+0

Meinst du es gibt nur den Wert der qml einmal und nicht aktualisieren, wenn das Programm läuft und Wert ändert? –

+0

Ja, das, wie es aussieht, aber Python könnte die Dinge hier anders machen –

Verwandte Themen