0

QGraphicsView/QGraphicsScene借助滚动条进行导航,我的窗口中成功显示了一个大场景。一切正常。

现在我想以 pdf 格式渲染部分场景。pdf中要渲染的区域应该是窗口中可见的区域以及可见区域上方和下方的矩形。

我已经尝试过了(简单地说,如果使用了水平滚动条,我会忽略):

QPrinter myPrinter(QPrinter::ScreenResolution); 
myPrinter.setOrientation(QPrinter::Landscape);
myPrinter.setPaperSize(QPrinter::A4);
myPrinter.setOutputFormat(QPrinter::PdfFormat);
myPrinter.setPageMargins(0.0, 0.0, 0.0, 0.0, QPrinter::Point);

QPainter myPainter(&myPrinter);
m_pageWidth = myPrinter.width();
m_pageHeight = myPrinter.height();
myPainter.setViewport(0, 0, m_pageWidth, m_pageHeight);

QRectF viewRender = QRect(0.0, 0.0, m_pageWidth, m_pageHeight);

for(int i = 0; i < myScene->getNbPages(); i++)
{
    QRect viewScene = QRect(0, m_pageHeight * i, m_pageWidth, m_pageHeight);
    setSceneRect(viewScene);

    render(&myPainter, viewRender, viewScene);

    if(i + 1 < myScene->getNbPages())
        myPrinter.newPage();
}

但我没有得到预期的结果。例如在这个函数中,QGraphicsView::drawBackground(QPainter *painter, const QRectF &rect)rect的左上角不是0,第一页是0,而是107、98,然后是107、1585(但页面高度只有793?!)等等......

任何人都明白发生了什么?谢谢阅读。

4

1 回答 1

1

http://qt-project.org/doc/qt-4.8/qgraphicsview.html#mapToScene

http://qt-project.org/doc/qt-4.8/qgraphicsview.html#mapFromScene

适当地使用其中一种,你应该得到你想要的结果。

例如,您可以尝试:

render(&myPainter, this->mapToScene(viewRender), viewScene);
// assuming this is your QGraphicsView instance

我在另一个我回答的问题中演示了如何使用它:

如何在 QGraphicsScene 上绘制一个点(鼠标点击)?

希望有帮助。

于 2013-04-19T00:29:58.483 回答