2

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

在此处输入图像描述

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 文件失败,它不起作用。或者它可能是 Qt 支持的 SVG 规范的一些有限范围,如QT 是否支持 svg?.

4

1 回答 1

2

好的,我找到了解决方案。问题是QtSvg它只支持渲染由pygal. 这在 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 - 尚未测试)和QtWebEngineWidgets.QWebEngineView(现代的 PyQt5)。我所说的“现代”大致是指 Qt 版本 >= 5.5。

关于pygal图表的渲染,QtWebKit不支持所有的动态特性,虽然支持QtWebEngine。的缺点QtWebEngine是启动速度慢得多。

于 2016-11-05T10:11:17.623 回答