2

Qt SVG レンダラーを使用して、スタイル付きの pygal チャートをレンダリングしようとしています。しかし、背景色は黒であるため、まだ問題があります。pygal chart のスタイルで制御すべきではないでしょうか? 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

OK、解決策を見つけました。問題は、QtSvgによって作成された SVG をレンダリングするために必要な SVG 機能の一部しかサポートしていないことですpygal。これは、Qt ドキュメントで明示的に言及されています。「Qt は SVG 1.2 Tiny の静的機能をサポートしています。ECMA スクリプトと DOM 操作は現在サポートされていません。」これが、より複雑な SVG が を使用してレンダリングできない理由だと思いますQtSvg。さらにQtSvg、非推奨として議論されています (ただし、これに関する公式声明は見つかりませんでした)。

私の解決策は使用することですQtWebKit(現時点ではQt4.8をサポートする必要があるため、Qt5.xで近い将来廃止される予定のモダーQtWebEngineモジュールを使用していません)。QtWebKit

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 に答える