我正在嘗試打印QGraphicsScene
的內容。目標打印機可以是任何東西 - 從普通打印機到定製尺寸特殊打印機。它必須以實際尺寸(英寸,毫米......)打印東西。
在QGraphicsScene
我使用72ppi的假設。我需要將QGraphicsScene打印爲實際(英寸/毫米)的刻度
我假設:
1)將場景渲染到打印機將基於打印機分辨率來實現,這樣我就可以獲得與它們在屏幕上顯示的實際尺寸(英寸/毫米)相似的項目。
2)我可以將打印機的紙張大小設置爲所需的畫布大小(這是一個非常大的場景中的矩形),除此之外沒有任何內容可以打印
3)我可以設置頁邊距以及「實際畫布「將不會被打印,包括邊距上的內容。 1)對於不同的打印機,如果我建議自定義尺寸接近其默認紙張尺寸(或者如果I不要設置紙張大小);
如果我設置的紙張尺寸不是很接近(例如在打印機上使用默認「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);
修復的激光打印(縮放 - 而不是實際的頁面外畫) - 但結果與300 dpi的分辨率的打印機上一個微小的幾乎看不見的打印。
我怎樣才能得到打印輸出是實際的規模(以便我可以測量英寸/毫米在紙上,讓他們是正確的)?
另外我怎樣才能得到輸出剪切到實際的畫布矩形?
'dpi'是一個換算係數。這不是一種物理測量。就像問「開車到紐約有多遠」,而你回答「60英里/小時」。 –
@MarcB我的意思是PPI(像素每英寸 - 或每英寸點數?) - 我正在繪製尺寸爲72 *英寸大小的場景項目。 'QPrinter'似乎同意,如果我'printer.setPaperSize(canvasRect,QPrinter :: Point);'和'qDebug()<< printer.paperSize(QPrinter :: Inch);'它給我預期的大小。 – Thalia
場景中的單位不是像素,所以說PPI是沒有意義的。你可以簡單地說你的場景單位是1/72英寸。 –