我需要能够从qt(QGraphicsScene
或QImage
的渲染内容)进行打印,以便在普通打印机上进行缩放,pdf,以及自定义< / strong>打印机,包括滚动式打印机。
似乎任何适用于标准打印机的东西都会在自定义打印机上失败,反之亦然。
我现在已经按照预期在自定义打印机上进行打印(在不同打印机之间来回切换)。
我根据长/宽比设置了所需的自定义尺寸和首选方向。
我打开一个打印对话框(甚至检查供应 - 纸张设置为所需尺寸,方向按预期设置)
打印:
在自定义打印机上,我得到正确的尺寸,如果供应量较小,则根据需要打印剪辑。边距也设置正确。
在Pdf上,我按要求获得了自定义尺寸的文档,正确打印 - 但方向不受尊重! (即使打印对话框显示正确) - 请参阅图像
在惠普打印机上,我得到一个白页 - 没有打印出来。
#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)