如何在 PySide/PyQt 中将树视图另存为 pdf?
How to save a treeview as pdf in PySide/PyQt?
短版
我有一个简单的 QTreeView
嵌入到小部件中:
我想将树保存为 PDF 以便用户打印。我怎样才能做到这一点?
详情
我想在单击 'print' 按钮时将树保存为 PDF。基于 this question, and somewhat on 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()
根据 docs,第一个参数为 QPainter
的 QWidget.render
的变体需要类型为 QPoint
的强制性 targetOffset
作为它的第二个参数。如果我添加一个空点,它对我有用(尽管树小部件打印得非常小)。
painter.begin(printer)
try:
self.view.render(painter, QtCore.QPoint())
finally:
painter.end()
短版
我有一个简单的 QTreeView
嵌入到小部件中:
我想将树保存为 PDF 以便用户打印。我怎样才能做到这一点?
详情
我想在单击 'print' 按钮时将树保存为 PDF。基于 this question, and somewhat on 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()
根据 docs,第一个参数为 QPainter
的 QWidget.render
的变体需要类型为 QPoint
的强制性 targetOffset
作为它的第二个参数。如果我添加一个空点,它对我有用(尽管树小部件打印得非常小)。
painter.begin(printer)
try:
self.view.render(painter, QtCore.QPoint())
finally:
painter.end()