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.2k 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.
  • 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 Online
                          J Online
                          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

                          20/22

                          3 Feb 2018, 11:14

                          • Login

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