我需要能够从 qt(aQGraphicsScene
或 a的渲染内容QImage
)打印,以在普通打印机、pdf 以及自定义打印机(包括卷筒纸)上进行缩放。
似乎任何适用于标准打印机的东西在定制打印机上都失败了,反之亦然。
我现在已经在定制打印机上按预期完成了打印工作(在不同打印机的工作之间来回切换)。
我根据长宽比设置所需的自定义尺寸和首选方向。
我打开一个打印对话框(甚至检查供应 - 纸张设置为所需尺寸,并且按预期设置方向)
打印:
在定制打印机上,我得到了正确的尺寸,如果供应量较小,则根据需要进行打印剪辑。边距也设置正确。
在 Pdf 上,我得到了一个按要求正确打印的自定义大小的文档 - 但方向没有得到尊重!(即使打印对话框正确显示) - 参见图像 在 HP 打印机上,我得到一个白页 - 没有打印任何内容。
#include <QApplication>
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QGraphicsRectItem>
#include <QPrinter>
#include <QPrintDialog>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
// some scene to print - show rectangle for easy measure
QGraphicsScene* s = new QGraphicsScene();
s->setSceneRect(-500, -500, 1500, 1500);
s->setBackgroundBrush(Qt::red);
QGraphicsView* view = new QGraphicsView();
view->setScene(s);
view->show();
qreal in = 72;
QRectF canvasRect(-0.1*in, -0.1*in, 6*in, 4*in);
qreal margins = 0.1*in;
QRectF actualCanvasRect = canvasRect.adjusted(margins,margins,-margins,-margins);
// this is to show actual scene
QGraphicsRectItem* contourItem = new QGraphicsRectItem(actualCanvasRect);
contourItem->setBrush(Qt::blue);
s->addItem(contourItem);
// an item partially on canvas (so I can check margins)
QGraphicsRectItem* item = new QGraphicsRectItem(-.5*in, -in, 2*in, 3*in);
item->setBrush(Qt::yellow);
s->addItem(item);
// actual printing:
// print the scene, to scale, using user margins, on given printer
QPrinter printer;
QPrinter::Orientation orient = (actualCanvasRect.width() >
actualCanvasRect.height() ?
QPrinter::Landscape : QPrinter::Portrait);
printer.setOrientation(orient);
printer.setPaperSize(canvasRect.size(), QPrinter::Point);
printer.setPageMargins(margins, margins, margins, margins, QPrinter::Point);
QPrintDialog printDialog(&printer);
if (printDialog.exec() != QDialog::Accepted)
{
qDebug("dialog canceled");
return 1;
}
QPainter painter;
if (! painter.begin(&printer))
{
qDebug("failed to open printer");
return 1;
}
// render the contents, clipped to printer page size, and scaled from point to device pixel
QRectF source = actualCanvasRect;
// convert target rect to DevicePixel and clip to page
QRectF page = printer.pageRect(QPrinter::DevicePixel);
qreal scale = printer.resolution()/in;
QRectF target = QRectF(page.topLeft(), source.size() * scale);
target &= page; // clip target rect to page
// clip source rect to page - without this, if printer paper is smaller I get unwanted scaling
source &= printer.pageRect(QPrinter::Point);
s->render(&painter, target, source);
painter.end();
return app.exec();
}
即使我明确要求横向(不更改打印对话框:参见图片),我也不明白为什么 pdf 会创建纵向页面。(宽度和高度颠倒,但正确 - 文档属性显示 4x6,页面尝试正确打印和缩放)
更重要的是,我不明白为什么典型的激光喷墨打印机什么都不打印 - 空白页 - 或者有时对于一个简单的画布它会缩放以适应。
但是,如果我从 HP 更改打印对话框中的任何属性,任何不相关的内容(如纸张来源或纸张类型......),它都会正确打印。
我究竟做错了什么 ?
(使用 Qt 4.7 和 5.5,必须在 4.7 - Windows 上工作,尚未尝试 Linux)