Seite 1 von 1

painter->viewport() unter Windows zu klein

Verfasst: 24. März 2013 12:08
von KuhTee
Hallo,
ich möchte bei der Druckausgabe einen Rahmen ausgeben.

Ich programmiere unter Ubuntu und anschließend erzeuge ich unter Windows ein Windowsprogramm.

Drucker: HP Laserjet 1100, Blattgröße A4

Unter Unbuntu funktioniert alles.

Code: Alles auswählen

printer->getPageMargins(&left,&top,&right,&bottom,unit);
Linux+Windows: left=20mm top=10mm right=10mm bottom=10mm

Code: Alles auswählen

QRect koord = printer->pageRect();
int x1,y1,x2,y2;
koord.getCoords(&x1,&y1,&x2,&y2);
Linux:    x1=76 y1=38 x2=754 y2=1084
Windows:  x1=76 y1=38 x2=755 y2=1084

Code: Alles auswählen

koord = printer->paperRect();
koord.getCoords(&x1,&y1,&x2,&y2);
Linux:    x1=0 y1=0 x2=792 y2=1122
Windows:  x1=0 y1=0 x2=793 y2=1121
Soweit noch alles bestens, aber

Code: Alles auswählen

QRect  rect = painter->viewport();
rect.getCoords(&x1,&y1,&x2,&y2);
Linux:    x1=0 y1=0 x2=678 y2=1046     754-76 = 678 i.O.    bzw. 1084-38 = 1046 i.O.
Windows:  y1=0 y1=0 x2=634 y2=1003     755-76 = 679 != 634
Das Windowsrechteck ist zu klein.

Wähle ich einen PDF-Drucker gibt es unter Linux bzw. Windows keine Probleme.

In der Windowswelt habe ich auch weitere Drucker ausprobiert, teilweise mit dem gleichen Effekt, das der Viewport zu klein ist.

Frage:
Kann ich den Viewport beeinflussen ?

Grüße
KuhTee

Re: painter->viewport() unter Windows zu klein

Verfasst: 25. März 2013 07:54
von odt
Hallo KuhTee

Ich nehme an, dass Du den Viewport für den druckbaren Bereich möchtest. Dieser wird von Druckertreiber "geliefert" und kann je Os/Printer unterschiedlich sein. Ich habe eben meinen Druckcode durchforstet, und wundere mich, warum ich ihn nicht brauche. Vermutlich weil ich ihn ignoriere ;)

