PySide2 QML - 如何在另一个 QML 文件中引用 QML 文件作为组件?
PySide2 QML - How to reference QML file within another QML file as component?
我在同一文件夹中有 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 和其中两个元素的 window。此代码取自 official tutorial 并进行了更改,因此我可以看到在其他 QML 文件中引用 QML 文件是如何工作的。我得到的只是一个白色 window,所以我猜委托不会被 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。
感谢 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
一起使用 MyModel.qml
外包并引用为 model: MyModel {}
我在同一文件夹中有 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 和其中两个元素的 window。此代码取自 official tutorial 并进行了更改,因此我可以看到在其他 QML 文件中引用 QML 文件是如何工作的。我得到的只是一个白色 window,所以我猜委托不会被 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。
感谢 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
一起使用 MyModel.qml
外包并引用为 model: MyModel {}