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. print preview widget
Forum Updated to NodeBB v4.3 + New Features

print preview widget

Scheduled Pinned Locked Moved Solved General and Desktop
21 Posts 2 Posters 8.8k Views 1 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.
  • R Offline
    R Offline
    rest
    wrote on last edited by
    #1

    like anyone has an example with how to use print preview widget?
    i'm having a main window that has a widget where in paint event i draw some shape, this widget where i draw being in a layout, and i wanna make something like when i trigger and paint action to get the preview like an raport.
    i tried something like this, idk i should make another widget? idk understand how they work
    void MainWindow::on_actionPrint_triggered()
    {
    QPrinter *printer = new QPrinter(QPrinter::PrinterResolution);
    printer->setOutputFormat(QPrinter::PdfFormat);
    printer->setOutputFileName("sample.pdf");
    printer->setPaperSize(QPrinter::A4);
    printer->setFullPage(true);
    printer->setResolution(300);
    QPrintPreviewWidget *preview = new QPrintPreviewWidget(printer,ui->drawGraphicView);
    preview->print();
    }

    1 Reply Last reply
    0
    • mrjjM Offline
      mrjjM Offline
      mrjj
      Lifetime Qt Champion
      wrote on last edited by
      #2

      @rest said in print preview widget:

      QPrintPreviewWidget

      Hi
      Sample here
      https://stackoverflow.com/questions/3827873/how-to-embedded-the-print-preview-dialog-in-qt

      key point is paintRequested
      connect(preview, SIGNAL(paintRequested(QPrinter*)), report, SLOT(Print(QPrinter*)));

      and you then print what you want in Print(..) ( can be named anything)

      Note that you can ask a widget to paint somewhere else using the render() method.

      R 1 Reply Last reply
      3
      • mrjjM mrjj

        @rest said in print preview widget:

        QPrintPreviewWidget

        Hi
        Sample here
        https://stackoverflow.com/questions/3827873/how-to-embedded-the-print-preview-dialog-in-qt

        key point is paintRequested
        connect(preview, SIGNAL(paintRequested(QPrinter*)), report, SLOT(Print(QPrinter*)));

        and you then print what you want in Print(..) ( can be named anything)

        Note that you can ask a widget to paint somewhere else using the render() method.

        R Offline
        R Offline
        rest
        wrote on last edited by
        #3
        This post is deleted!
        1 Reply Last reply
        0
        • R Offline
          R Offline
          rest
          wrote on last edited by rest
          #4

          @mrjj solved, but the size of the preview i can't change it and is in the same line as the toolbar from where i do the printaction, where could be the problem?

          mrjjM 1 Reply Last reply
          1
          • R rest

            @mrjj solved, but the size of the preview i can't change it and is in the same line as the toolbar from where i do the printaction, where could be the problem?

            mrjjM Offline
            mrjjM Offline
            mrjj
            Lifetime Qt Champion
            wrote on last edited by mrjj
            #5

            @rest
            Super.
            The widgets render in the size they have/are.
            If you want it bigger, you could print to image and scale it.
            You can maybe even do it directly with render and painter.scale but
            i never tested this.

            void MainWindow::printshot() {
              QPixmap pix = QPixmap::grabWindow(QApplication::desktop()->winId());
              QPrinter printer(QPrinter::HighResolution);
              printer.setOrientation(QPrinter::Landscape);
            
              QPainter painter;
              painter.begin(&printer);
              double xscale = printer.pageRect().width() / double(pix.width());
              double yscale = printer.pageRect().height() / double(pix.height());
              double scale = qMin(xscale, yscale);
              painter.translate(printer.paperRect().x() + printer.pageRect().width() / 2,
                                printer.paperRect().y() + printer.pageRect().height() / 2);
              painter.scale(scale, scale);
              painter.translate(-width() / 2, -height() / 2); // note uses the form width/height! use pix.h/w if random image
              painter.drawPixmap(0, 0, pix);
              painter.end();
            }
            

            If you need very high fidelity, split your paintEvent into a new function taking a QPainter *
            and call it for printing too. That way you can scale to use the full DPI of the printer.

            • and is in the same line as the toolbar from where i do the printaction
              I do not understand this line :)
            R 1 Reply Last reply
            3
            • mrjjM mrjj

              @rest
              Super.
              The widgets render in the size they have/are.
              If you want it bigger, you could print to image and scale it.
              You can maybe even do it directly with render and painter.scale but
              i never tested this.

              void MainWindow::printshot() {
                QPixmap pix = QPixmap::grabWindow(QApplication::desktop()->winId());
                QPrinter printer(QPrinter::HighResolution);
                printer.setOrientation(QPrinter::Landscape);
              
                QPainter painter;
                painter.begin(&printer);
                double xscale = printer.pageRect().width() / double(pix.width());
                double yscale = printer.pageRect().height() / double(pix.height());
                double scale = qMin(xscale, yscale);
                painter.translate(printer.paperRect().x() + printer.pageRect().width() / 2,
                                  printer.paperRect().y() + printer.pageRect().height() / 2);
                painter.scale(scale, scale);
                painter.translate(-width() / 2, -height() / 2); // note uses the form width/height! use pix.h/w if random image
                painter.drawPixmap(0, 0, pix);
                painter.end();
              }
              

              If you need very high fidelity, split your paintEvent into a new function taking a QPainter *
              and call it for printing too. That way you can scale to use the full DPI of the printer.

              • and is in the same line as the toolbar from where i do the printaction
                I do not understand this line :)
              R Offline
              R Offline
              rest
              wrote on last edited by
              #6

              @mrjj thank you so much but solved it last night, was just a problem when i was using the constructor for the printpreview

              R 1 Reply Last reply
              2
              • R rest

                @mrjj thank you so much but solved it last night, was just a problem when i was using the constructor for the printpreview

                R Offline
                R Offline
                rest
                wrote on last edited by
                #7

                @mrjj but question, when i trigger print i should get an sample.pdf saved somewherE?

                mrjjM 1 Reply Last reply
                0
                • R rest

                  @mrjj but question, when i trigger print i should get an sample.pdf saved somewherE?

                  mrjjM Offline
                  mrjjM Offline
                  mrjj
                  Lifetime Qt Champion
                  wrote on last edited by
                  #8

                  @rest
                  yes if u set the filename and type to pdf
                  printer.setOutputFormat(QPrinter::PdfFormat);
                  printer.setOutputFileName(filename);

                  1 Reply Last reply
                  2
                  • R Offline
                    R Offline
                    rest
                    wrote on last edited by
                    #9

                    @mrjj , i set all this in an action print preview where i have also preview->print;
                    preview->show . but i dont get an pdf saved nowhere

                    1 Reply Last reply
                    0
                    • mrjjM Offline
                      mrjjM Offline
                      mrjj
                      Lifetime Qt Champion
                      wrote on last edited by mrjj
                      #10

                      @mrjj said in print preview widget:

                      printer.setOutputFileName(filename);

                      you control where with setOutputFileName
                      make sure to use / and not \ for the full path to the file

                      1 Reply Last reply
                      1
                      • R Offline
                        R Offline
                        rest
                        wrote on last edited by
                        #11

                        void MainWindow::on_actionPrint_triggered()
                        {
                        QPrinter *printer = new QPrinter(QPrinter::HighResolution);
                        printer->setOutputFormat(QPrinter::PdfFormat);

                        printer->setPaperSize(QPrinter::A4);
                        printer->setOrientation(QPrinter::Landscape);
                        printer->setFullPage(true);
                        //printer->setResolution(100);
                        printer->setOutputFileName("Desktop//aaaa.pdf");

                        QPrintPreviewWidget *preview =0;
                        preview = new QPrintPreviewWidget(printer,preview);

                        preview->print();

                        connect(preview, SIGNAL(paintRequested(QPrinter*)),allWorkspaceShapes[currentIndex]->drawShape,SLOT(Print(QPrinter*)));

                        preview->show();

                        }

                        i used this and still didn't get anything, i have another problem in the code maybe?

                        mrjjM 1 Reply Last reply
                        0
                        • R rest

                          void MainWindow::on_actionPrint_triggered()
                          {
                          QPrinter *printer = new QPrinter(QPrinter::HighResolution);
                          printer->setOutputFormat(QPrinter::PdfFormat);

                          printer->setPaperSize(QPrinter::A4);
                          printer->setOrientation(QPrinter::Landscape);
                          printer->setFullPage(true);
                          //printer->setResolution(100);
                          printer->setOutputFileName("Desktop//aaaa.pdf");

                          QPrintPreviewWidget *preview =0;
                          preview = new QPrintPreviewWidget(printer,preview);

                          preview->print();

                          connect(preview, SIGNAL(paintRequested(QPrinter*)),allWorkspaceShapes[currentIndex]->drawShape,SLOT(Print(QPrinter*)));

                          preview->show();

                          }

                          i used this and still didn't get anything, i have another problem in the code maybe?

                          mrjjM Offline
                          mrjjM Offline
                          mrjj
                          Lifetime Qt Champion
                          wrote on last edited by mrjj
                          #12

                          @rest said in print preview widget:
                          That is NOT a valid path
                          setOutputFileName("Desktop//aaaa.pdf");

                          Please use a valid full path and only single /

                          like
                          C:/Users/SOMEUSERNAME/Desktop/test.pdf

                          1 Reply Last reply
                          1
                          • R Offline
                            R Offline
                            rest
                            wrote on last edited by
                            #13

                            printer->setOutputFileName("C:/Users/admin/Desktop/test.pdf");
                            i tried and nothing :(

                            mrjjM 1 Reply Last reply
                            0
                            • R rest

                              printer->setOutputFileName("C:/Users/admin/Desktop/test.pdf");
                              i tried and nothing :(

                              mrjjM Offline
                              mrjjM Offline
                              mrjj
                              Lifetime Qt Champion
                              wrote on last edited by mrjj
                              #14

                              @rest

                              and you do have write access there ?
                              and the path IS real. meaning u didnt make up the admin name.

                              1 Reply Last reply
                              0
                              • R Offline
                                R Offline
                                rest
                                wrote on last edited by
                                #15

                                @mrjj and then i used this and still does not work
                                printer->setOutputFileName("C:/Users/Public/Public Documents/test.pdf");

                                mrjjM 1 Reply Last reply
                                0
                                • R rest

                                  @mrjj and then i used this and still does not work
                                  printer->setOutputFileName("C:/Users/Public/Public Documents/test.pdf");

                                  mrjjM Offline
                                  mrjjM Offline
                                  mrjj
                                  Lifetime Qt Champion
                                  wrote on last edited by
                                  #16

                                  @rest
                                  and it does show stuff in preview ?
                                  but the file is NOT created?

                                  1 Reply Last reply
                                  0
                                  • R Offline
                                    R Offline
                                    rest
                                    wrote on last edited by
                                    #17

                                    exactly, it shows but it's not saved

                                    mrjjM 1 Reply Last reply
                                    0
                                    • R rest

                                      exactly, it shows but it's not saved

                                      mrjjM Offline
                                      mrjjM Offline
                                      mrjj
                                      Lifetime Qt Champion
                                      wrote on last edited by
                                      #18

                                      @rest
                                      and u press print inside preview ?
                                      to make it actually print and not just preview ?

                                      R 1 Reply Last reply
                                      0
                                      • mrjjM mrjj

                                        @rest
                                        and u press print inside preview ?
                                        to make it actually print and not just preview ?

                                        R Offline
                                        R Offline
                                        rest
                                        wrote on last edited by
                                        #19

                                        @mrjj solved, i had make the print preview and printer object in the constructor of the window

                                        mrjjM 1 Reply Last reply
                                        0
                                        • R rest

                                          @mrjj solved, i had make the print preview and printer object in the constructor of the window

                                          mrjjM Offline
                                          mrjjM Offline
                                          mrjj
                                          Lifetime Qt Champion
                                          wrote on last edited by
                                          #20

                                          @rest
                                          oh, so moving them helped?

                                          R 1 Reply Last reply
                                          0

                                          • Login

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