2010-06-30 5 views
4

Je suis nouveau sur QT un je tente d'imprimer à partir de QTableViewQTableView impression

Comment puis-je faire cela?

Merci beaucoup

Répondre

1

voici ma solution d'un problème. Peut-être que c'est trop complexe ... Mais vous pourriez trouver plus de solutions!

1). d'abord je l'ai enregistré des données de table dans le fichier page HTML:


bool CRefViewerDlg::createHtmlTableFromModel() { 

    // make a html-dump of table view 
    if (tableView) { 

     const QString htmlFileName = QString("%1/%2").arg(qApp->applicationDirPath()).arg("myTable.html"); 

     QFile file(htmlFileName); 

     if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { 
      MSG(QString("Can`t create file %1").arg(htmlFileName)); 
      return false; 
     } 

     QTextStream out(&file); 

     const xbLong rowCount = tableView->model()->rowCount(); 
     const xbLong columnCount = tableView->model()->columnCount(); 

     out << "<html>\n" 
       "<head>\n" 
       "<meta Content=\"Text/html; charset=Windows-1251\">\n" 
      << QString("<title>%1</title>\n").arg(refTitleName) 
      << "</head>\n" 
       "<body bgcolor=#ffffff link=#5000A0>\n" 
       "<table border=1 cellspacing=0 cellpadding=2>\n"; 

     // headers 
     out << "<tr bgcolor=#f0f0f0>"; 
     for (xbLong column = 0; column < columnCount; column++) 
      if (!tableView->isColumnHidden(column)) 
       out << QString("<th>%1</th>").arg(tableView->model()->headerData(column, Qt::Horizontal).toString()); 
     out << "</tr>\n"; 
     file.flush(); 

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

     file.close(); 
    } 

    return true; 
} 

2). après avoir sauvé le contenu html dans un fichier, il a été ouvert dans la fenêtre de vue html, où je pouvais imprimer le document avec QTextBrowser classe:


void CLiveListDlg::on_printPageToolButton_clicked() { 

#ifndef QT_NO_PRINTER 
    QTextBrowser *editor = static_cast<QTextBrowser* >(textBrowser); 
    QPrinter printer; 

    QPrintDialog *dialog = new QPrintDialog(&printer, this); 
    dialog->setWindowTitle(tr("Print Document")); 
    if (editor->textCursor().hasSelection()) 
     dialog->addEnabledOption(QAbstractPrintDialog::PrintSelection); 
    if (dialog->exec() != QDialog::Accepted) 
     return; 

    editor->print(&printer); 
#endif 

} 
0

Que diriez-vous celui-ci?

Traversez le modèle de votre QTableView disons QStandardItemModel. Obtenir les textes individuels et individuels des articles disponibles dans le QStandardItemModel.

Maintenant en utilisant QTextCursor, insérez les textes obtenus de votre modèle dans QTextDocument. Vous pouvez utiliser les exemples donnés here pour insérer du texte dans QTextDocument.

Après l'achèvement de l'insertion dans QTextDocument, vous pouvez imprimer le contenu disponible dans le QTextDocument par

void QTextDocument::print (QPrinter * printer) const 

La chose que vous devez vous assurer est que vous devriez être en mesure de traverser à travers chaque élément afin que vous peut en mesure d'obtenir tout le texte de l'article du modèle.

Hope it helps ..

+0

Cela imprime également la structure de la table? –

8

Voici une variante de la première réponse qui se débarrasse du fichier intermédiaire.

QString strStream; 
    QTextStream out(&strStream); 

    const int rowCount = pPublic->tableView->model()->rowCount(); 
    const int columnCount = pPublic->tableView->model()->columnCount(); 

    out << "<html>\n" 
     "<head>\n" 
     "<meta Content=\"Text/html; charset=Windows-1251\">\n" 
     << QString("<title>%1</title>\n").arg(strTitle) 
     << "</head>\n" 
     "<body bgcolor=#ffffff link=#5000A0>\n" 
     "<table border=1 cellspacing=0 cellpadding=2>\n"; 

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

    // data table 
    for (int row = 0; row < rowCount; row++) { 
     out << "<tr>"; 
     for (int column = 0; column < columnCount; column++) { 
      if (!pPublic->tableView->isColumnHidden(column)) { 
       QString data = pPublic->tableView->model()->data(pPublic->tableView->model()->index(row, column)).toString().simplified(); 
       out << QString("<td bkcolor=0>%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); 

    QPrinter printer; 

    QPrintDialog *dialog = new QPrintDialog(&printer, NULL); 
    if (dialog->exec() == QDialog::Accepted) { 
     document->print(&printer); 
    } 

    delete document; 
+0

Aussi comment voir avant l'impression, merci beaucoup. –

+0

Merci, cela fonctionne. Ce serait encore mieux si l'utilisateur pouvait voir la table des versions imprimées avant la commande print. –

Questions connexes