Importation de QML à partir d'un fichier de ressources (QRC) avec PySide2

Nov 24 2020

J'ai ajouté un simple composant QML ("qml / MyButton") à mon fichier "resource.qrc":

<RCC>
<qresource prefix="/">
    <file>qml/MyButton.qml</file>
</qresource>
</RCC>

J'ai ensuite compilé le QRC en un module python avec:

pyside2-rcc -o resource.py resource.qrc

Ensuite, j'ai importé resource.py dans main.py:

import sys
import os

from PySide2.QtGui import QGuiApplication
from PySide2.QtQml import QQmlApplicationEngine

import resource

if __name__ == "__main__":
    app = QGuiApplication(sys.argv)
    engine = QQmlApplicationEngine()
    engine.load(os.path.join(os.path.dirname(__file__), "main.qml"))

    if not engine.rootObjects():
        sys.exit(-1)
    sys.exit(app.exec_())

Et appelé composant MyButton dans main.qml:

import QtQuick 2.13
import QtQuick.Window 2.13

Window {
    width: 640
    height: 480
    visible: true
    title: qsTr("Hello World")

    MyButton {

    }
}

C'est "qml / MyButton.qml":

import QtQuick 2.0
import QtQuick.Controls 2.13

Button {
    text: 'Click Me'
}

Lorsque j'exécute le programme, j'obtiens l'erreur "MyButton n'est pas un type". Je souhaite utiliser le composant QML en utilisant le fichier de ressources généré par python. Je ne sais pas ce que je fais de mal.

Réponses

1 eyllanesc Nov 24 2020 at 06:54

Importation automatique si le .qml est à côté du fichier principal mais dans votre cas MyButton.qml n'est pas à côté du main.qml, le package doit donc être importé:

import QtQuick 2.13
import QtQuick.Window 2.13

import "qrc:/qml"

Window {
    width: 640
    height: 480
    visible: true
    title: qsTr("Hello World")

    MyButton {
    }
}