【问题标题】:Saving QML's ChartView to image file in PyQt5将 QML 的 ChartView 保存到 PyQt5 中的图像文件
【发布时间】:2020-12-29 05:00:27
【问题描述】:

我的方法差不多是这样的:

Chart.qml:

Window {
    ChartView {
        id: chartView
        // ...
    }

    Button {
        text: "save"
        onClicked: manager.save(chartView)
    }
}

Manager.py:

class Manager(QObject):
    @pyqtSlot(QObject)
    def save(self, chartview):
        img = chartview.grab()
        img.save(MY_DEFAULT_PATH)

当然,问题在于 Manager.save() 内部的图表视图相当于 C++ 的 QObject*,它没有“抓取”方法。但它可以被降级为QChartView*(或至少QWidget*),这种方法具有。在 C++ 中,我可能会使用 qobject_cast。

我的问题是:

  1. 这种向下转换在 PyQt 中可行吗?
  2. 如果没有 - 您知道如何以不同的方式完成吗?

【问题讨论】:

    标签: python pyqt pyqt5 qml qtcharts


    【解决方案1】:

    在给出答案之前,最好澄清帖子中的一些错误:

    • QML ChartView 是一个 Item,而 QChartView 是一个 QWidget。该项目是使用来自 QGraphicsScene 和 QChart 的信息绘制的。考虑到上述情况,一种方法可以是访问QGraphicsScene和QChart,并使用QGraphicsScene的render()方法。

    • 您可以通过sip.cast() 方法使用 sip 进行投射。

    • 在这种情况下,也没有必要进行向下转换,因为它足以在签名中表明:

    class Manager(QtCore.QObject):
        @QtCore.pyqtSlot(QtQuick.QQuickItem)
        def save(self, chartview):
            self.result = chartview.grabToImage()
    
            def handle_ready():
                self.result.saveToFile(MY_DEFAULT_PATH)
                delattr(self, "result")
    
            self.result.ready.connect(handle_ready)
    

    但是你可以使用 grabToImage 方法而不是太复杂,因为它是一个 Item:

    import QtQuick 2.12
    import QtQuick.Controls 2.12
    import QtCharts 2.2
    
    ApplicationWindow {
        visible: true
        width: 640
        height: 480
        Button {
            id: btn
            text: "Save"
            anchors.top: parent.top
            onClicked: saveChart("chart.png") 
        }
        ChartView {
            id: chartView
            anchors.top: btn.bottom
            width: parent.width
            anchors.bottom: parent.bottom
            LineSeries {
                XYPoint { x: 0; y: 0 }
                XYPoint { x: 1.1; y: 2.1 }
            }
        }
    
        function saveChart(filename){
            chartView.grabToImage(function(result) {
                result.saveToFile(filename);
            });
        }   
    }
    

    【讨论】:

      猜你喜欢
      • 2018-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-11
      • 1970-01-01
      • 2013-05-31
      • 2021-02-01
      相关资源
      最近更新 更多