如何在PySide/PyQt中将树视图保存为pdf?

如何在PySide/PyQt中将树视图保存为pdf?,qt,pdf,pyqt,pyside,Qt,Pdf,Pyqt,Pyside,短版 我在小部件中嵌入了一个简单的QTreeView: 我想将树保存为PDF格式,以便用户可以打印它。我该怎么做 详细信息 我想在单击“打印”按钮时将树保存为PDF格式。基于并在某种程度上,我尝试了以下方法(请参阅下面的完整SSCCE了解上下文): 但当运行此方法时,我得到一个错误: TypeError: 'PySide.QtGui.QWidget.render' called with wrong argument types. PySide.QtGui.QWidget.render(P

短版

我在小部件中嵌入了一个简单的
QTreeView

我想将树保存为PDF格式,以便用户可以打印它。我该怎么做

详细信息

我想在单击“打印”按钮时将树保存为PDF格式。基于并在某种程度上,我尝试了以下方法(请参阅下面的完整SSCCE了解上下文):

但当运行此方法时,我得到一个错误:

TypeError: 'PySide.QtGui.QWidget.render' called with wrong argument types.  
PySide.QtGui.QWidget.render(PySide.QtGui.QPainter)
奇怪的是,第一个参数是
QPainter
类型,所以我不确定为什么我的代码不能工作,尤其是对类型错误感到困惑

我是否缺少一些简单的两行程序,可以将树导出为PDF格式

SSCCE

from PySide import QtGui, QtCore
import sys

class MyTreeView(QtGui.QWidget):
    def __init__(self, parent = None):
        QtGui.QWidget.__init__(self, parent = None)
        self.setAttribute(QtCore.Qt.WA_DeleteOnClose)
        self.view = QtGui.QTreeView(self)
        self.createModel()
        self.view.setModel(self.model)
        buttonLayout = self.buttonSetup()
        self.makeConnections()
        mainLayout = QtGui.QHBoxLayout(self)
        mainLayout.addWidget(self.view)
        mainLayout.addLayout(buttonLayout)
        self.setLayout(mainLayout)
        self.view.expandAll()

    def createModel(self):
        self.model = QtGui.QStandardItemModel()
        self.model.setHorizontalHeaderLabels(['Task', 'Comment'])
        self.rootItem = self.model.invisibleRootItem()
        #First top-level row and children 
        item0 = [QtGui.QStandardItem('Coding fun'), QtGui.QStandardItem('Make millions')]
        item00 = [QtGui.QStandardItem('Write example'), QtGui.QStandardItem('Keep it simple')]
        item01 = [QtGui.QStandardItem('Post to SO'), QtGui.QStandardItem('Put on flame-retardant vest')]
        item00[0].setCheckable(True)
        item00[0].setCheckState(QtCore.Qt.Unchecked)
        item01[0].setCheckable(True)
        item01[0].setCheckState(QtCore.Qt.Unchecked)
        self.rootItem.appendRow(item0)
        item0[0].appendRow(item00)
        item0[0].appendRow(item01)

    def makeConnections(self):
        self.printButton.clicked.connect(self.print_)
        self.quitButton.clicked.connect(self.close)

    def print_(self):
        printer = QtGui.QPrinter(QtGui.QPrinter.HighResolution)
        printer.setPageSize(QtGui.QPrinter.Letter)
        printer.setOutputFormat(QtGui.QPrinter.PdfFormat)
        printer.setOutputFileName("treeTest.pdf")
        painter = QtGui.QPainter()
        painter.begin(printer)
        self.view.render(painter)
        painter.end()

    def buttonSetup(self):
        self.printButton = QtGui.QPushButton("Print")
        self.quitButton = QtGui.QPushButton("Quit")
        #Lay them out
        buttonLayout = QtGui.QVBoxLayout()
        buttonLayout.addStretch()
        buttonLayout.addWidget(self.printButton)
        buttonLayout.addStretch()
        buttonLayout.addWidget(self.quitButton)
        return buttonLayout


def main():
    app = QtGui.QApplication(sys.argv)
    newTree = MyTreeView()
    newTree.show()
    sys.exit(app.exec_())


if __name__ == "__main__":
    main()
根据,将
QPainter
作为其第一个参数的
QWidget.render
的变体期望将类型为
QPoint
的强制
targetOffset
作为其第二个参数。如果我添加一个空点,它对我有效(尽管树小部件打印得非常小)


这看起来像PySide中的一个bug。和都将
targetOffset
参数指定为可选参数。可能值得在PySide bug追踪器上报告我想。。。
from PySide import QtGui, QtCore
import sys

class MyTreeView(QtGui.QWidget):
    def __init__(self, parent = None):
        QtGui.QWidget.__init__(self, parent = None)
        self.setAttribute(QtCore.Qt.WA_DeleteOnClose)
        self.view = QtGui.QTreeView(self)
        self.createModel()
        self.view.setModel(self.model)
        buttonLayout = self.buttonSetup()
        self.makeConnections()
        mainLayout = QtGui.QHBoxLayout(self)
        mainLayout.addWidget(self.view)
        mainLayout.addLayout(buttonLayout)
        self.setLayout(mainLayout)
        self.view.expandAll()

    def createModel(self):
        self.model = QtGui.QStandardItemModel()
        self.model.setHorizontalHeaderLabels(['Task', 'Comment'])
        self.rootItem = self.model.invisibleRootItem()
        #First top-level row and children 
        item0 = [QtGui.QStandardItem('Coding fun'), QtGui.QStandardItem('Make millions')]
        item00 = [QtGui.QStandardItem('Write example'), QtGui.QStandardItem('Keep it simple')]
        item01 = [QtGui.QStandardItem('Post to SO'), QtGui.QStandardItem('Put on flame-retardant vest')]
        item00[0].setCheckable(True)
        item00[0].setCheckState(QtCore.Qt.Unchecked)
        item01[0].setCheckable(True)
        item01[0].setCheckState(QtCore.Qt.Unchecked)
        self.rootItem.appendRow(item0)
        item0[0].appendRow(item00)
        item0[0].appendRow(item01)

    def makeConnections(self):
        self.printButton.clicked.connect(self.print_)
        self.quitButton.clicked.connect(self.close)

    def print_(self):
        printer = QtGui.QPrinter(QtGui.QPrinter.HighResolution)
        printer.setPageSize(QtGui.QPrinter.Letter)
        printer.setOutputFormat(QtGui.QPrinter.PdfFormat)
        printer.setOutputFileName("treeTest.pdf")
        painter = QtGui.QPainter()
        painter.begin(printer)
        self.view.render(painter)
        painter.end()

    def buttonSetup(self):
        self.printButton = QtGui.QPushButton("Print")
        self.quitButton = QtGui.QPushButton("Quit")
        #Lay them out
        buttonLayout = QtGui.QVBoxLayout()
        buttonLayout.addStretch()
        buttonLayout.addWidget(self.printButton)
        buttonLayout.addStretch()
        buttonLayout.addWidget(self.quitButton)
        return buttonLayout


def main():
    app = QtGui.QApplication(sys.argv)
    newTree = MyTreeView()
    newTree.show()
    sys.exit(app.exec_())


if __name__ == "__main__":
    main()
painter.begin(printer)
try:
    self.view.render(painter, QtCore.QPoint())
finally:
    painter.end()