2009-05-27 7 views
1

Je suit le code d'impression:impression pageRect et paperRect émet

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()); 
} 

Le résultat est différent avec QPrintPreviewDialog, rendu PDF, sortie aux imprimantes (HP LaserJet, PdfFactory, PdfCreator). La plupart du temps, le rectangle résultant est en papier. Que faire si la sortie est similaire à toutes les imprimantes?

+0

De quel QPrinter :: PrinterMode avez-vous utilisé pour construire l'objet imprimante? –

Répondre

1

Le code Qt que j'ai examiné suppose 5% de papier comme marge. Personne ne se fie aux bonnes marges de papier.

+0

QPrinter :: setFullPage() a résolu ce problème dans mon cas. – Fabian

3

Cela a vraiment été demandé il y a quelque temps, mais j'ai pris le code ci-dessus et cela m'a coûté quelques heures pour comprendre, ce qui ne va pas. Tout d'abord, en regardant le code source Qt, je n'ai trouvé aucun endroit qui suppose une marge de 5%. Qt lit correctement les marges à partir de Windows XP et vous pouvez entièrement faire confiance aux marges de la page (Qt 4.5.3 avec Windows XP).

Le code ci-dessus contient deux problèmes: pour imprimer un paperrect, l'option fullPage doit être définie. Le paperRect est ensuite imprimé correctement sur l'aperçu. Bien sûr, pas sur une vraie imprimante, car elle est en dehors de la pageRect. Généralement, l'impression de paperRect n'a aucun sens car, si elle est imprimée correctement, elle se trouve exactement sur la bordure du papier.

Le deuxième problème majeur provient de l'impression de pageRect sans correction de l'origine. Si fullPage est désactivé (par défaut), l'origine pageRect se trouve à l'origine paperRect et inclut donc les marges. Mais l'impression commence à QPoint (leftMargin, topMargin), donc la marge est ajoutée deux fois. Pour corriger le problème, pageRect.moveTo (0,0) doit être appelé, puis le pageRect imprime bien où il appartient.

Que différentes imprimantes montrent des résultats différents proviennent de différentes marges de périphériques. Seuls les périphériques avec marge 0 fonctionneront avec le code d'origine.

+0

Je voulais dire des exemples de Qt inclus dans Qt. – Pavels