Qt5.3.0で印刷するとずれる件(続)

http://qt-project.org/doc/qt-5/qtprintsupport-index.html から引用。

printer-rects

paperRectとpageRectは区別されていて、QPainterで描画する場合には、pageRectの座標系が用いられるとのこと。

前回のエントリで掲載したプログラムに、用紙とページのサイズを取得するようなコードを追加してみました。

getsize

で、Qt SDKのバージョンによって、この結果が異なることが判明。

5.3.0未満

oldpagesize

5.3.0

newpagesize

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しました。

カテゴリー: 未分類   パーマリンク

コメントを残す

メールアドレスが公開されることはありません。

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

CAPTCHA(画像認証)

上の画像の最初と最後を除いた3桁の数字を入力して、送信ボタンを押してください。