2016-11-04 1 views
2

Qt SVG 렌더러를 사용하여 스타일 파이 갈 차트를 렌더링하려고합니다. 그러나 검은 색이기 때문에 배경색에 문제가 있습니다. pygal 도표의 작풍에 의해 그것이 통제되면 안된다? 그것은 http://www.pygal.org/en/stable/documentation/builtin_styles.html#darkstyleQt에서 svg 렌더링 (파이 갈 차트 사용)

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 파일을로드하지 못해서 작동하지 않는다는 것이 나의 의구심입니다. 또는 Does QT support svg?에 언급 된 Qt에서 지원하는 SVG 사양의 일부 제한된 범위 일 수 있습니다.

답변

1

좋아, 해결책을 찾았습니다. 문제는 QtSvgpygal으로 생성 된 SVG를 렌더링하는 데 필요한 SVG 기능의 일부만 지원한다는 것입니다. Qt는 SVG 1.2의 정적 기능을 지원합니다. ECMA 스크립트 및 DOM 조작은 현재 지원되지 않습니다. " 이것이 더 복잡한 SVG가 QtSvg을 사용하여 렌더링 할 수없는 이유라고 생각합니다. 또한 QtSvg은 deprecated에 대한 토론에서 논의됩니다 (관련하여 공식적인 진술은 없지만).

내 솔루션 (I 그래서 난 Qt5.x에서 가까운 장래에 QtWebKit을 지양 할 것으로 예상된다 더 모더 QtWebEngine 모듈을 사용하고 있지 않다 Qt4.8을 지원하는 데 필요한 순간에) QtWebKit을 사용하는 것입니다.

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

업데이트 : Qt는 곧 QtWebKit을 중단 한 것입니다 pygal를 표시하는 코드의

선은 SVG이 있습니다 생성. 또한 PySide/PyQt4 및 PyQt5의 가져 오기 모듈이 다릅니다. 이 기능을 사용하려면 QtWebKit.QWebView (PySide, PyQt4), QtWebKitWidgets.QWebView (구형 PyQt5), QtWebEngine.QWebEngineView (아마도 PySide2 - 테스트하지 않음) 및 QtWebEngineWidgets.QWebEngineView (현대 PyQt5) 중 일부를 사용해야합니다. '현대'는 Qt 버전이 5.5 이상인 것을 의미합니다.

pygal 차트의 렌더링과 관련하여 QtWebKit은 모든 동적 기능을 지원하지 않지만 QtWebEngine은 표시하지 않습니다. QtWebEngine의 단점은 시작이 훨씬 느립니다.