[SOLVED] PDF Print in multiple pages
-
@filipdns
Hi
To print data from a db, you use
qsqldatabase + QSqlQuery and use
painter.drawText to paint a table.You can also use QTableView + QSqlTableModel and print an image of the
QTableView to get cell painting etc.Alternatively you can use a report generator like
https://sourceforge.net/projects/qtrpt/ -
@filipdns
Hi
To print data from a db, you use
qsqldatabase + QSqlQuery and use
painter.drawText to paint a table.You can also use QTableView + QSqlTableModel and print an image of the
QTableView to get cell painting etc.Alternatively you can use a report generator like
https://sourceforge.net/projects/qtrpt/ -
@mrjj just in case I can not found how to use the report generator, do you have a small sample code with qsqldatabase + QSqlQuery and use painter.drawText to paint a table?
thank you very much -
Im wondering how you want the table to look ?
With captions and cells lines and all the bells?
or would something likeName Age Phone ----------------------------- Mister Muh 12 0014545454545 Miss Miaow 12 0045454 Dude 66 66-66-66-66
Be enough ?
(made with tabs)
-
Im wondering how you want the table to look ?
With captions and cells lines and all the bells?
or would something likeName Age Phone ----------------------------- Mister Muh 12 0014545454545 Miss Miaow 12 0045454 Dude 66 66-66-66-66
Be enough ?
(made with tabs)
-
@mrjj oki, thanks I will try that.
Do you have code sample to get result like you show before from SQLite table?
@filipdns
Well to get result, it would be using
http://doc.qt.io/qt-5/sql-sqlstatements.html(in paintEvent/print) QPainter painter(printer); QSqlQuery query; query.exec("SELECT name, salary FROM employee WHERE salary > 50000"); while (query.next()) { QString name = query.value(0).toString(); int salary = query.value(1).toInt(); QString text = name +"\t" + salary ; // make one row line with tabs painter->drawText(x, y, width, height, Qt::TextExpandTabs , text); // fix width, height // that would print one "row" tabbed }
All names for tables etc are ofc wrong here. Must use your real names.
-
@filipdns
Well to get result, it would be using
http://doc.qt.io/qt-5/sql-sqlstatements.html(in paintEvent/print) QPainter painter(printer); QSqlQuery query; query.exec("SELECT name, salary FROM employee WHERE salary > 50000"); while (query.next()) { QString name = query.value(0).toString(); int salary = query.value(1).toInt(); QString text = name +"\t" + salary ; // make one row line with tabs painter->drawText(x, y, width, height, Qt::TextExpandTabs , text); // fix width, height // that would print one "row" tabbed }
All names for tables etc are ofc wrong here. Must use your real names.
-
@filipdns
Well to get result, it would be using
http://doc.qt.io/qt-5/sql-sqlstatements.html(in paintEvent/print) QPainter painter(printer); QSqlQuery query; query.exec("SELECT name, salary FROM employee WHERE salary > 50000"); while (query.next()) { QString name = query.value(0).toString(); int salary = query.value(1).toInt(); QString text = name +"\t" + salary ; // make one row line with tabs painter->drawText(x, y, width, height, Qt::TextExpandTabs , text); // fix width, height // that would print one "row" tabbed }
All names for tables etc are ofc wrong here. Must use your real names.
@mrjj Hello I try that but I got error :
erreur : C2819: type 'QPainter' does not have an overloaded member 'operator ->'
erreur : C2232: '->QPainter::drawText': left operand has 'class' type, use '.'
erreur : C2065: 'x': undeclared identifier
erreur : C2065: 'y': undeclared identifier
erreur : C3861: 'width': identifier not found
erreur : C3861: 'height': identifier not foundvoid print() { QPrinter printer(QPrinter::HighResolution); //printer.setResolution(1200); printer.setOrientation(QPrinter::Portrait); printer.setPageSize(QPrinter::A4); QPrintDialog *dlg = new QPrintDialog(&printer,0); if(dlg->exec() == QDialog::Accepted) { //QPainter::Antialiasing; QPainter::TextAntialiasing; QPainter painter(&printer); QSqlQuery query; query.exec("SELECT date_etape, immatriculation FROM flight_log"); while (query.next()) { QString date_etape = query.value(0).toString(); QString immatriculation = query.value(1).toString(); QString text = date_etape +"\t" + immatriculation ; // make one row line with tabs painter->drawText(x, y, width, height, Qt::TextExpandTabs , text); // fix width, height // that would print one "row" tabbed } painter.end(); }
-
@filipdns said in
erreur : C2819: type 'QPainter' does not have an overloaded member 'operator ->'
erreur : C2232: '->QPainter::drawText': left operand has 'class' type, use '.'
Those are because painter is not pointer so -> should be .
painter->draw.. should be painter.drawTexterreur : C2065: 'x': undeclared identifier
erreur : C2065: 'y': undeclared identifier
erreur : C3861: 'width': identifier not found
erreur : C3861: 'height': identifier not foundYou have define them
int x=0;
int y=0;
int width = ? ( whole page for width of table ?)
int height = ? ( whole page for height of table ?)Here comes the the fun part.
For each drawText in the while loop
you must do y+=25; // ( actual line height is better but lets forget for a moment)or it would just draw all text on top on each other so we have to change the y for a new row.
-
Hi
Maybe the /t way is too simple.
For a better table look , you can cheat and use HTMLbool createConnection() { QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); db.setDatabaseName(":memory:"); if (!db.open()) { QMessageBox::critical(0, qApp->tr("Cannot open database"), "Click Cancel to exit.", QMessageBox::Cancel); return false; } QSqlQuery query; qDebug() << "table:" << query.exec("create table person (id int primary key, " "firstname varchar(20), lastname varchar(20), num int )"); query.exec("insert into person values(101, 'Dennis', 'Young','1')"); query.exec("insert into person values(102, 'Christine', 'Holand','2')"); query.exec("insert into person values(103, 'Lars junior', 'Gordon','4')"); query.exec("insert into person values(104, 'Roberto', 'Robitaille','5')"); query.exec("insert into person values(105, 'Maria', 'Papadopoulos','3')"); return true; } // credits to. (i adabted from his) https://stackoverflow.com/questions/3147030/qtableview-printing/4079676#4079676 void PrintTable( QPrinter* printer, QSqlQuery& Query ) { QString strStream; QTextStream out(&strStream); const int rowCount = Query.size(); const int columnCount = Query.record().count(); out << "<html>\n" "<head>\n" "<meta Content=\"Text/html; charset=Windows-1251\">\n" << QString("<title>%1</title>\n").arg("TITLE OF TABLE") << "</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++) out << QString("<th>%1</th>").arg(Query.record().fieldName(column)); out << "</tr></thead>\n"; while (Query.next()) { out << "<tr>"; for (int column = 0; column < columnCount; column++) { QString data = Query.value(column).toString(); out << QString("<td bkcolor=0>%1</td>").arg((!data.isEmpty()) ? data : QString(" ")); } out << "</tr>\n"; } out << "</table>\n" "</body>\n" "</html>\n"; QTextDocument document; document.setHtml(strStream); document.print(printer); } void print() { QPrinter printer(QPrinter::HighResolution); printer.setOrientation(QPrinter::Portrait); printer.setPageSize(QPrinter::A4); printer.setOutputFormat(QPrinter::PdfFormat); // printer.setOutputFileName("e:/file.pdf"); // just for me testing QPrintDialog dlg(&printer, 0); if(dlg.exec() == QDialog::Accepted) { QSqlQuery query; query.exec("SELECT * from person"); PrintTable(&printer, query); } } ... //To use // you dont need that just makes my DB createConnection(); print();
And then you can get this
-
@mrjj Hello I try that but I got error :
erreur : C2819: type 'QPainter' does not have an overloaded member 'operator ->'
erreur : C2232: '->QPainter::drawText': left operand has 'class' type, use '.'
erreur : C2065: 'x': undeclared identifier
erreur : C2065: 'y': undeclared identifier
erreur : C3861: 'width': identifier not found
erreur : C3861: 'height': identifier not foundvoid print() { QPrinter printer(QPrinter::HighResolution); //printer.setResolution(1200); printer.setOrientation(QPrinter::Portrait); printer.setPageSize(QPrinter::A4); QPrintDialog *dlg = new QPrintDialog(&printer,0); if(dlg->exec() == QDialog::Accepted) { //QPainter::Antialiasing; QPainter::TextAntialiasing; QPainter painter(&printer); QSqlQuery query; query.exec("SELECT date_etape, immatriculation FROM flight_log"); while (query.next()) { QString date_etape = query.value(0).toString(); QString immatriculation = query.value(1).toString(); QString text = date_etape +"\t" + immatriculation ; // make one row line with tabs painter->drawText(x, y, width, height, Qt::TextExpandTabs , text); // fix width, height // that would print one "row" tabbed } painter.end(); }
@filipdns said in [SOLVED] PDF Print in multiple pages:
QPainter painter(&printer);
Your painter is not a pointer, so change
painter->drawText(x, y, width, height, Qt::TextExpandTabs , text);
to
painter.drawText(x, y, width, height, Qt::TextExpandTabs , text);