http://qt-project.org/doc/qt-5/qtprintsupport-index.html から引用。
paperRectとpageRectは区別されていて、QPainterで描画する場合には、pageRectの座標系が用いられるとのこと。
前回のエントリで掲載したプログラムに、用紙とページのサイズを取得するようなコードを追加してみました。
で、Qt SDKのバージョンによって、この結果が異なることが判明。
5.3.0未満
5.3.0
5.3.0では、pageRectの原点が(42, 42)になっていました。
つまり、
- QPainterで描画する際には、pageRectを考慮しなければならない。
- 5.3.0未満では、pageRectはpaperRectと一致している。
Qtが提示するページ座標系で印刷するならは、そのままでいいのですが、用紙座標系で印刷したい場合は、座標変換を設定する必要があるようです。
そうして、修正したのが次のコード。
void MainWindow::on_pushButton_clicked() { QPrintDialog dlg(this); if (dlg.exec() == QDialog::Accepted) { QPrinter *printer = dlg.printer(); printer->setPaperSize(QPrinter::A4); printer->setOrientation(QPrinter::Portrait); printer->setPageMargins(0, 0, 0, 0, QPrinter::Millimeter); printer->setResolution(254); QRect paper = printer->paperRect(); QRect page = printer->pageRect(); QPainter painter(printer); QTransform t; t.translate(-page.left(), -page.top()); painter.setTransform(t); painter.setPen(QPen(Qt::black, 20)); painter.drawEllipse(0, 0, 2100, 2970); } }
ページ原点の分だけ左上にずらすようにQTransformオブジェクトを作って、setTransformしました。