如何在 python 中创建路径并将其显示在 qml 画布上

Posted

技术标签:

【中文标题】如何在 python 中创建路径并将其显示在 qml 画布上【英文标题】:How to make a path in python and display it on a qml canvas 【发布时间】:2021-04-28 10:12:36 【问题描述】:

我正在尝试在 python 中创建一个路径并将其显示在 qml 画布中,但我无法使其工作。

我尝试创建一个@QtCore.pyqtSlot,但该类型似乎不受支持。

这是我的最小模型:

from PyQt5 import QtCore, QtGui

class PathModel(QtCore.QAbstractListModel):
    signal = QtCore.pyqtSignal()
    
    def __init__(self):
        super().__init__()
        self.path = QtGui.QPainterPath()
        self.path.addRect(50,50,100,100)
    
    @QtCore.pyqtSlot(result = QtCore.QVariant)
    def returnPath(self):
        return self.path

和 qml 文件:

import QtQuick 2.5
import QtQuick.Controls 2.15
import QtQuick.Layouts 1.15
import QtQuick.Window 2.11


Window 
    id: root
     Rectangle 
        id: conteneurCanvas
        Canvas 
            id: mycanvas
            width: parent.width
            height: parent.height
            contextType: "2d"
            onPaint: 
                context.path = path_model.returnPath();
                context.stroke();
            
        
    


另一种可能性是通过一些js代码动态创建它,但我对这种语言不是很熟悉,所以我做了类似这个女巫的事情显然行不通。

import QtQuick 2.5
import QtQuick.Controls 2.15
import QtQuick.Layouts 1.15
import QtQuick.Window 2.11


Window 
    id: root
     Rectangle 
        id: conteneurCanvas
        Canvas 
            id: mycanvas
            width: parent.width
            height: parent.height
            contextType: "2d"

            Path 
                id: myPath
            

            for (var i = 0; i < 5; i++) 
                // All the elements will be send through slot but for the exemple ...
                myPath.PathLine  x: i*100 ; y: 100 
             

            onPaint: 
                context.path = myPath;
                context.stroke();
            
        
    


【问题讨论】:

【参考方案1】:

我在本教程中找到了正确的语法:

https://master.qt.io/learning/developerguides/canvastutorial/QtQuickCanvasTutorial.pdf

最后我们得到了这种语法:

Window 
    id: root
     Rectangle 
        id: conteneurCanvas
        Canvas 
            id: mycanvas
            width: parent.width
            height: parent.height
            contextType: "2d"

            onPaint: 
                context.beginPath()
                context.moveTo(0,0)
                for (let i = 0; i < 5; i++) 
                    // Do what you want
                    context.lineTo(i*20,10*i*i)
                 
                context.lineWidth = 1;
                context.stroke()
            
        
    


【讨论】:

以上是关于如何在 python 中创建路径并将其显示在 qml 画布上的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ram 中创建目录并获取它的路径? [复制]

如何在 PyCharm 中创建模块并将其导入?

使用 Argparse 在 Python 中创建文件转换器

如何在 JSP/Java 中创建多维 HashMap 或 Hashtable 并将其转换为 JSON 对象?

如何在 C++ 中创建 Lua 表,并将其传递给 Lua 函数?

如何在 Jenkins 中创建用户并将其添加到组中以进行身份​​验证?