2016-07-12 19 views
1

Ich möchte ein QML-Modul mit einem Python "Backend" erstellen, wenn das sinnvoll ist. Grundsätzlich möchte ich QML verwenden, um zu definieren, wie die Komponente aussieht, und dann spezifisches Verhalten in einer Python-Klasse implementieren, was diesen QML-Typ erweitern sollte und - in meiner Vorstellung - irgendwie mit der QML-Komponente verknüpfbar sein muss.Qt5/PyQt5: Benutzerdefinierte QML-Komponenten mit QML-Frontend und Python-Backend

Ich verstehe, wie Sie eine benutzerdefinierte Klasse in Python erstellen und sie über QmlRegisterType für QML verfügbar machen. Das funktioniert so weit, aber dann die Zeichnung in der Klasse werden hat mich umgesetzt - ohne QML

(Im Grunde, was ich will, ist simliar auf den Weg, um es in Kivy mit der kv-Sprache erfolgt)

ein kleines Beispiel:

I implementiert ein einfaches Widget Colorpicker wie folgt aus:

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 

Jetzt möchte ich die GUI-Code (pixmap Ziehen usw.) bewegen, um eine QML ColorWheel.qml wie diese Datei :

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

Im Haupt QML Datei main.qml ich dann so etwas wie dies tun will:

import QtQuick 2.2 
import ColorWheel 1.0 

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

    ColorWheel { 
     radius: 200 
    } 
} 

Ist das überhaupt möglich? Ich konnte dazu in der Qt und PyQt Dokumentation nichts finden. Es geht immer darum, C++ - Klassen für QML oder umgekehrt verfügbar zu machen ...

Kann mir jemand in die richtige Richtung zeigen?

Vielen Dank!

Antwort

0

Wenn Sie von der QQuickItem erben und registrieren Sie es - es wird offensichtlich wie Item {} handeln.

Wenn Sie einige Eigenschaften auf der C++/Python-Seite hinzufügen - es wird ein Item mit Eigenschaften sein.

ColorWheelImpl.h (ein Python-Äquivalent machen):

class ColorWheelImpl: public QQuickItem 
{ 
... 
}; 

ColorWheel.qml:

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

Ihre Lösung ist genau das, was ich suchte. Es hat eine Weile gedauert, bis ich die Beziehungen der Namen von Dateien und Klassen herausgefunden hatte, aber jetzt macht es Sinn. Vielen Dank! – Spritkopf