ふちた@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
ふちたさん
橋本@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
朝木です。
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() が、オフセットの付いた座標を返すため、そのまま印刷すると、 オフセットが適用された座標に印刷されてしまいました。
環境等は覚えていませんが、 Qt 4系でもこの双方のサイズが異なる場合があったと思います。
5.3で変化したのはバックエンドの変更があったためだと思いますが、 5.3に関係無く、同じであることを想定しないことをお勧めします。
http://qt-project.org/doc/qt-4.8/qprinter.html#pageRect
Returns the page's rectangle; this is usually smaller than the paperRect() since the page normally has margins between its borders and the paper.
次に、その対策として、
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未満と同じ印刷結果を得ることができました。
QPageLayout は 5.3 で導入されたクラスのため、 以前のバージョンとの互換性を保つのであれば QPrinter::setFullPage() が使えると思います。 http://qt-project.org/doc/qt-5/qprinter.html#setFullPage
よろしくお願いします。
【まとめ】 発端: 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