Qt 打印QGraphicscene将对象切成两半

Qt 打印QGraphicscene将对象切成两半,qt,qgraphicsview,qgraphicsitem,qgraphicsscene,qprinter,Qt,Qgraphicsview,Qgraphicsitem,Qgraphicsscene,Qprinter,我想打印QGraphicscene上的所有内容: void MainWindow::on_print_clicked() { if (template_ptr != Q_NULLPTR) { QPrinter printer(QPrinter::HighResolution); if (QPrintDialog(&printer, this).exec() == QDialog::Accepted) { if (QPageS

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

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++;
                }
            }
        }
    }
}
void主窗口::在打印时单击()
{
如果(模板\u ptr!=Q\u空ptr){
QPrinter打印机(QPrinter::高分辨率);
if(QPrintDialog(&printer,this).exec()==QDialog::Accepted){
if(QPageSetupDialog(&printer,this).exec()==QDialog::Accepted){
Q油漆工和打印机;
painter.setRenderInt(QPainter::抗锯齿);
painter.setRenderHint(QPainter::textantialising);
qreal x,_y,h,w,假;
ui->graphicsView->scen直立();
h=模板ptr->页面高度*2.0;
qint32页=0;
while(true){
qreal y=_y+h*页;
QRectF leftRect(x,y,w,模板\u ptr->page\u height*2.0*模板\u ptr->max\u pages-h*页面);
if(ui->graphicsView->scene()->items(leftRect).length()graphicsView->scene()->render(&painter,printer.pageRect(),sourceRect));
printer.newPage();
page++;
}
}
}
}
}
这就是效果(PDF文件):

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

我会做什么

步骤1:我首先创建场景的副本(一个新的
qgraphicscene
,大小与原始场景相同),然后将所有项目移动到那里

第2步:为每个新页面创建一个临时场景,其中
场景竖立
与要打印的部分相等

步骤3:将临时场景的
场景中包含的
场景副本中的项目移动到该副本中

步骤4:打印后,将打印的项目移动到原始场景

第5步:将复制场景边界矩形缩短为仍保留在其中的项目的边界矩形。(要允许第4步将项目精确放置到位,请更改x/y坐标以及w/h)

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

我要做什么

步骤1:我首先创建场景的副本(一个新的
qgraphicscene
,大小与原始场景相同),然后将所有项目移动到那里

第2步:为每个新页面创建一个临时场景,其中
场景竖立
与要打印的部分相等

步骤3:将临时场景的
场景中包含的
场景副本中的项目移动到该副本中

步骤4:打印后,将打印的项目移动到原始场景

第5步:将复制场景边界矩形缩短为仍保留在其中的项目的边界矩形。(要允许第4步将项目精确放置到位,请更改x/y坐标以及w/h)

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