2016-10-11 5 views
1

こんにちは私はこれは古くて簡単な質問だと知っていますが、実際には得られません。私のサーキュラーゲージの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:noobのを助けるため

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"、摂氏()) はRuntimeError:スーパークラス摂氏が呼び出されることはありませんでした()タイプののinit

この値はマイゲージにはありません。何か案は?

+0

これは、QML要素の 'value'プロパティと互換性のある型を持つプロパティを持ちます。 次に、 'engine.rootContext()。setContextProperty()'を使ってそのクラスのインスタンスをエクスポートします。 これはPythonでも動作すると仮定していますが、プロパティの構文についてはわかりません。 –

+0

助けてくれてありがとうKrammer私はそれを動作させたくないのですが、Pythonからqmlへの価値を書くという単純な例は誰にもありますか? –

+0

インポータント部分は、「QMLへの書き込み」ではなく、それを公開してQML側でそれにバインドすることです。 –

答えて

0

私は残念ながら、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と誰かノウハウが編集を提案するか、その上で自分の答えをベースにすることができます方法です。同じ問題を抱えてanyb​​odeするため

+0

ありがとうalotはできるだけ早くそれを試してコメントを書くでしょう... –

0

は、私が見つけた、ここで右に行くように見えるコードは、多くのすべてのご協力いただきありがとうございます:あなたは `QObject`派生クラスを作成しますC++では

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はここで別のことをしているかもしれません –

関連する問題