Code: Alles auswählen

		_printer->setFullPage( true );
		_printer->setPageSize( style()->pageSize() );
		_printer->setOrientation( style()->orientation() );
		_printer->setPaperSource( (QPrinter::PaperSource) _style->schacht() );
		if( !painter.begin( _printer ) ){
		respektive
		if( !_printer->newPage() ){
Nun (setFullPage) kann ich quasi das ganze Blatt bedrucken. Da ich die Seitenränder eh selber festlege...

Viele Grüsse und e gueti Wuche
Reto

Re: painter->viewport() unter Windows zu klein

Verfasst: 26. März 2013 19:32
von KuhTee
Hallo Reto,
wieder etwas gelernt, aber das Problem noch nicht behoben.

Bei der ersten Druckvorschau wird der Rahmen noch mit den richtigen Randabständen angezeigt.

Rufe ich den Vorschaudialog nochmals auf, wird der Viewport wie von Geisterhand kleiner ?

Grüße
KuhTee

Code: Alles auswählen

preview
pageRect             =  21 24 768 1102
paperRect            =  0 0 793 1121
papeMargins          =  19.99 9.99002 9.99002 9.99002
 
printPage (1ter Aufruf)
HP LaserJet 1100 (MS)
fullpage=FALSE
pageRect             =  76 38 755 1084
paperRect            =  0 0 793 1121
papeMargins          =  19.99 9.99002 9.99002 9.99002
paper_Viewport       = 0 0 679 1121
 
printPage (2ter Aufruf Preview --> Seite einrichten)
HP LaserJet 1100 (MS)
fullpage=FALSE
pageRect             =  76 38 755 1084
paperRect            =  0 0 793 1121
papeMargins          =  19.99 9.99002 9.99002 9.99002
paper_Viewport       =  0 0 634 1121

Code: Alles auswählen

void MainWindow::printPage(QPainter *painter, QPrinter *printer) {

    qDebug() << "printPage";
    printer->setFullPage(false);

    ui->textEdit->append(" ");
    ui->textEdit->append("printPage");
    ui->textEdit->append(printer->printerName());
    if(printer->fullPage()) ui->textEdit->append("fullpage=TRUE"); else ui->textEdit->append("fullpage=FALSE");


    QString mess;
    QRect koord = printer->pageRect();
    int x1,y1,x2,y2;
    int xx1,yy1,xx2,yy2;
    koord.getCoords(&x1,&y1,&x2,&y2);
    mess = QString("pageRect             =  %1 %2 %3 %4").arg(x1).arg(y1).arg(x2).arg(y2);                  ui->textEdit->append(mess);

    koord = printer->paperRect();
    koord.getCoords(&x1,&y1,&x2,&y2);
    mess = QString("paperRect            =  %1 %2 %3 %4").arg(x1).arg(y1).arg(x2).arg(y2);                  ui->textEdit->append(mess);

    QPrinter::Unit unit;
    qreal  left, top, right, bottom;
    printer->getPageMargins(&left,&top,&right,&bottom,unit);
    mess = QString("papeMargins          =  %1 %2 %3 %4").arg(left).arg(top).arg(right).arg(bottom);        ui->textEdit->append(mess);

    QRect    rect = painter->viewport();
    rect.getCoords(&xx1,&yy1,&xx2,&yy2);
    mess = QString("paper_Viewport       =  %1 %2 %3 %4").arg(xx1).arg(yy1).arg(xx2).arg(y2);               ui->textEdit->append(mess);

    painter->setPen(QPen(Qt::blue,1));
    painter->drawLine(x1,y1,x2,y2);
    painter->drawLine(x1,y1,x2,y1);
    painter->drawLine(x1,y2,x2,y2);

    painter->setPen(QPen(Qt::red,1));
    painter->drawLine(xx1,yy1,xx2,yy2);
    painter->drawLine(xx1,yy1,xx2,yy1);
    painter->drawLine(xx1,yy2,xx2,yy2);
}

Re: painter->viewport() unter Windows zu klein

Verfasst: 27. März 2013 07:47
von odt
Seltsam, mit dem PrintPreview hatte ich auch schon etwas Sorgen, insbesondere bei mehreren Seitenformaten im Dokument.
Dieses Verhalten kann ich bei mir unter Linux mit einem HP-CM3530 nicht nachvollziehen.

Tips:
QPrinter::Unit unit wird nicht initialisiert.
printer->setFullPage(false); <- true

Re: painter->viewport() unter Windows zu klein

Verfasst: 12. Mai 2013 10:30
von KuhTee
Hallo,
Problem ist nicht gelöst, aber ausreichend behoben.

Unter LInux gibt es bei allen von mir ausprobierten Druckern keine Probleme.

Unter Windows funktionieren nur PDF-Drucker ( PDF-Creator, eDocPrinter, usw. ) ohne Probleme.

Ich habe auch QT5 unter Windows ausprobiert, aber mit dem gleichen Effekt.
Der Vorschaudialog unter Windows verändert die Seitenränder.

So habe ich es jetzt gelöst:

Code: Alles auswählen

void MainWindow::menuclick_datei_druckvorschau()
{
    QPrinter printer2;
    QPrintPreviewDialog preview(&printer2,this);
    prausgabe->parameterdrucker(&printer2);
    connect(&preview,SIGNAL(paintRequested(QPrinter*)),prausgabe,SLOT(printdocument(QPrinter *)));
    preview.exec();
}


void MainWindow::menuclick_datei_drucken()
{
    QPrinter printer1;
    QPrintDialog dialog(&printer1,this);
    prausgabe->parameterdrucker(&printer1);
     if(dialog.exec() == QDialog::Accepted) {
         prausgabe->printdocument(&printer1);
     }
}

Code: Alles auswählen

void Drucken::parameterdrucker(QPrinter *printer) {
#ifdef Q_OS_LINUX
    printer->setFullPage(false);
#endif
#ifdef Q_OS_WIN32
    printer->setFullPage(true);
#endif
    printer->setFullPage(false);
    printer->setFromTo(1,pages);
    printer->setPrintRange(QPrinter::AllPages);
    printer->setPageSize(QPrinter::A4);
    printer->setPageMargins(20.0,10.0,10.0,10.0,QPrinter::Millimeter);
}
Grüße
KuhTee