2015-05-21 65 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錯誤跟蹤器上報告它,我猜... –