2016-07-12 6 views
1

QMLモジュールを作成するには、「バックエンド」という意味のPythonを使用します。基本的には、QMLを使用して、コンポーネントの外観を定義し、Pythonクラスで特定の動作を実装する必要があります。これはこのQMLタイプを拡張し、想像力ではQMLコンポーネントにリンク可能でなければなりません。Qt5/PyQt5:QMLフロントエンドとPythonバックエンドを持つカスタムQMLコンポーネント

私はPythonでカスタムクラスを作成し、qmlRegisterTypeでQMLで使用できるようにする方法を理解しています。これは、これまでに動作しますが、その後、すべての描画がクラス自体に実装されるようにしている - 無QML

(基本的に、私がしたいこと、それはKV-言語にkivyで行われている方法にsimliarです)

小さな例:

は、私はこのような単純なColorPickerのウィジェットを実装:

class ColorWheel(QLabel): 
    radius = 0 

    color_changed = pyqtSignal(float, float) 

    def __init__(self, width, height): 
     super().__init__() 

     pixmap = QPixmap("colorwheel.png").scaled(width, height) 

     self.setFixedSize(width, height) 
     self.setPixmap(pixmap) 
     self.radius = width/2 

    def mouseReleaseEvent(self, event): 
     # {...} get mouse position, calc polar corrdinates (omitted) 
     # emit signal: new color was selected 
     self.color_changed.emit(r, angle) 

    def get_polar(self, x, y): 
     # {...} calculate polar coordinates for HSV color space (omitted) 
     return r, theta 

今、私はこのようなQMLファイルColorWheel.qmlにGUIコード(ピックスマップ描画など)を移動したいです:

私はこのような何かをしたいメインQMLファイルmain.qmlで
import QtQuick 2.0 
Item { 
    Image { 
     id: img 
     anchors.fill: parent 
     source: "./colorwheel.png" 
    } 
} 

import QtQuick 2.2 
import ColorWheel 1.0 

ApplicationWindow { 
    title: qsTr("Test Invoke") 
    width: 500 
    height: 400 

    ColorWheel { 
     radius: 200 
    } 
} 

これはさえ可能ですか? QtとpyQtのドキュメントでこれについて何も見つかりませんでした。常にC++クラスをQMLや他の方法で利用できるようにすることです。

誰かが正しい方向に向いていますか?

多くの感謝!

答えて

0

QQuickItemから継承して登録すると、明らかにItem {}のようになります。

C++/python側にいくつかのプロパティを追加すると、プロパティを持つItemになります。

ColorWheelImpl.h(Pythonの同等を作る):

class ColorWheelImpl: public QQuickItem 
{ 
... 
}; 

ColorWheel.qml

import QtQuick 2.0 
ColorWheelImpl { 
    Image { 
     id: img 
     anchors.fill: parent 
     source: "./colorwheel.png" 
    } 
} 
+0

あなたのソリューションは、私が探していたまさにです。ファイルやクラスの名前の関係を理解するのに時間がかかりましたが、今はそれが理にかなっています。ありがとうございました! – Spritkopf

関連する問題