Skip to main content
 首页 » 编程设计

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

2025年05月04日6artech

背景

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

问题

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

界面细节

几行标题(客户信息、发票编号等)后跟几行: |库存编号 |姓名 |说明 |数量 |价格
底部有一些小计和总计。

打印功能

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

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

谢谢

请您参考如下方法:

我很确定你想要实现的一切都可以使用 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_())