如何创建正确跨越多个页面的可打印列表

时间:2012-01-04 22:03:50

标签: python pyqt pyqt4

背景

这只是我的第二个PyQt4项目。开发一个将INVOICE管理作为其组件之一的Windows应用程序。

问题

我需要有关如何成功创建可以干净打印的列表的建议,即使它跨越多个页面 类似于QTableView或QTableWidget。

UI详细信息

少数标题行(客户信息,发票编号等)后跟行: | SKU#| NAME |描述|数量|价格
底部有一些小计和总计。

打印功能

按下[Ctrl] + P或选择文件 - >打印时,系统打印机对话框将弹出,允许您打印可以跨多个Letter尺寸页面的发票。
或者,是否有一种快速简便的方法来实现打印预览?

我不想花3天时间使用QTableWidget + QPrinter来发现它不能做我需要它做的事情。根据您过去的经验寻找帮助/提示/见解,这将节省我的时间和精力。

由于

1 个答案:

答案 0 :(得分:1)

我非常确定使用PyQt4可以实现所有目标。

我在下面添加了一个基本脚本,演示了您所使用的功能。打印表的格式非常粗糙,但您可以通过使用html而不是我使用的简单文本表轻松实现更高级的功能。

from PyQt4 import QtGui, QtCore

class Window(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self)
        self.setWindowTitle(self.tr('Document Printer'))
        self.table = QtGui.QTableWidget(200, 5, self)
        for row in range(self.table.rowCount()):
            for col in range(self.table.columnCount()):
                item = QtGui.QTableWidgetItem('(%d, %d)' % (row, col))
                item.setTextAlignment(QtCore.Qt.AlignCenter)
                self.table.setItem(row, col, item)
        self.table.setHorizontalHeaderLabels(
            'SKU #|NAME|DESCRIPTION|QUANTITY|PRICE'.split('|'))
        self.buttonPrint = QtGui.QPushButton('Print', self)
        self.buttonPrint.clicked.connect(self.handlePrint)
        self.buttonPreview = QtGui.QPushButton('Preview', self)
        self.buttonPreview.clicked.connect(self.handlePreview)
        layout = QtGui.QGridLayout(self)
        layout.addWidget(self.table, 0, 0, 1, 2)
        layout.addWidget(self.buttonPrint, 1, 0)
        layout.addWidget(self.buttonPreview, 1, 1)

    def handlePrint(self):
        dialog = QtGui.QPrintDialog()
        if dialog.exec_() == QtGui.QDialog.Accepted:
            self.handlePaintRequest(dialog.printer())

    def handlePreview(self):
        dialog = QtGui.QPrintPreviewDialog()
        dialog.paintRequested.connect(self.handlePaintRequest)
        dialog.exec_()

    def handlePaintRequest(self, printer):
        document = QtGui.QTextDocument()
        cursor = QtGui.QTextCursor(document)
        table = cursor.insertTable(
            self.table.rowCount(), self.table.columnCount())
        for row in range(table.rows()):
            for col in range(table.columns()):
                cursor.insertText(self.table.item(row, col).text())
                cursor.movePosition(QtGui.QTextCursor.NextCell)
        document.print_(printer)

if __name__ == '__main__':

    import sys
    app = QtGui.QApplication(sys.argv)
    window = Window()
    window.resize(640, 480)
    window.show()
    sys.exit(app.exec_())