Importación de QML desde un archivo de recursos (QRC) con PySide2

Nov 24 2020

He agregado un componente QML simple ("qml / MyButton") a mi archivo "resource.qrc":

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

Luego compilé el QRC en un módulo de Python con:

pyside2-rcc -o resource.py resource.qrc

Luego importé resource.py en 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_())

Y llamado componente MyButton en main.qml:

import QtQuick 2.13
import QtQuick.Window 2.13

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

    MyButton {

    }
}

Este es "qml / MyButton.qml":

import QtQuick 2.0
import QtQuick.Controls 2.13

Button {
    text: 'Click Me'
}

Cuando ejecuto el programa, aparece el error "MyButton no es un tipo". Quiero usar el componente QML usando el archivo de recursos generado por Python. No sé qué estoy haciendo mal.

Respuestas

1 eyllanesc Nov 24 2020 at 06:54

Importación automática si el .qml está al lado del archivo principal, pero en su caso, MyButton.qml no está al lado del main.qml, por lo que el paquete debe importarse:

import QtQuick 2.13
import QtQuick.Window 2.13

import "qrc:/qml"

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

    MyButton {
    }
}