我想打印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++;
}
}
}
}
}
列表上的每个点都是单个QGraphicsItem,我不知道将不适合页面的项目移动到下一页的最简单方法是什么...我可能会做一些容易出错的事情数学来实现这一点,但我很确定这可以用一些优雅的方式解决。
答案 0 :(得分:0)
我会做什么...
步骤1:我首先创建一个场景副本(一个与原始版本大小相同的新QGraphicsScene
)并将所有项目移动到那里。
步骤2:为每个新页面创建一个临时场景,其中sceneRect
等于您要打印的部分。
步骤3:将场景副本中的项目移动到临时场景的contained
中sceneRect
。
步骤4:打印后,将打印的项目移动到原始场景......
步骤5:将复制场景边界缩短到缩小其内部项目的边界矩形。 (允许步骤4将项目准确放置到位,更改x / y坐标以及更改w / h)
重复步骤3到5,直到复制场景为空。