2013-10-29 12 views
0

Qt 응용 프로그램에서 머리글, 바닥 글 제목 및 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. 

있어 내가 머리글, 바닥 글 제목과의 TableView 정상적으로 데이터를 인쇄하려면이 문제를 해결할 수있는 방법

document->print(printer); 

?

도움 주셔서 감사합니다. Qt는 한 번에 여러 화가를 사용하는 방법에 대한 불평 경우

답변

0

음, 그것을 사용하게 하나 : 즉, 단지 문서의 각 부분에 대한 작은 루틴으로 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 : 페인트 장치는 한 번에 하나의 페인터로만 칠할 수 있습니다 .' –