1

たとえば、特定のペインターにQChart(コアにある)レンダリングしたいと思います。QGraphicsWidgetQSvgGenerator

次のトピックhttps://forum.qt.io/topic/38352/rendering-qgraphicsitem-without-qgraphicsscene/2を読み、コードに実装しました:

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

コメント付きの 2 つの行がありQChartますQGraphicsView

私はすでに で遊んでみましたがsetViewBox、巨大な値に設定しても役に立ちません。QImageの代わりに使用しても効果は同じですがQSvgGenerator、空の画像が表示されます。

問題は、なぜQChart->paint()空の絵が表示されるのかということです。

編集: 作業コードは bitbucket で見つけることができます: https://bitbucket.org/morodeer/charts_test_2/commits/b1eee99736beb5e43eae2a40ae116ee07e01558f

4

2 に答える 2

4

コアの奥深くで何が起こっているのかまだ理解できていませんが、それを機能させる方法を見つけました。

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

すると、チャートのシーンをレンダリングできるようになります。

于 2016-08-08T09:40:57.330 に答える