我正在尝试打印QGraphicsScene
. 目标打印机可以是任何东西——从普通打印机到定制尺寸的特殊打印机。它必须以实际尺寸(英寸,毫米......)打印东西。
在QGraphicsScene
我使用 72 ppi 的假设中。
我假设:
1)将场景渲染到打印机将根据打印机分辨率来完成,这样我会得到与屏幕上显示的实际尺寸(英寸/毫米)相似的项目。
2)我可以将打印机的纸张尺寸设置为所需的画布尺寸(这是一个非常大的场景上的矩形),除此之外什么都不会打印
3)我可以设置边距,“实际画布”之外的内容将不打印,包括页边空白。
到目前为止我的所有假设都是错误的:
1)对于不同的打印机,如果我建议使用接近其默认纸张尺寸的自定义尺寸(或者如果我没有设置纸张,则渲染似乎是最大适合度(使用纵横比))尺寸);
如果我设置的纸张尺寸不接近(例如默认“LETTER”尺寸的打印机上的 4x4 英寸),它只会打印一个空白页。
2-3) 在有打印的情况下,打印机只是将画布拉伸到整页,绘图区域之外的任何项目仍会打印。
我尝试在画家上或通过在渲染上设置目标矩形进行剪辑,结果是场景的一小部分非常奇怪的剪辑。
我尝试过使用 HP LaserJet、Adobe PDF 和一些具有特定尺寸(如 4x6 英寸)的定制打印机。它们都根据我指定的是纵向还是横向将场景缩放到最大尺寸,并且完全忽略了我的纸张尺寸请求或实际尺寸。
这是一个小示例程序来重现我正在尝试做的事情。
代码中的注释显示了我尝试过的一些选项。
#include <QApplication>
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QGraphicsRectItem>
#include <QGraphicsEllipseItem>
#include <QPrinter>
#include <QPrintDialog>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QGraphicsScene* s = new QGraphicsScene();
s->setSceneRect(-500, -500, 1500, 1500);
QGraphicsView* view = new QGraphicsView();
view->setScene(s);
view->show();
int canvasSize = 288; // 4 in
QRectF canvasRect(0, 0, canvasSize, canvasSize);
// this is to show actual scene
QGraphicsRectItem* sss = new QGraphicsRectItem(canvasRect);
sss->setBrush(Qt::blue);
s->addItem(sss);
// this item is partially outside top left
QGraphicsEllipseItem* e1 = new QGraphicsEllipseItem(-50, -75, 100, 150);
e1->setBrush(Qt::yellow);
s->addItem(e1);
// this item is partially outside center
QGraphicsEllipseItem* e2 = new QGraphicsEllipseItem(100, 150, 250, 50);
e2->setBrush(Qt::yellow);
s->addItem(e2);
// this item is partially outside right
QGraphicsEllipseItem* e3 = new QGraphicsEllipseItem(200, 200, 75, 125);
e3->setBrush(Qt::yellow);
s->addItem(e3);
QPrinter printer;
// QPrinter printer(QPrinter::HighResolution); // this makes no difference except it rotates the output, strange
// without this just to use default printer, if you like
QPrintDialog printDialog(&printer);
if (printDialog.exec() != QDialog::Accepted)
return 1;
printer.setFullPage(false); // I see no diference between true and false
// this results in empty page (or is ignored if my rect is 8 in)
//printer.setPaperSize(canvasRect, QPrinter::Point);
printer.setOrientation(QPrinter::Landscape);
printer.setPageMargins(0, 0, 0, 0, QPrinter::Point);
QPainter painter;
if (painter.begin(&printer))
{
// painter.setClipRect(canvasRect); // this creates a small clipping, only a tiny corner
s->render(&painter, QRectF(), canvasRect, Qt::KeepAspectRatio);
// doing this instead clips to a tiny rectangle also
// s->render(&painter, canvasRect, canvasRect, Qt::KeepAspectRatio);
painter.end();
}
return app.exec();
}
正在做:
QPrinter printer(QPrinter::HighResolution);
qreal resolutionFactor = printer.resolution() / 1200.;
...
painter.scale(resolutionFactor, resolutionFactor);
修复了 LaserJet 打印(缩放 - 不是实际页面之外的绘画) - 但会在 300 dpi 分辨率的打印机上产生几乎不可见的微小打印。
如何使打印输出达到实际比例(以便我可以在纸上测量英寸/毫米并使其正确)?
另外,我怎样才能将输出剪辑到实际的画布矩形?