2016-11-04 103 views
2

我想使用Qt SVG渲染器渲染樣式化的pygal圖表。但我仍然有背景顏色的問題,因爲它是黑色的。它不應該受到pygal圖表風格的控制嗎?它應該看起來像第一個圖表http://www.pygal.org/en/stable/documentation/builtin_styles.html#darkstyle在Qt中的svg渲染(使用pygal圖表)

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) 

UPDATE:直接使用QSvgWidget在使用PyQt5,PyQt4的,Pyside還當我得到了同樣的問題。我懷疑是因爲加載SVG中引用的CSS文件失敗而無法工作。或者,它可能是由Qt支持的一些有限範圍的SVG規範,如Does QT support svg?中所述。

回答

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() 

UPDATE:Qt的是要儘快棄用QtWebKit。 PySide/PyQt4和PyQt5的導入模塊也不同。爲了使其工作,您需要使用一些QtWebKit.QWebView(PySide,PyQt4),QtWebKitWidgets.QWebView(較舊的PyQt5),QtWebEngine.QWebEngineView(可能PySide2-尚未測試)和QtWebEngineWidgets.QWebEngineView(現代PyQt5)。 「現代」我大致意思是Qt版本> = 5.5。

關於pygal圖表的渲染,QtWebKit不支持所有動態功能,而QtWebEngineQtWebEngine的缺點是啓動速度慢得多。