パスワードを忘れた? アカウント作成
11009498 journal
日記

paprikaの日記: Qt 5.3.0 で印刷するとずれる 6

日記 by paprika

Qt 5.2.1 から Qt 5.3.0 への移行を評価中です。

Qt 5.3.0 では、印刷機能の改修が行われたそうなのですが、そのせいか、問題が出ております。
QPrinter クラスで印刷を行うと、右下方向に10mm程度ずれて印刷されてしまうという症状です。

↓に詳細をまとめました。
http://blog.soramimi.jp/?p=185

どなたかわかる方いらっしゃらないでしょうか?

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • by paprika (5024) on 2014年05月28日 14時41分 (#2610077) 日記

    対策できました。

    http://blog.soramimi.jp/?p=189 [soramimi.jp]

    用紙座標とページ座標 [qt-project.org]があって、QPainterで描画する際には、ページ座標が用いられる。
    ・ Qt5.3.0未満では、用紙座標の原点とページ座標の原点が共に(0, 0)だった。
    ・ Qt5.3.0では、ページ座標の原点にオフセットが付いてている。

    そんなわけで、painter.setTransformで、明示的に座標変換する必要があるようです。

    • by Anonymous Coward

      それはそれとして、QPageLayout::setMode() では解決できないかな?

      • by paprika (5024) on 2014年05月28日 19時59分 (#2610346) 日記

        layout.setMode(QPageLayout::FullPageMode);
        ですね。今まで知りませんでした。

        期待通りに動作しました。もうしばらく検証してみますが、
        たぶんこれが最もスマートで最良の解決策だと思います。
        QTransformとか面倒なもの使わなくて済むし、素晴らしいです。
        ありがとうございます。

        void MainWindow::on_pushButton_clicked()
        {
                QPrintDialog dlg(this);
                if (dlg.exec() == QDialog::Accepted) {
                        QPrinter *printer = dlg.printer();

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

                        printer->setPaperSize(QPrinter::A4);
                        printer->setOrientation(QPrinter::Portrait);
                        printer->setPageMargins(0, 0, 0, 0, QPrinter::Millimeter);
                        printer->setResolution(254);

                        QPainter painter(printer);
                        painter.setPen(QPen(Qt::black, 20));
                        painter.drawEllipse(0, 0, 2100, 2970);
                }
        }

        親コメント
  • by Anonymous Coward on 2014年05月28日 11時27分 (#2609925)

    painter.drawEllipse(0, 0, 2100, 2970);

    おまえさん、自らX 0,Y 0で座標指定してるやん?
    0, 0から描き初めるんだから、むしろ今迄が間違ってただけで、それで正しいのとちゃうの?
    均等にはみ出させたいなら、ど真ん中をQPoint指定してやらなきゃ駄目やろ?
    まあ紙のサイズを決め打ちするなら、マイナスの座標指定でもいいのかもしらんけどさ。
    いずれにせよ、おまえさんが何を求めていて、どうしたいのかわからんわ。

    • drawEllipseって、リファレンスに「the rectangle beginning at (x, y) with the given width and height」って
      書いてある。開始座標と幅と高さを指定するんよ?中心と半径じゃなくて。
      で、期待する結果としては、用紙の左上隅が(0, 0)になるような描画ね。
      Qt 5.3.0で(0, 0)に何か描くと、それが右下方向にずれるっていう話です。

      親コメント
    • by Anonymous Coward

      そもそもQPainterにプリンタぶん投げて、drawEllipseってのからしてキモいな……
      順番逆じゃね?

      サイズオーバーした楕円を初めに作っておいて、それをプリンタにぶん投げたら挙動も変わりそう。

typodupeerror

あつくて寝られない時はhackしろ! 386BSD(98)はそうやってつくられましたよ? -- あるハッカー

読み込み中...