2015-05-21 64 views
1

短版如何在PySide/PyQt中将树状结构保存为pdf?

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

the gui

我想树保存为PDF格式,因此用户可以打印出来。我怎样才能做到这一点?

详细

我想树保存为PDF当我点击“打印”按钮。基于this question,和上有所Qt documentation,我曾尝试用下面的方法做(见上下文中全SSCCE):

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() 

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

TypeError: 'PySide.QtGui.QWidget.render' called with wrong argument types. 
PySide.QtGui.QWidget.render(PySide.QtGui.QPainter) 

奇怪的是,the documentation for render有第一个参数作为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() 

回答

2

按照docs,具有QPainter作为第一个参数的QWidget.render所述变体预计作为其第二个参数QPoint类型的强制targetOffset。如果我添加一个空白点,它适用于我(虽然树小部件打印得很小)。

painter.begin(printer) 
try: 
    self.view.render(painter, QtCore.QPoint()) 
finally: 
    painter.end() 
+1

这看起来像在PySide中的错误。 [Qt文档](http://doc.qt.io/qt-4.8/qwidget.html#render-2)和[PyQt文档](http://pyqt.sourceforge.net/Docs/PyQt4/qwidget。 html#render-2)都将'targetOffset'参数指定为可选参数。可能值得在PySide错误跟踪器上报告它,我猜... –