Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. [SOLVED] PDF Print in multiple pages
Forum Updated to NodeBB v4.3 + New Features

[SOLVED] PDF Print in multiple pages

Scheduled Pinned Locked Moved General and Desktop
22 Posts 5 Posters 15.0k Views 4 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • M mrjj
    30 Jan 2018, 16:36

    @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/

    F Offline
    F Offline
    filipdns
    wrote on 1 Feb 2018, 07:08 last edited by
    #9

    @mrjj Thanks a lot for your reply, the report generator look very nice but I don't understand yet how to include this to my project to make automatic report by click button, I have to study again the readme ;-)

    1 Reply Last reply
    0
    • M mrjj
      30 Jan 2018, 16:36

      @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/

      F Offline
      F Offline
      filipdns
      wrote on 1 Feb 2018, 07:10 last edited by
      #10

      @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

      M 1 Reply Last reply 1 Feb 2018, 07:15
      0
      • F filipdns
        1 Feb 2018, 07:10

        @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

        M Offline
        M Offline
        mrjj
        Lifetime Qt Champion
        wrote on 1 Feb 2018, 07:15 last edited by
        #11

        @filipdns

        Hi
        I have not seen any samples that uses text. most print an image.

        F 1 Reply Last reply 1 Feb 2018, 07:16
        0
        • M mrjj
          1 Feb 2018, 07:15

          @filipdns

          Hi
          I have not seen any samples that uses text. most print an image.

          F Offline
          F Offline
          filipdns
          wrote on 1 Feb 2018, 07:16 last edited by
          #12

          @mrjj I understand, thank you

          M 1 Reply Last reply 1 Feb 2018, 09:23
          0
          • F filipdns
            1 Feb 2018, 07:16

            @mrjj I understand, thank you

            M Offline
            M Offline
            mrjj
            Lifetime Qt Champion
            wrote on 1 Feb 2018, 09:23 last edited by
            #13

            @filipdns

            Im wondering how you want the table to look ?

            With captions and cells lines and all the bells?
            or would something like

            Name        Age  Phone
            -----------------------------
            Mister Muh  12   0014545454545
            Miss Miaow  12   0045454
            Dude        66   66-66-66-66
            

            Be enough ?

            (made with tabs)

            F 1 Reply Last reply 1 Feb 2018, 10:38
            0
            • M mrjj
              1 Feb 2018, 09:23

              @filipdns

              Im wondering how you want the table to look ?

              With captions and cells lines and all the bells?
              or would something like

              Name        Age  Phone
              -----------------------------
              Mister Muh  12   0014545454545
              Miss Miaow  12   0045454
              Dude        66   66-66-66-66
              

              Be enough ?

              (made with tabs)

              F Offline
              F Offline
              filipdns
              wrote on 1 Feb 2018, 10:38 last edited by
              #14

              @mrjj I would like add logo but your example is good point to start

              M 1 Reply Last reply 1 Feb 2018, 10:44
              0
              • F filipdns
                1 Feb 2018, 10:38

                @mrjj I would like add logo but your example is good point to start

                M Offline
                M Offline
                mrjj
                Lifetime Qt Champion
                wrote on 1 Feb 2018, 10:44 last edited by
                #15

                @filipdns
                Hi
                well to add logo, you just draw an image
                with drawPixmap where you want.

                F 1 Reply Last reply 1 Feb 2018, 14:44
                0
                • M mrjj
                  1 Feb 2018, 10:44

                  @filipdns
                  Hi
                  well to add logo, you just draw an image
                  with drawPixmap where you want.

                  F Offline
                  F Offline
                  filipdns
                  wrote on 1 Feb 2018, 14:44 last edited by
                  #16

                  @mrjj oki, thanks I will try that.

                  Do you have code sample to get result like you show before from SQLite table?

                  M 1 Reply Last reply 1 Feb 2018, 15:06
                  0
                  • F filipdns
                    1 Feb 2018, 14:44

                    @mrjj oki, thanks I will try that.

                    Do you have code sample to get result like you show before from SQLite table?

                    M Offline
                    M Offline
                    mrjj
                    Lifetime Qt Champion
                    wrote on 1 Feb 2018, 15:06 last edited by mrjj 2 Jan 2018, 15:31
                    #17

                    @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.

                    F 2 Replies Last reply 1 Feb 2018, 15:30
                    0
                    • M mrjj
                      1 Feb 2018, 15:06

                      @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.

                      F Offline
                      F Offline
                      filipdns
                      wrote on 1 Feb 2018, 15:30 last edited by
                      #18

                      @mrjj thank you so much!! I will try that!!

                      1 Reply Last reply
                      0
                      • M mrjj
                        1 Feb 2018, 15:06

                        @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.

                        F Offline
                        F Offline
                        filipdns
                        wrote on 3 Feb 2018, 11:07 last edited by
                        #19

                        @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 found

                        void 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();
                            }
                        
                        J 1 Reply Last reply 5 Feb 2018, 07:07
                        0
                        • M Offline
                          M Offline
                          mrjj
                          Lifetime Qt Champion
                          wrote on 3 Feb 2018, 11:14 last edited by
                          #20

                          @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.drawText

                          erreur : C2065: 'x': undeclared identifier
                          erreur : C2065: 'y': undeclared identifier
                          erreur : C3861: 'width': identifier not found
                          erreur : C3861: 'height': identifier not found

                          You 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.

                          1 Reply Last reply
                          0
                          • M Offline
                            M Offline
                            mrjj
                            Lifetime Qt Champion
                            wrote on 3 Feb 2018, 12:43 last edited by
                            #21

                            Hi
                            Maybe the /t way is too simple.
                            For a better table look , you can cheat and use HTML

                            bool 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("&nbsp;"));
                                }
                                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
                            alt text

                            1 Reply Last reply
                            1
                            • F filipdns
                              3 Feb 2018, 11:07

                              @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 found

                              void 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();
                                  }
                              
                              J Offline
                              J Offline
                              jsulm
                              Lifetime Qt Champion
                              wrote on 5 Feb 2018, 07:07 last edited by
                              #22

                              @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);
                              

                              https://forum.qt.io/topic/113070/qt-code-of-conduct

                              1 Reply Last reply
                              1

                              18/22

                              1 Feb 2018, 15:30

                              • Login

                              • Login or register to search.
                              18 out of 22
                              • First post
                                18/22
                                Last post
                              0
                              • Categories
                              • Recent
                              • Tags
                              • Popular
                              • Users
                              • Groups
                              • Search
                              • Get Qt Extensions
                              • Unsolved