2013-03-26 7 views
5

Ich versuche, Bericht über QWebView zu erstellen, zeigen Sie es über QPrintPreviewDialog und drucken Sie es aus. Angenommen, ich möchte die auf mehrere Seiten aufgeteilte 100-Zeilen-Tabelle erstellen und der Fußzeile jeder Seite die aktuelle Zeilennummer hinzufügen (abstrakte Variante meiner realen Aufgabe). Mein Code:QWebView: Druckprobleme

void MainWindow::preview(){ 
    QPrinter printer; 
    printer.setPageSize(QPrinter::A4); 
    printer.setOrientation(QPrinter::Portrait); 
    printer.setPageMargins(10,10,10,10,QPrinter::Millimeter); 

    QPrintPreviewDialog print_preview(&printer, this); 
    print_preview.setWindowState(Qt::WindowMaximized); 
    connect(&print_preview, SIGNAL(paintRequested(QPrinter*)), this, SLOT(paint_pages(QPrinter*))); 
    print_preview.exec(); 
} 

void MainWindow::paint_pages(QPrinter *printer){ 
    QList<QWebView*> pages; 
    QWebView *current = 0; 
    QPainter painter(printer); 
    int i = 0; 
    while(i <= 100){ 
     current = new QWebView(); 
     pages << current; 
     i = populate_web(current, printer, i); 
    } 
    int pc = pages.count(); 
    for(i = 0; i < pc; i++){ 
     if(i != 0) printer->newPage(); 
     pages.at(i)->render(&painter); 
    } 
    for(i = 0; i < pc; i++) 
     delete pages.at(i); 
} 


int MainWindow::populate_web(QWebView *pg, QPrinter *printer, int n){ 
    QString html = "<html><body>"; 
    html += "<table cellspacing=0 border = 1 style='border-collapse: collapse'>"; 
    int page_height = printer->paperRect(QPrinter::Point).height(); 
    for(++n; n <= 100; n++){ 
     html += QString("<tr><td width=200>%1</td><td width=200>%2</td><td width=300>%3</td></tr>").arg(n).arg(n*n).arg(n*n*n); 
     QString html2 = html + "</table></body></html>"; 
     pg->setHtml(html2); 
     int content_height = pg->page()->mainFrame()->contentsSize().height(); 
     if(content_height + 20 > page_height){ 
      html += "</table>"; 
      html += QString("<p>Current value: %1</p>").arg(n); 
      break; 
     } 
    } 
    if(n > 100) html += "</table>"; 
    html += "</body></html>"; 

    pg->setHtml(html); 
    return n; 
} 

Also, ich hoffe, dass die Tabelle auf dem gesamten Papier rect zu erhalten, mit der Ausnahme von 10-Millimeter-Margen. Aber stattdessen bekomme ich etwas komisches (PICTURE HERE); Was mehr ist - Bildlaufleiste erscheint nicht auf der ersten Seite, nur seit Sekunde. Was muss ich tun, um die ganze Seite mit meiner Tabelle zu füllen und Seiten von Bildlaufleisten freizugeben?

Antwort

1

Nach Zeile:

html += "</body></html>"; 

diese Zeile hinzufügen:

pg->setFixedSize(QSize(printer->width(),printer->height())); 
Verwandte Themen