2016-08-06 1 views
1

QSvgGenerator과 같이 특정 화가에게 QChart (핵심은 QGraphicsWidget)을 렌더링하고 싶습니다.QGraphicsView없이 QChart 렌더링

나는 다음과 같은 주제 https://forum.qt.io/topic/38352/rendering-qgraphicsitem-without-qgraphicsscene/2를 읽고 내 코드에서 구현했습니다 : 첫 번째 두 번째, 직접 QChart 그림입니다 - QGraphicsView 렌더링 : 주석이 두 줄이 있습니다

QBuffer b; 
QSvgGenerator p; 
p.setOutputDevice(&b); 
QSize s = app->chart()->size().toSize(); 
p.setSize(s); 
p.setViewBox(QRect(0,0,s.width(),s.height())); 
QPainter painter; 
painter.begin(&p); 
painter.setRenderHint(QPainter::Antialiasing); 
app->chart()->paint(&painter, 0, 0); // This gives 0 items in 1 group 
m_view->render(&painter); // m_view has app->chart() in it, and this one gives right image 
qDebug() << "Copied"; 
painter.end(); 
QMimeData * d = new QMimeData(); 
d->setData("image/svg+xml",b.buffer()); 
QApplication::clipboard()->setMimeData(d,QClipboard::Clipboard); 

.

나는 이미 setViewBox으로 게임을 시도했지만, 큰 값으로 설정해도 도움이되지 않습니다. QSvgGenerator 대신 QImage을 사용하면 효과가 동일 해져 빈 그림이 나타납니다.

그래서 QChart->paint()이 내게 빈 그림을주는 이유는 무엇입니까?

편집 : 작업 코드의 bitbucket에서 찾을 수 있습니다 : https://bitbucket.org/morodeer/charts_test_2/commits/b1eee99736beb5e43eae2a40ae116ee07e01558f

답변

2

난 여전히 핵심에 깊은 무슨 일이 일어나고 있는지 이해하지 않지만, 나는 그것이 작동되도록 할 수있는 방법을 발견했습니다.

app->chart()->paint(&painter, 0, 0); 

app->chart()->scene()->render(&painter, 0, 0); 

정말 그 안에 아무것도 포함하지 않는 QChart 같은데로 변경하지만, 부모 장면에 항목을 추가해야합니다. 당신은 내가했던 것처럼를 QGraphicsView에 추가하지 않고 렌더링해야하는 경우 따라서, 당신은 또한 QGraphicsScene를 작성하고 차트를 추가해야합니다

m_scene = new QGraphicsScene(); 
m_scene->addItem(m_chart); 

는, 당신은 차트의 장면을 렌더링 할 수 있습니다.

+0

고맙습니다. 이것은 많은 도움이되었습니다. – Waldemar

0

이것은 QChart에서 차트를 렌더링하는 방법에 대해 알아 낸 유일한 힌트이며이를 이해하는 데는 상당한 시간이 걸렸으므로 코드를 공유해야했습니다.

이것은 PyQt5가있는 Python이지만 순수한 C++로 쉽게 변환 할 수 있어야합니다.) 또한 QChart는 QChartView 위젯의 일부입니다.

chart = QtChart.QChart() 
chart_view = QtChart.QChartView(chart) 

... 

# the desired size of the rendering 
# in pixels for PNG, in pt for SVG 
output_size = QtCore.QSize(800,600) 

output_rect = QtCore.QRectF(QtCore.QPointF(0,0), QtCore.QSizeF(output_size)) # cast to float 

if output_svg: 
    svg = QtSvg.QSvgGenerator() 
    svg.setFileName(filename) 
    svg.setTitle("some title") 

    svg.setSize(output_size) 
    svg.setViewBox(output_rect) 

    canvas = svg 

else: 
    image = QtGui.QImage(output_size, QtGui.QImage.Format_ARGB32) 
    image.fill(QtCore.Qt.transparent) 

    canvas = image 

# uncomment to hide background 
#chart.setBackgroundBrush(brush = QtGui.QBrush(QtCore.Qt.NoBrush)) 

# resize the chart, as otherwise the size/scaling of the axes etc. 
# will be dependent on the size of the chart in the GUI 
# this way, a consistent output size is enforced 
original_size = chart.size() 
chart.resize(output_rect.size()) 

painter = QtGui.QPainter() 
painter.begin(canvas) 

# enable antialiasing (painter must be active, set this after painter.begin()) 
# only affects PNG output 
painter.setRenderHint(QtGui.QPainter.Antialiasing) 

chart.scene().render(painter, source=output_rect, target=output_rect, mode=QtCore.Qt.IgnoreAspectRatio) 
painter.end() 

chart.resize(original_size) 

if type(canvas) == QtGui.QImage: 
    canvas.save(filename) 

하지만 파이썬을 사용하는 경우 그것은 단지 더 많은 기능과 형식을 제공하며, 또한 PyQt는-GUI에 통합 할 수 있습니다하기 matplotlib로 갈 쉬울 수 있습니다.

+0

공유해 주셔서 감사합니다. 실제로 솔루션은 승인 된 것을 반복합니다. 핵심은 차트 자체가 아니라 차트의 '장면'을 렌더링하는 것입니다. – ProdoElmit

관련 문제