2009-05-27 10 views
1

を発行します。印刷pageRectとpaperRectは、私は、印刷コードに続くいる

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を)と異なっています。ほとんどの場合、結果の矩形は紙切れです。出力はすべてのプリンタに似ていますか?

+0

QPrinter :: PrinterModeを使用してプリンタオブジェクトを構築しましたか? –

答えて

1

私が見たQtコードは、余白として5%の紙を仮定しています。誰も正確な用紙の余白を信頼しません。

+0

私の場合、QPrinter :: setFullPage()はこの問題を解決しました。 – Fabian

3

これは本当に以前から尋​​ねられましたが、上のコードを取りましたが、何が問題なのかを理解するまでに数時間かかりました。 まず、Qtのソースコードを見ると、5%のマージンを想定した場所が見つかりませんでした。 QtはWindows XPから余白を正しく読み込み、ページマージンを完全に信頼することができます(Windows XPの場合はQt 4.5.3)。

上記のコードには2つの問題があります。書類を印刷するには、fullPageオプションを設定する必要があります。その後、少なくともプレビューにpaperRectが正しく印刷されます。もちろん、実際のプリンタではなく、pageRectの外にあります。 通常、paperRectを印刷することは意味をなさない。なぜなら、正しく印刷されていれば、用紙の境界に正確に位置するからである。

第2の大きな問題は、原点を修正せずにpageRectを印刷することに起因します。 fullPageが無効(デフォルト)の場合、pageRectの原点はpaperRectの原点にあり、余白が含まれます。 しかし、QPoint(leftMargin、topMargin)で印刷が開始されるので、余白が2度追加されます。

問題を解決するには、pageRect.moveTo(0,0)を呼び出してから、pageRectが属している場所にうまく印刷する必要があります。

異なるプリンタでは異なるデバイスマージンから異なる結果が得られます。マージンが0のデバイスだけが元のコードで動作します。

+0

Qtに含まれるQtの例を意味しました。 – Pavels