Je suis nouveau sur QT un je tente d'imprimer à partir de QTableViewQTableView impression
Comment puis-je faire cela?
Merci beaucoup
Je suis nouveau sur QT un je tente d'imprimer à partir de QTableViewQTableView impression
Comment puis-je faire cela?
Merci beaucoup
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(" "));
}
}
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
}
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 ..
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(" "));
}
}
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;
Aussi comment voir avant l'impression, merci beaucoup. –
Merci, cela fonctionne. Ce serait encore mieux si l'utilisateur pouvait voir la table des versions imprimées avant la commande print. –
Cela imprime également la structure de la table? –