Qt 从自定义QML库导入QML组件

Qt 从自定义QML库导入QML组件,qt,qml,pyside,Qt,Qml,Pyside,我创建了一个库来存储为应用程序制作的自定义QML组件。我将Pyside6与python一起使用。这是基本目录的外观: library | |__CustomComponents | |__Components1 | |__CustomComponent1.qml | |__test |__MainComponent |__main.py |__Main.qml 库和测试处于同一级别。我希望能够访问CustomComponen

我创建了一个库来存储为应用程序制作的自定义QML组件。我将Pyside6与python一起使用。这是基本目录的外观:

library
|    |__CustomComponents
|       |__Components1  
|          |__CustomComponent1.qml
|
|__test
   |__MainComponent
      |__main.py
      |__Main.qml
库和测试处于同一级别。我希望能够访问CustomComponent1.qml文件,以便在Main.qml中使用,但是如何在Python中为其编写导入语句呢?另外,为了能够将组件1作为模块导入,qmldir文件是否就是我需要的全部?如果有一个命令可以用来生成制作模块所需的文件,那就太好了

编辑:是否可以同时使用QQuickView和QQmlApplicationEngine

view = QQuickView()
view.setResizeMode(QQuickView.SizeRootObjectToView);

newWidget = newWidget()
view.rootContext().setContextProperty("headerWidget", headerWidget)

qml_file = os.fspath(Path(__file__).resolve().parent / 'Main.qml')
view.setSource(QUrl.fromLocalFile(qml_file))
if view.status() == QQuickView.Error:
    sys.exit(-1)
view.show()

您必须使用qmldir来指示该文件夹中有一个模块,要使用该模块,它必须位于引擎的导入列表中,为此,您必须使用该方法

CustomComponent1.qml

import QtQuick

Rectangle{
    id: root
    width: 100
    height: 100
    color: "salmon"
}
qmldir

模块组件1
CustomComponent1 CustomComponent1.qml
main.py

导入操作系统
从pathlib导入路径
导入系统
从PySide6.QtCore导入QCoreApplication、Qt、QUrl
从PySide6.QtGui导入qgui应用程序
从PySide6.QtQml导入QQmlApplicationEngine
当前\u目录=路径(\u文件\u).resolve().parent
库目录=当前目录。父目录[1]/“库”/“自定义组件”
def main():
app=qgui应用程序(sys.argv)
引擎=QQmlApplicationEngine()
engine.addImportPath(os.fspath(库目录))
url=QUrl.fromLocalFile(os.fspath(当前目录/“main.qml”))
创建的def句柄对象(对象、对象url):
如果obj为无且url==obj_url:
QCoreApplication.exit(-1)
engine.objectCreated.connect(
句柄\u对象\u已创建,Qt.ConnectionType.QueuedConnection
)
引擎加载(url)
sys.exit(app.exec())
如果名称=“\uuuuu main\uuuuuuuu”:
main()
main.qml

import QtQuick
import QtQuick.Window

import Components1

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

    CustomComponent1{

    }
}
import QtQuick

import Components1

Rectangle {
    width: 640
    height: 480

    CustomComponent1{

    }
}
QQuickView 对于QQuickView,它有一个引擎,因此您必须使用该引擎,因此更改如下:

main.py

导入操作系统
从pathlib导入路径
导入系统
从PySide6.QtCore导入QCoreApplication、Qt、QUrl
从PySide6.QtGui导入qgui应用程序
从PySide6.QtQuick导入QQuickView
当前\u目录=路径(\u文件\u).resolve().parent
库目录=当前目录。父目录[1]/“库”/“自定义组件”
def main():
app=qgui应用程序(sys.argv)
视图=QQuickView()
view.engine().addImportPath(os.fspath(库目录))
url=QUrl.fromLocalFile(os.fspath(当前目录/“main.qml”))
def句柄_状态_已更改(状态):
如果状态==QQuickView。错误:
QCoreApplication.exit(-1)
view.statusChanged.connect(
句柄\状态\已更改,Qt.ConnectionType.QueuedConnection
)
view.setSource(url)
view.show()
sys.exit(app.exec())
如果名称=“\uuuuu main\uuuuuuuu”:
main()
main.qml

import QtQuick
import QtQuick.Window

import Components1

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

    CustomComponent1{

    }
}
import QtQuick

import Components1

Rectangle {
    width: 640
    height: 480

    CustomComponent1{

    }
}

我看到您使用的是
QQmlApplicationEngine
,但我使用的是
QQuickView
,因为我必须使用
QQuickView
setContextProperty()
方法设置一些全局对象。我在问题中添加了一段关于如何使用我的
QQuickView
。它们是否可以以某种方式组合,或者我必须使用
QQuickView
qqqmlaplicationengine
?@SCP3008先生,在发布我的答案时,您的帖子没有指出任何关于QQuickView的内容,因此我的答案可以有效地涵盖几个元素(qqmlaplicationengine、QQuickView、QQuickWidget等)或者我只专注于我认为最好的一个(一枚硬币),在这种情况下,选择后者。请避免在后续帖子中出现混淆请准确,OP在最初没有发布任何内容后添加代码是很烦人的,你不觉得吗?很抱歉给您带来麻烦,我不知道我是否使用了QQmlApplicationEngine、QQuickView、,或者等等,因为我认为从另一个目录导入只是正确地编写导入语句/添加到qmldir中。我非常感谢你花时间和精力帮助我完成这件事。