2016-11-04 7 views
2

Я пытаюсь отобразить стилизованные пигальные диаграммы с помощью Qt SVG renderer. Но у меня все еще проблемы с цветами фона, потому что он черный. Разве это не должно контролироваться стилем пигальной карты? Он должен выглядеть как первый график в http://www.pygal.org/en/stable/documentation/builtin_styles.html#darkstylesvg рендеринг в Qt (с пигальными диаграммами)

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: Я получаю тот же вопрос при использовании PyQt5, PyQt4, PySide, а также при использовании непосредственно QSvgWidget. Мое подозрение в том, что он не работает из-за сбоя в загрузке файлов CSS, на которые ссылается SVG. Или это может быть ограниченный объем спецификации SVG, который поддерживается Qt, как указано в Does QT support svg?.

ответ

1

ОК, я нашел решение. Проблема в том, что QtSvg поддерживает только часть функций SVG, которая требуется для визуализации SVG, созданных с помощью pygal. Это явно указано в Qt docs: «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 не поддерживает все динамические функции, а QtWebEngine. Недостатком QtWebEngine является гораздо более медленный запуск.