Qt中的svg渲染(带有pygal图表)

时间:2016-11-04 21:51:16

标签: svg pyqt pyside pygal qtsvg

我正在尝试使用Qt SVG渲染器渲染样式化的pygal图表。但我仍然有背景颜色的问题,因为它是黑色的。不应该受到pygal图表风格的控制吗?它应该看起来像http://www.pygal.org/en/stable/documentation/builtin_styles.html#darkstyle

中的第一个图表

enter image description here

import sys
import pygal
from PySide import QtGui, QtSvg


class Chart(QtGui.QWidget):

    def __init__(self, parent=None):
        super(Chart, self).__init__(parent)

        chart = pygal.StackedLine(fill=True, interpolate='cubic',
                                  style=pygal.style.DefaultStyle)
                                  # or e.g. DarkSolarizedStyle
        chart.add('A', [1, 3, 5, 16, 13, 3, 7])
        chart.add('B', [5, 2, 3, 2, 5, 7, 17])
        chart.add('C', [6, 10, 9, 7, 3, 1, 0])
        chart.add('D', [2, 3, 5, 9, 12, 9, 5])
        chart.add('E', [7, 4, 2, 1, 2, 10, 0])
        svgSource = chart.render()
        self.renderer = QtSvg.QSvgRenderer()
        self.renderer.load(svgSource)

    def paintEvent(self, event):
        if self.renderer is not None:
            painter = QtGui.QPainter(self)
            self.renderer.render(painter)
            return True
        return super(Chart, self).paintEvent(event)

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    window = Chart()
    window.show()
    result = app.exec_()
    sys.exit(result)

更新:在使用PyQt5,PyQt4,Pyside以及直接使用QSvgWidget时,我遇到了同样的问题。我怀疑是因为加载SVG中引用的CSS文件失败而无法正常工作。或者可能是Does QT support svg?中提到的Qt支持的SVG规范的有限范围。

1 个答案:

答案 0 :(得分:1)

好的,我找到了解决方案。问题是QtSvg仅支持呈现pygal创建的SVG所需的SVG功能的一部分。这在Qt文档中明确提到:“Qt支持SVG 1.2 Tiny的静态功能。目前不支持ECMA脚本和DOM操作。”我认为这就是为什么更复杂的SVG无法使用QtSvg进行渲染的原因。此外,QtSvg在讨论中被讨论为弃用(虽然我没有找到任何关于此的官方声明)。

我的解决方案是使用QtWebKit(目前我需要支持Qt4.8,所以我没有使用更多的现代QtWebEngine模块,预计会弃用QtWebKit不久的将来在Qt5.x)。

显示pygal生成的SVG的代码行是:

chart = pygal.StackedLine(...
...
window = QtWebKit.QWebView()
window.setContent(chart.render())
window.show()

更新:Qt很快就会弃用QtWebKit。 PySide / PyQt4和PyQt5的导入模块也不同。为了使其工作,您需要使用其中一些QtWebKit.QWebView(PySide,PyQt4),QtWebKitWidgets.QWebView(较旧的PyQt5),QtWebEngine.QWebEngineView(可能是PySide2 - 尚未测试)和{ {1}}(现代PyQt5)。通过'现代'我粗略地表示Qt版本> = 5.5。

关于QtWebEngineWidgets.QWebEngineView图表的呈现,pygal不支持所有动态功能,而QtWebKit则支持所有动态功能。 QtWebEngine的缺点是启动速度慢得多。