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.5k 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: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

                      22/22

                      5 Feb 2018, 07:07

                      • Login

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