1

次の印刷コードがあります。

void Print(QPrinter *printer)
{
    QPainter q(printer);
    q.setRenderHint(QPainter::HighQualityAntialiasing, true);

    q.setPen(QPen(QColor("red")));
    q.drawRect(printer->pageRect());
    q.drawLine(printer->pageRect().topRight(), printer->pageRect().bottomLeft());

    q.setPen(QPen(QColor("blue")));
    q.drawRect(printer->paperRect());
    q.drawLine(printer->paperRect().topRight(), printer->paperRect().bottomLeft());
}

結果は、QPrintPreviewDialog、レンダリングされた PDF、プリンター (HP LaserJet、PdfFactory、PdfCreator) への出力によって異なります。ほとんどの場合、結果の長方形は紙切れです。出力がすべてのプリンターに似ているようにするにはどうすればよいですか?

4

2 に答える 2

4

これは本当に少し前に尋ねられましたが、私は上からコードを取り、それの何が問題なのかを理解するのに数時間かかりました。まず、Qtのソースコードを見ると、5%のマージンを想定しているところは見つかりませんでした。QtはWindowsXPから余白を正しく読み戻し、ページの余白を完全に信頼できます(WindowsXPではQt4.5.3)。

上記のコードには2つの問題があります。paperrectを印刷するには、fullPageオプションを設定する必要があります。次に、paperRectが少なくともプレビューに正しく印刷されます。もちろん、pageRectの外にあるため、実際のプリンターではありません。一般に、paperRectを印刷しても意味がありません。正しく印刷された場合、それは紙の境界に正確に配置されるためです。

2番目の大きな問題は、原点を修正せずにpageRectを印刷することに起因します。fullPageが無効になっている場合(デフォルト)、pageRectの原点はpaperRectの原点にあるため、マージンが含まれます。ただし、印刷はQPoint(leftMargin、topMargin)から開始されるため、マージンが2回追加されます。

この問題を修正するには、pageRect.moveTo(0,0)を呼び出す必要があります。そうすると、pageRectはそれが属する場所に適切に出力されます。

プリンタが異なれば、デバイスのマージンも異なるため、結果も異なります。マージンが0のデバイスのみが元のコードで機能します。

于 2010-06-08T18:39:01.083 に答える
1

私がレビューした Qt コードは、マージンとして紙の 5% を想定しています。正しい紙の余白を信頼する人は誰もいません。

于 2009-10-09T13:00:43.940 に答える