首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >未绘制自定义QQuickItem

未绘制自定义QQuickItem
EN

Stack Overflow用户
提问于 2021-07-11 15:27:31
回答 1查看 156关注 0票数 1

我试图编写自己的QQuickItems,它使用SceneGraph绘制形状,就好像父项是画布一样。我正在使用PySide6和Python。在我尝试的过程中,我在PySide6中发现了一个bug,这是早些时候报道的。我下载了修复它的修补程序,现在它似乎很好(https://bugreports.qt.io/browse/PYSIDE-1345)。

我的程序现在编译并运行,但没有绘制节点。如果我正确地理解了文档,我需要做三件事来绘制一个定制的QQuickItem:

QQuickItem

  • Override updatePaintNode

  • Set
  1. 继承ItemHasContents标志

我做了所有这些,注册了我的类型,在QML中添加了它,并确保它有非零维。不幸的是,它仍然没有被暂停。我不知道下一步该怎么办。

下面是最小的工作示例:main.py

代码语言:javascript
复制
# 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:

代码语言:javascript
复制
import QtQuick
import QtQuick.Window
import PythonTypes 1.0

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

    JustItem {

    }
}

结果是一个空的白色窗口。当我调整它的大小时,它会出现分段故障。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-11 18:19:56

这是PySide 2中的一个bug。目前无法在PySide 2中绘制自定义的QQuickItems。

这个bug将在这里进行更详细的讨论:https://forum.qt.io/topic/116585/qsggeometry-does-not-work-on-pyside2/16

还有一个bug报告,它有一个建议的修复方法。修复导致分段错误:https://bugreports.qt.io/browse/PYSIDE-1345

不幸的是,如果您想要绘制自定义QQuickItems,您要么需要用C++编写它们,要么完全使用另一个GUI框架。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68337583

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档