【问题标题】:Printing QGraphicsScene cuts objects in half打印 QGraphicsScene 将对象切成两半
【发布时间】:2016-01-27 10:36:23
【问题描述】:

我想打印 QGraphicsScene 上的所有内容:

void MainWindow::on_print_clicked()
{
    if (template_ptr != Q_NULLPTR) {
        QPrinter printer(QPrinter::HighResolution);
        if (QPrintDialog(&printer, this).exec() == QDialog::Accepted) {
            if (QPageSetupDialog(&printer, this).exec() == QDialog::Accepted) {
                QPainter painter(&printer);
                painter.setRenderHint(QPainter::Antialiasing);
                painter.setRenderHint(QPainter::TextAntialiasing);
                qreal x, _y, h, w, fake;
                ui->graphicsView->sceneRect().getRect(&x, &_y, &w, &fake);
                h = template_ptr->page_height*2.0;
                qint32 page = 0;
                while (true) {
                    qreal y = _y + h*page;
                    QRectF leftRect(x, y, w, template_ptr->page_height*2.0*template_ptr->max_pages - h*page);
                    if (ui->graphicsView->scene()->items(leftRect).length() <= 0) {
                        break;
                    }
                    QRectF sourceRect(x, y, w, h);
                    ui->graphicsView->scene()->render(&painter, printer.pageRect(), sourceRect);
                    printer.newPage();
                    page++;
                }
            }
        }
    }
}

效果如下(PDF 文件):

列表上的每个点都是一个 QGraphicsItem,我不知道将不适合页面的项目移动到下一页的最简单方法是什么...我可能会做一些容易出错的事情数学来实现这一点,但我很确定这可以通过某种优雅的方式解决。

【问题讨论】:

    标签: qt qgraphicsview qgraphicsitem qgraphicsscene qprinter


    【解决方案1】:

    我会怎么做...

    第 1 步:我将首先创建场景的副本(一个新的 QGraphicsScene,与您的原始大小相同)并将所有项目移到那里。

    第 2 步:为每个新页面创建一个临时场景,sceneRect 等于您要打印的部分。

    第 3 步:将场景副本中的项目移至它,即临时场景的 sceneRect 中的 contained

    第四步:打印完成后,将打印好的物品移到原场景中……

    第 5 步:将复制场景的边界矩形缩短为仍留在其中的项目的边界矩形。 (为了让第 4 步将项目准确放置,更改 x/y 坐标以及更改 w/h)

    重复步骤 3 到 5,直到复制场景为空。

    【讨论】:

      猜你喜欢
      • 2013-02-25
      • 1970-01-01
      • 2020-01-21
      • 2021-08-31
      • 1970-01-01
      • 1970-01-01
      • 2023-02-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多