2013-10-29 50 views
0

在我的Qt應用程序中,我想創建一個包含Header,Footer標題和TableView的內容的預覽頁面。同時使用QPrinter,QPainter和QTextDocument獲取錯誤消息

這是我使用的代碼:

void MainWindow::print(QPrinter *printer) 
{ 
    int xscale = 50; 
    int yscale = 30; 

    QPoint top_left = QPoint(xscale, yscale); 
    QPoint top_right = QPoint(xscale + 552, yscale + 20); 
    QPoint bottom_left = QPoint(xscale, yscale + 1020); 
    QPoint bottom_right = QPoint(xscale + 492, yscale + 1020); 

    QPainter painter(printer); 
    painter.setRenderHints(QPainter::Antialiasing | 
         QPainter::TextAntialiasing | 
         QPainter::SmoothPixmapTransform, true); 

    // Header 
    painter.setFont(QFont("Arial", 10)); 
    painter.drawImage(top_left, QImage(":/images/images/logo.png")); 
    painter.drawText(top_right, "Header"); 

    // Print the Table 
    QString strStream; 
    QTextStream out(&strStream); 

    out << "<html>\n" 
      "<head>\n" 
       "<meta content=\"text/html; charset=utf-8\">\n" 
       "<title>Demo MyTableView</title>\n" 
       "<style tyle=\"text/css\">th{font-size: 14pt}\n td{font-size: 12pt}\n table td + td + td + td{font-weight:bold}</style>" 
      "</head>\n" 
      "<body bgcolor=#ffffff link=#5000A0>\n" 
       "<table cellspacing=\"0\" cellpadding=\"2\" border=\"1\" width=\"100%\">\n"; 

    // Print the headers 
    out << "<thead><tr bgcolor=\"#ffffff\">"; 
    for (int column = 0; column < columnCount; column++) 
     if (!myTableView->isColumnHidden(column)) 
      out << QString("<th>%1</th>").arg(myTableView->model()->headerData(column, Qt::Horizontal).toString()); 
    out << "</tr></thead>\n"; 

    // Print the data 
    for (int row = 0; row < rowCount; row++) { 
     out << "<tr>"; 
     for (int column = 0; column < columnCount; column++) { 
      if (!myTableView->isColumnHidden(column)) { 
       QString data = myTableView->model()->data(myTableView->model()->index(row, column)).toString().simplified(); 
       out << QString("<td bkcolor=0 align=center>%1</td>").arg((!data.isEmpty()) ? data : QString("&nbsp;")); 
      } 
     } 
     out << "</tr>\n"; 
    } 
    out << "</table>\n" 
     "</body>\n" 
     "</html>\n"; 

    QTextDocument *document = new QTextDocument(); 
    document->setHtml(strStream); 
    document->print(printer); // I got the error messages at here 
    delete document; 

    // Footer 
    painter.setFont(QFont("Arial", 10)); 
    painter.drawText(bottom_left, "Copyright 2013"); 

    // Get current date and time 
    QDateTime dateTime = QDateTime::currentDateTime(); 
    QString dateTimeString = dateTime.toString(); 
    painter.drawText(bottom_right, dateTimeString); 
} 

當我運行應用程序,我只看到在預覽頁頁眉和頁腳標題,沒有顯示的TableView。然後我用qDebug()來檢查,我得到了錯誤的信息

QPrinter::setDocName: Cannot be changed while printer is active 
QPainter::begin: A paint device can only be painted by one painter at a time. 

在該行

document->print(printer); 

我該如何解決這個問題與頁眉,頁腳標題和TableView中正常打印數據?

感謝您的幫助!

回答

0

好吧,如果Qt的抱怨使用多個畫家在同一時間,讓它只用一個:)換句話說,只拆分代碼在你MainWindow::print()功能分爲較小的程序爲您的文檔的每個部分:

void MainWindow::drawHeader(QPrinter *printer) 
{ 
    QPainter painter(printer); 
    // .. Draw the header 
    [..] 
} 

void MainWindow::drawFooter(QPrinter *printer) 
{ 
    QPainter painter(printer); 
    painter.setFont(QFont("Arial", 10)); 
    painter.drawText(bottom_left, "Copyright 2013"); 
    [..] 
} 

void MainWindow::drawTable(QPrinter *printer) 
{ 
    QTextDocument document; 
    document.print(printer); 
    [..] 
} 

最後:

void MainWindow::print(QPrinter *printer) 
{ 
    // Init something. 
    drawHeader(printer); 
    drawTable(printer); 
    drawFooter(printer); 
    [..] 
} 
+0

我試圖梳理這是其次您的建議的代碼,但結果是一樣的。我只看到頁眉和頁腳標題。 –

+0

什麼是錯誤?它一樣嗎? – vahancho

+0

我仍然收到錯誤信息,如上面的錯誤信息 'QPrinter :: setDocName:打印機處於活動狀態時無法更改' 'QPainter :: begin:一個繪畫設備一次只能由一個畫家繪製。 –

相關問題