>This is Qt programming at its most basic. Original problem, I have a QWebView and I want to print it. DO NOT follow the exact syntax from riverbankRiverbank Computing word for word. This is how you should do it if you want it quickly and effectively, I am following their guidlines using signals and slots.
#!/usr/bin/env python """ Lets get the print thing working """ from PyQt4.QtGui import * from PyQt4.QtCore import * import PyQt4.QtWebKit as QtWebKit import sys class htmlViewer(QtWebKit.QWebView): def __init__(self,url, parent=None): QtWebKit.QWebView.__init__(self,parent) self.setUrl(QUrl(url)) self.preview = QPrintPreviewDialog() self.connect(self.preview,SIGNAL("paintRequested (QPrinter *)"),SLOT("print (QPrinter *)")) self.connect(self,SIGNAL("loadFinished (bool)"),self.execpreview) def execpreview(self,arg): print arg self.preview.exec_() if __name__=="__main__": app = QApplication(sys.argv) myurl = "http://www.google.com" widget = htmlViewer(myurl) widget.show() sys.exit(app.exec_())
So I have two signals, the first one is a pain, I think I would have saved myself a lot of trouble if I had never tried to put "void" near the SIGNAL calls. Anyway, the QPrintPreviewDialog will emit the "paintRequest()" signal twice. The first time it emits it a preview is made the second time it emits the QWebView uses its print command with the QPrintPreviewDialog printer which knows to print this time.
No lets say I wanted to have the file print without a print slot. This is important because it introduces the use of a QPainter() for this example my paint device is a printer but the paint device could be a QWidget such as a QPixmap. This file actually uses the whole example you can use it to print images qt_print.py and here is the function I used to replace the print() slot.
#new connect statement self.connect(self.preview,SIGNAL("paintRequested (QPrinter *)"),self.what) #new 'print' function def what(self,printer): painter = QPainter() painter.begin(other) self.mylabel.render(painter) painter.end()
Also if you do not want to use the QPrintPreviewDialog then you could just send a printer to that function.
Lastely, the QPrintPreviewDialog does not display images properly unless the scale is 100%, but it prints fine.