Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. Language Bindings
  4. Printing QWidget window using python
Forum Updated to NodeBB v4.3 + New Features

Printing QWidget window using python

Scheduled Pinned Locked Moved Solved Language Bindings
python
22 Posts 2 Posters 11.3k 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.
  • khakhilK khakhil

    No, I do not want screen shot of window.

    I need to send it to printer. I want to print the current widget as it is.

    It is sending to printer, but the output is blank. How can I get widget/window to print ?

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

    @khakhil
    but if u dont want screen shot of the labels (and print that),
    how do you mean to print them?
    a Label is just some text, so you might as well just print it yourself?

    Currently you are only printing the document. so unless you insert into that, its
    not printed.

    in c++ you can draw text to printer like this
    QPrinter printer(QPrinter::HighResolution);
    QPainter painter;
    painter.begin(&printer);
    painter.drawText(xx)
    ...
    http://doc.qt.io/qt-5/printing.html

    is it what you want?
    a Label cannot just print it self
    but you can ask it to draw to the painter
    with the render function.
    http://doc.qt.io/qt-5/qwidget.html#render

    1 Reply Last reply
    1
    • khakhilK Offline
      khakhilK Offline
      khakhil
      wrote on last edited by
      #5

      No, I do not want to print only just labels. I need to print whole window. Please see following image.

      http://theweblogics.com/screen.png

      On click of print button, I need to get this window by printer.

      mrjjM 1 Reply Last reply
      0
      • khakhilK khakhil

        No, I do not want to print only just labels. I need to print whole window. Please see following image.

        http://theweblogics.com/screen.png

        On click of print button, I need to get this window by printer.

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

        @khakhil
        im confused.
        so what is wrong with
        http://stackoverflow.com/questions/10705712/screenshot-of-a-window-using-python
        take image of whole thing and print that image??

        1 Reply Last reply
        1
        • khakhilK Offline
          khakhilK Offline
          khakhil
          wrote on last edited by khakhil
          #7

          thanks @mrjj
          i follow the link you have sent to me

          (http://stackoverflow.com/questions/10705712/screenshot-of-a-window-using-python)

          It works, now i want to get that image/screenshot from directory and send it to printer.
          please help.

          mrjjM 1 Reply Last reply
          0
          • khakhilK khakhil

            thanks @mrjj
            i follow the link you have sent to me

            (http://stackoverflow.com/questions/10705712/screenshot-of-a-window-using-python)

            It works, now i want to get that image/screenshot from directory and send it to printer.
            please help.

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

            @khakhil
            HI
            you will need a way to select real printer
            then load the image from file
            and draw onto a painter connected to the selected printer.

            try to play around with this sample
            http://stackoverflow.com/questions/8193920/print-a-text-through-a-printer-using-pyqt4
            its with preview and all so maybe over the top

            here is c++ function that grabs screenshot and print it.
            (thx to @Ni-Sumi)

            void MainWindow::printPage() {
              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);
              painter.drawPixmap(0, 0, pix);
              painter.end();
            }
            

            I assume u can read enough to translate to py. :)

            khakhilK 1 Reply Last reply
            1
            • khakhilK Offline
              khakhilK Offline
              khakhil
              wrote on last edited by
              #9

              @mrjj

              The link http://stackoverflow.com/questions/8193920/print-a-text-through-a-printer-using-pyqt4
              is very helpful. I solved 90% of my problem.
              now, the problem is that as i select the image to print, the printer not getting the image.
              instead of image it takes "ÿØÿà" and prints it.

              what i do?

              mrjjM 1 Reply Last reply
              0
              • khakhilK khakhil

                @mrjj

                The link http://stackoverflow.com/questions/8193920/print-a-text-through-a-printer-using-pyqt4
                is very helpful. I solved 90% of my problem.
                now, the problem is that as i select the image to print, the printer not getting the image.
                instead of image it takes "ÿØÿà" and prints it.

                what i do?

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

                @khakhil
                it looks like it prints the pointer?
                did you use painter.drawPixmap ?

                khakhilK 1 Reply Last reply
                1
                • mrjjM mrjj

                  @khakhil
                  it looks like it prints the pointer?
                  did you use painter.drawPixmap ?

                  khakhilK Offline
                  khakhilK Offline
                  khakhil
                  wrote on last edited by
                  #11

                  @mrjj
                  not working :( :(

                  mrjjM 1 Reply Last reply
                  0
                  • khakhilK khakhil

                    @mrjj
                    not working :( :(

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

                    @khakhil said:
                    still getting?

                    "ÿØÿà

                    can you post the code. maybe someone can spot the issue :)

                    1 Reply Last reply
                    0
                    • khakhilK Offline
                      khakhilK Offline
                      khakhil
                      wrote on last edited by
                      #13

                      @mrjj

                            if info.completeSuffix() == 'html':
                                 self.editor.setHtml(text)
                             else:
                                 self.editor.setPlainText(text)
                      

                      is there any way like this for .jpg or .tif format ???

                      for the same issue i am also trying the following as @mrjj suggest

                      class Window(QtGui.QWidget):
                        def __init__(self):
                          super(Window, self).__init__()
                          self._new_window = None
                          
                          printer = QtGui.QPrinter()
                          Pixmap = QtGui.QPixmap()
                          pix = QPixmap.grabWindow(QApplication.desktop().winId())
                          printer.setOrientation(printer.Landscape)
                          Painter= QtGui.QPainter() 
                          Painter.begin(printer)
                          xscale = printer.pageRect().width() / (pix.width())
                          yscale = printer.pageRect().height() / (pix.height())
                          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)
                          Painter.drawPixmap(0, 0, pix)
                          Painter.end()
                      

                      but not succeed.

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

                        so it just print "ÿØÿà on piece of paper?
                        or?

                        khakhilK 1 Reply Last reply
                        0
                        • mrjjM mrjj

                          so it just print "ÿØÿà on piece of paper?
                          or?

                          khakhilK Offline
                          khakhilK Offline
                          khakhil
                          wrote on last edited by
                          #15

                          @mrjj
                          yes.. it is printing sometimes II* and sometimes "ÿØÿà" .

                          mrjjM 1 Reply Last reply
                          0
                          • khakhilK khakhil

                            @mrjj
                            yes.. it is printing sometimes II* and sometimes "ÿØÿà" .

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

                            @khakhil said:

                            def init(self):

                            can you try to move the code to a button? ( to a clicked slot)

                            I assume
                            def init(self):
                            is the constructor?
                            Might not be the best spot as object might not be fully shown or
                            the (QApplication.desktop().winId()) dont return what we think.

                            Could u also add a Painter.drawText(200,200, "hello") and see if that comes.?

                            khakhilK 1 Reply Last reply
                            0
                            • mrjjM mrjj

                              @khakhil said:

                              def init(self):

                              can you try to move the code to a button? ( to a clicked slot)

                              I assume
                              def init(self):
                              is the constructor?
                              Might not be the best spot as object might not be fully shown or
                              the (QApplication.desktop().winId()) dont return what we think.

                              Could u also add a Painter.drawText(200,200, "hello") and see if that comes.?

                              khakhilK Offline
                              khakhilK Offline
                              khakhil
                              wrote on last edited by
                              #17

                              @mrjj
                              hey thanks..
                              this code is working properly.

                               printer = QtGui.QPrinter()
                                  Pixmap = QtGui.QPixmap() 
                                  pix= QPixmap.grabWindow(loginwindow.winId())
                                  Painter= QtGui.QPainter() 
                                  Painter.begin(printer)
                                  
                                  Painter.drawPixmap(50, 490, pix)
                                  Painter.end()        
                              

                              It saves images every time i ran the code .
                              what should i do if i don't want to save it but directly print it????

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

                                hi
                                it should print the image.
                                code looks ok.

                                could u try display the image in a label?
                                self.label.setPixmap(pix)

                                to see what u grab

                                1 Reply Last reply
                                0
                                • khakhilK Offline
                                  khakhilK Offline
                                  khakhil
                                  wrote on last edited by
                                  #19

                                  @mrjj
                                  thank you so much for help !!
                                  problem solved :) :)

                                  printer = QtGui.QPrinter()
                                    Pixmap = QtGui.QPixmap() 
                                    pix= QPixmap.grabWindow(loginwindow.winId())
                                    Painter= QtGui.QPainter() 
                                    Painter.begin(printer)
                                  
                                    Painter.drawPixmap(50, 490, pix)
                                    Painter.end()      
                                  

                                  same code works for grab screenshot and print it.

                                  thanks @mrjj

                                  mrjjM 1 Reply Last reply
                                  1
                                  • khakhilK khakhil

                                    @mrjj
                                    thank you so much for help !!
                                    problem solved :) :)

                                    printer = QtGui.QPrinter()
                                      Pixmap = QtGui.QPixmap() 
                                      pix= QPixmap.grabWindow(loginwindow.winId())
                                      Painter= QtGui.QPainter() 
                                      Painter.begin(printer)
                                    
                                      Painter.drawPixmap(50, 490, pix)
                                      Painter.end()      
                                    

                                    same code works for grab screenshot and print it.

                                    thanks @mrjj

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

                                    @khakhil
                                    super! :)
                                    as a little note.
                                    If printer has high DPI, image might become really small.
                                    if that happens u can use the scale function of the pixmap to make it bigger or
                                    use the Painter.translate() as c++ sample showed :)

                                    1 Reply Last reply
                                    0
                                    • mrjjM mrjj

                                      @khakhil
                                      HI
                                      you will need a way to select real printer
                                      then load the image from file
                                      and draw onto a painter connected to the selected printer.

                                      try to play around with this sample
                                      http://stackoverflow.com/questions/8193920/print-a-text-through-a-printer-using-pyqt4
                                      its with preview and all so maybe over the top

                                      here is c++ function that grabs screenshot and print it.
                                      (thx to @Ni-Sumi)

                                      void MainWindow::printPage() {
                                        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);
                                        painter.drawPixmap(0, 0, pix);
                                        painter.end();
                                      }
                                      

                                      I assume u can read enough to translate to py. :)

                                      khakhilK Offline
                                      khakhilK Offline
                                      khakhil
                                      wrote on last edited by
                                      #21

                                      thanks @mrjj
                                      I wll try it later
                                      you saved my life :)

                                      mrjjM 1 Reply Last reply
                                      0
                                      • khakhilK khakhil

                                        thanks @mrjj
                                        I wll try it later
                                        you saved my life :)

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

                                        @khakhil
                                        hehe super :)
                                        Good work.
                                        Im complete python noob but syntax is somewhat the same :)

                                        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