Python 如何使用QPrinter和QPrintPreviewDialog

Python 如何使用QPrinter和QPrintPreviewDialog,python,printing,pyqt,print-preview,Python,Printing,Pyqt,Print Preview,我想使用PyQt通过打印机预览并打印报告。我尝试了以下代码: printer = QtGui.QPrinter() doc = QtGui.QTextDocument("testing") dialog = QtGui.QPrintDialog(printer) dialog.setModal(True) dialog.setWindowTitle("printerrr") pdialog = QtGui.QPrintPreviewDialog(printer) pdialog.setWind

我想使用PyQt通过打印机预览并打印报告。我尝试了以下代码:

printer = QtGui.QPrinter()
doc  = QtGui.QTextDocument("testing")
dialog = QtGui.QPrintDialog(printer)
dialog.setModal(True)
dialog.setWindowTitle("printerrr")
pdialog = QtGui.QPrintPreviewDialog(printer)
pdialog.setWindowFlags(QtCore.Qt.Window)
pdialog.exec_()

如何预览报告然后打印?

Qt打印对话框的基本演示:

PyQt4

PyQt5

编辑

要打印预览图形视图,请使用其方法:

提供图表打印预览和打印的PyQt5更新:

from PyQt5 import QtChart, QtCore, QtGui, QtPrintSupport, QtWidgets 
import sys
import random

class Window(QtWidgets.QWidget):
    def __init__(self):
        QtWidgets.QWidget.__init__(self)
        self.setWindowTitle(self.tr('Chart Printing'))
        self.chart = QtChart.QChart()
        self.chart_view = QtChart.QChartView(self.chart)
        self.chart_view.setRenderHint(QtGui.QPainter.Antialiasing)
        self.buttonPreview = QtWidgets.QPushButton('Preview', self)
        self.buttonPreview.clicked.connect(self.handle_preview)
        self.buttonPrint = QtWidgets.QPushButton('Print', self)
        self.buttonPrint.clicked.connect(self.handle_print)               
        layout = QtWidgets.QGridLayout(self)
        layout.addWidget(self.chart_view, 0, 0, 1, 2)
        layout.addWidget(self.buttonPreview, 1, 0)        
        layout.addWidget(self.buttonPrint, 1, 1)
        self.create_chart()

    def create_chart(self):
        self.chart.setTitle("Chart Print Preview and Print Example") 
        for i in range(5):     
            series = QtChart.QLineSeries()     
            series.setName("Line {}".format(i + 1))
            series.append(0, 0)
            for i in range(1, 10):
                series.append(i, random.randint(1, 9))
            series.append(10, 10)
            self.chart.addSeries(series)
        self.chart.createDefaultAxes() 

    def handle_print(self):
        printer = QtPrintSupport.QPrinter(QtPrintSupport.QPrinter.HighResolution)
        dialog = QtPrintSupport.QPrintDialog(printer, self)
        if dialog.exec_() == QtPrintSupport.QPrintDialog.Accepted:
            self.handle_paint_request(printer)

    def handle_preview(self):
        dialog = QtPrintSupport.QPrintPreviewDialog()
        dialog.paintRequested.connect(self.handle_paint_request)
        dialog.exec_()

    def handle_paint_request(self, printer):
        painter = QtGui.QPainter(printer)
        painter.setViewport(self.chart_view.rect())
        painter.setWindow(self.chart_view.rect())                        
        self.chart_view.render(painter)
        painter.end()

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    window = Window()
    window.resize(640, 480)
    window.show()
    sys.exit(app.exec_())
编辑:要在Windows上运行上述演示代码,则需要:

> pip install PyQt5  
> pip install pyqt5-tools   
> pip install PyQtChart 

谢谢,我有一个图表我画了它,我如何预览我的图表,我的图表是在QGraphicsView中查看的??我需要一个类似print的方法\uuu我将它与QGraphicsView一起使用??当我在我的图表和图形视图中尝试这样做时:printer=QtGui.QPrinter()pdialog=QtGui.QPrintPreviewDialog()self.render=self.graphicsView.render(QtGui.QPainter(printer))pdialog.paintRequested.connect(self.render)pdialog.exec_389;()它给我这个错误:TypeError:connect()插槽参数应该是一个可调用的ora信号,而不是“非类型”只是一个问题,我将我的数据库显示到QTableView中,我可以从QTableView中获取表并将其插入QGraphicsView中,还是可以打印它???@s.jor.ibra。所有小部件都有一个方法,因此您应该能够使用与图形视图使用的代码类似的代码。
def handlePreview(self):
    # dialog = QtPrintSupport.QPrintPreviewDialog() # PyQt5
    dialog = QtGui.QPrintPreviewDialog()
    dialog.paintRequested.connect(self.handlePaintRequest)
    dialog.exec_()

def handlePaintRequest(self, printer):
    self.view.render(QtGui.QPainter(printer))
from PyQt5 import QtChart, QtCore, QtGui, QtPrintSupport, QtWidgets 
import sys
import random

class Window(QtWidgets.QWidget):
    def __init__(self):
        QtWidgets.QWidget.__init__(self)
        self.setWindowTitle(self.tr('Chart Printing'))
        self.chart = QtChart.QChart()
        self.chart_view = QtChart.QChartView(self.chart)
        self.chart_view.setRenderHint(QtGui.QPainter.Antialiasing)
        self.buttonPreview = QtWidgets.QPushButton('Preview', self)
        self.buttonPreview.clicked.connect(self.handle_preview)
        self.buttonPrint = QtWidgets.QPushButton('Print', self)
        self.buttonPrint.clicked.connect(self.handle_print)               
        layout = QtWidgets.QGridLayout(self)
        layout.addWidget(self.chart_view, 0, 0, 1, 2)
        layout.addWidget(self.buttonPreview, 1, 0)        
        layout.addWidget(self.buttonPrint, 1, 1)
        self.create_chart()

    def create_chart(self):
        self.chart.setTitle("Chart Print Preview and Print Example") 
        for i in range(5):     
            series = QtChart.QLineSeries()     
            series.setName("Line {}".format(i + 1))
            series.append(0, 0)
            for i in range(1, 10):
                series.append(i, random.randint(1, 9))
            series.append(10, 10)
            self.chart.addSeries(series)
        self.chart.createDefaultAxes() 

    def handle_print(self):
        printer = QtPrintSupport.QPrinter(QtPrintSupport.QPrinter.HighResolution)
        dialog = QtPrintSupport.QPrintDialog(printer, self)
        if dialog.exec_() == QtPrintSupport.QPrintDialog.Accepted:
            self.handle_paint_request(printer)

    def handle_preview(self):
        dialog = QtPrintSupport.QPrintPreviewDialog()
        dialog.paintRequested.connect(self.handle_paint_request)
        dialog.exec_()

    def handle_paint_request(self, printer):
        painter = QtGui.QPainter(printer)
        painter.setViewport(self.chart_view.rect())
        painter.setWindow(self.chart_view.rect())                        
        self.chart_view.render(painter)
        painter.end()

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    window = Window()
    window.resize(640, 480)
    window.show()
    sys.exit(app.exec_())
> pip install PyQt5  
> pip install pyqt5-tools   
> pip install PyQtChart