PySide2 QML - 如何在另一个 QML 文件中引用 QML 文件作为组件?
Posted
技术标签:
【中文标题】PySide2 QML - 如何在另一个 QML 文件中引用 QML 文件作为组件?【英文标题】:PySide2 QML - How to reference QML file within another QML file as component? 【发布时间】:2018-12-06 14:37:11 【问题描述】:我在同一个文件夹中有 3 个文件:
form.py
from __future__ import print_function
import sys, os
from PySide2.QtCore import QFile, QObject, QUrl
from PySide2.QtGui import QGuiApplication
from PySide2.QtQuick import QQuickView
if __name__ == '__main__':
app = QGuiApplication(sys.argv)
view = QQuickView()
view.setResizeMode(QQuickView.SizeRootObjectToView)
qmlFile = os.path.join(os.path.dirname(__file__), 'Main.qml')
view.setSource(QUrl.fromLocalFile(os.path.abspath(qmlFile)))
if view.status() == QQuickView.Error:
sys.exit(-1)
view.show()
app.exec_()
del view
Main.qml
import QtQuick 2.10
Item
width: 200
height: 200
ListModel
id: myModel
ListElement type: "Dog"; age: 8
ListElement type: "Cat"; age: 5
ListView
anchors.fill: parent
model: myModel
delegate: MyDelegate
MyDelegate.qml
import QtQuick 2.10
Component
id: myDelegate
Text text: type + ", " + age
运行 form.py 应该会给我一个带有 ListView 和两个元素的窗口。此代码取自 official tutorial 并进行了更改,因此我可以看到在其他 QML 文件中引用 QML 文件是如何工作的。我得到的只是一个白色窗口,所以我猜想Main.qml
没有加载代理。
MyDelegate.qml
的第一个字母是大写的,所以Main.qml
应该会自动加载委托。我期待这种行为,因为它是问题的解决方案:Include another QML file from a QML file
在许多教程中,包括一些针对 PyQt5 的教程,我看到他们引用了其他类似的 QML 文件。
如果我将Component ...
部分复制到Main.qml
中并将ListView ...
中的委托引用从MyDelegate
更改为myDelegate
,它就可以工作。
我想将任何 QML 节点外包到单独的文件中都会出现此问题。
PySide2 不支持这个功能,还是我必须在form.py
中做一些魔术让Main.qml
知道还有另一个 QML 文件要加载?
我安装了当前的***
pip install --index-url=http://download.qt.io/snapshots/ci/pyside/5.11/latest/ pyside2 --trusted-host download.qt.io
来自安装 Python 3.6 的 Windows 10 64 位计算机上的 official wiki。
【问题讨论】:
在您的ListView
中,代表应该是:delegate: MyDelegate
- 您缺少大括号
。
在您的MyDelegate.qml
中,Component
是不必要的。当您将其分配给 Component
类型的属性时,它将自动添加
错字:把delegate: MyDelegate
改成delegate: MyDelegate
如果Component
是不必要的,我应该在MyDelegate.qml
中使用什么来代替?我必须用一些东西包围id:...
和text:...
。
@AlfradS。只使用import QtQuick 2.10
Text text: type + ", " + age
【参考方案1】:
感谢 derM 和 eyllanesc 指出 MyDelegate.qml
的参考文献中有错字。引用应带大括号delegate: MyDelegate
。
正确的 form.py 现在是:
import QtQuick 2.10
Item
width: 200
height: 200
ListModel
id: myModel
ListElement type: "Dog"; age: 8
ListElement type: "Cat"; age: 5
ListView
anchors.fill: parent
model: myModel
delegate: MyDelegate
它甚至可以与在 MyModel.qml
中外包并引用为 model: MyModel
的 myModel
一起使用
【讨论】:
以上是关于PySide2 QML - 如何在另一个 QML 文件中引用 QML 文件作为组件?的主要内容,如果未能解决你的问题,请参考以下文章
使用 PySide2 将 python 信号连接到 QML ui 插槽
PySide2 + QML:QApplication:通过了无效的样式覆盖,忽略它