ふちたさん

橋本@kenya888です。こんにちは。ご経験のフィードバックありがとうございます。解決されましてなによりです。

"発端"を読んだときに、手元で再現するかこっそりやってたのですが、Macでいつも使ってるリモートのちょっと古いCUPS(Linux)に接続されたプリンタでそもそもちゃんと円を出力できなかった(MacでPDF出力だとだいじょうぶなのに)ので、Qtの印刷の闇の深さを感じるだけで終わってしまいました^^; 

#いや、たぶんQtは悪くない

はしもと



2014年5月29日 13:14 S.Fuchita <fi7s-fct@asahi-net.or.jp>:

ふちた@soramimi_jpです。


5.3.0で印刷するとずれる件ですが、解決しましたのでご報告いたします。


Qt5.3未満では、 printer->paperRect() と printer->pageRect() の返す結果が一致しており、
どちらも、原点が(0, 0)となっていたため、用紙左上隅が原点として印刷されていました。

Qt5.3では、 printer->pageRect() が、オフセットの付いた座標を返すため、そのまま印刷すると、
オフセットが適用された座標に印刷されてしまいました。

次に、その対策として、

    QTransform t;
    t.translate(-page.left(), -page.top());
    painter.setTransform(t);

として、オフセットを相殺するような座標変換をしてみたところ、一見期待通りに動作したのですが、

    QPixmap pixmap(100, 100);
    pixmap.fill(Qt::transparent);
    painter.drawPixmap(0, 0, pixmap);

の様に、用紙の内側かつページの外側に、透明なPixmapを描画したところ、縁が黒く塗られてしまう
という現象が見られました(これはプリンタドライバに依存するようです)

ここまできて、私の知識ではお手上げになりましたので、slashdot.jpで質問したところ、
QPageLayout::setModeを使うといいかも、という提案をもらいました。

    QPageLayout layout = printer->pageLayout();
    layout.setMode(QPageLayout::FullPageMode);
    printer->setPageLayout(layout);

QPageLayout::FullPageModeを指定すると、Qt5.3未満と同じ印刷結果を得ることができました。


【まとめ】
発端: http://blog.soramimi.jp/?p=185
続編: http://blog.soramimi.jp/?p=189
解決: http://blog.soramimi.jp/?p=199

_______________________________________________
Qt-users mailing list
Qt-users@qt-users.jp
http://qt-users.jp/mailman/listinfo/qt-users