自定义 QQuickItem 未绘制
Custom QQuickItem is not painted
我正在尝试编写自己的 QQuickItems,它使用 SceneGraph 绘制形状,就好像它的父项是 Canvas。我正在使用 PySide6 和 Python。在我尝试的过程中,我在 PySide6 中发现了一个错误,该错误早先已报告过。我下载了修复它的补丁,现在似乎没问题了(https://bugreports.qt.io/browse/PYSIDE-1345)。
我的程序现在可以编译运行了,但是节点没有被绘制。如果我正确理解文档,我需要做三件事来绘制自定义 QQuickItem:
- 继承自QQuickItem
- 覆盖 updatePaintNode
- 设置 ItemHasContents 标志
我做了所有这些,注册了我的类型,将其添加到 QML 中并确保它具有非零维度。不幸的是,它仍然没有得到 paited。我不知道下一步该怎么做。
这是最小的工作示例:
main.py
# This Python file uses the following encoding: utf-8
import os
from pathlib import Path
import sys
from PySide6.QtGui import QGuiApplication, QColor
from PySide6.QtQml import QQmlApplicationEngine, qmlRegisterType
from PySide6.QtQuick import QQuickItem, QSGGeometryNode, QSGGeometry, QSGFlatColorMaterial
class JustItem(QQuickItem):
def __init__(self, parent=None):
super().__init__(parent)
self.setFlag(QQuickItem.ItemHasContents)
def updatePaintNode(self, node, update_data):
if node is None:
node = QSGGeometryNode()
geometry = QSGGeometry(QSGGeometry.defaultAttributes_Point2D(), 4)
geometry.setDrawingMode(QSGGeometry.DrawTriangles)
vertex_data = geometry.vertexDataAsPoint2D()
vertex_data[0].set(10, 10)
vertex_data[1].set(100, 10)
vertex_data[2].set(100, 100)
vertex_data[3].set(10, 100)
material = QSGFlatColorMaterial()
material.setColor(QColor(255, 0, 0, 127))
node.setGeometry(geometry)
node.setMaterial(material)
return node
if __name__ == "__main__":
qmlRegisterType(JustItem, "PythonTypes", 1, 0, "JustItem")
app = QGuiApplication(sys.argv)
engine = QQmlApplicationEngine()
engine.load(os.fspath(Path(__file__).resolve().parent / "main.qml"))
if not engine.rootObjects():
sys.exit(-1)
sys.exit(app.exec())
和 QML:
import QtQuick
import QtQuick.Window
import PythonTypes 1.0
Window {
width: 640
height: 480
visible: true
title: qsTr("Hello World")
JustItem {
}
}
结果是空白 window。当我调整它的大小时,它会出现段错误。
这是 PySide 2 中的错误。目前无法在 PySide 2 中绘制自定义 QQuickItems。
此处更详细地讨论了该错误:https://forum.qt.io/topic/116585/qsggeometry-does-not-work-on-pyside2/16
还有一个错误报告,其中包含建议的修复。修复导致分段错误:https://bugreports.qt.io/browse/PYSIDE-1345
不幸的是,如果您想绘制自定义 QQuickItems,您要么需要用 C++ 编写它们,要么完全使用另一个 GUI 框架。
我正在尝试编写自己的 QQuickItems,它使用 SceneGraph 绘制形状,就好像它的父项是 Canvas。我正在使用 PySide6 和 Python。在我尝试的过程中,我在 PySide6 中发现了一个错误,该错误早先已报告过。我下载了修复它的补丁,现在似乎没问题了(https://bugreports.qt.io/browse/PYSIDE-1345)。
我的程序现在可以编译运行了,但是节点没有被绘制。如果我正确理解文档,我需要做三件事来绘制自定义 QQuickItem:
- 继承自QQuickItem
- 覆盖 updatePaintNode
- 设置 ItemHasContents 标志
我做了所有这些,注册了我的类型,将其添加到 QML 中并确保它具有非零维度。不幸的是,它仍然没有得到 paited。我不知道下一步该怎么做。
这是最小的工作示例:
main.py
# This Python file uses the following encoding: utf-8
import os
from pathlib import Path
import sys
from PySide6.QtGui import QGuiApplication, QColor
from PySide6.QtQml import QQmlApplicationEngine, qmlRegisterType
from PySide6.QtQuick import QQuickItem, QSGGeometryNode, QSGGeometry, QSGFlatColorMaterial
class JustItem(QQuickItem):
def __init__(self, parent=None):
super().__init__(parent)
self.setFlag(QQuickItem.ItemHasContents)
def updatePaintNode(self, node, update_data):
if node is None:
node = QSGGeometryNode()
geometry = QSGGeometry(QSGGeometry.defaultAttributes_Point2D(), 4)
geometry.setDrawingMode(QSGGeometry.DrawTriangles)
vertex_data = geometry.vertexDataAsPoint2D()
vertex_data[0].set(10, 10)
vertex_data[1].set(100, 10)
vertex_data[2].set(100, 100)
vertex_data[3].set(10, 100)
material = QSGFlatColorMaterial()
material.setColor(QColor(255, 0, 0, 127))
node.setGeometry(geometry)
node.setMaterial(material)
return node
if __name__ == "__main__":
qmlRegisterType(JustItem, "PythonTypes", 1, 0, "JustItem")
app = QGuiApplication(sys.argv)
engine = QQmlApplicationEngine()
engine.load(os.fspath(Path(__file__).resolve().parent / "main.qml"))
if not engine.rootObjects():
sys.exit(-1)
sys.exit(app.exec())
和 QML:
import QtQuick
import QtQuick.Window
import PythonTypes 1.0
Window {
width: 640
height: 480
visible: true
title: qsTr("Hello World")
JustItem {
}
}
结果是空白 window。当我调整它的大小时,它会出现段错误。
这是 PySide 2 中的错误。目前无法在 PySide 2 中绘制自定义 QQuickItems。
此处更详细地讨论了该错误:https://forum.qt.io/topic/116585/qsggeometry-does-not-work-on-pyside2/16
还有一个错误报告,其中包含建议的修复。修复导致分段错误:https://bugreports.qt.io/browse/PYSIDE-1345
不幸的是,如果您想绘制自定义 QQuickItems,您要么需要用 C++ 编写它们,要么完全使用另一个 GUI 框架。