如何创建可正确跨页打印的列表

3 投票
1 回答
857 浏览
提问于 2025-04-17 09:34

背景

这是我第二个使用PyQt4做的项目。我正在开发一个Windows应用程序,其中有一个功能是管理发票。

问题

我需要一些建议,如何创建一个可以整洁打印的列表,即使它跨越多页也没问题。
我想要的类似于QTableView或QTableWidget。

用户界面细节

列表的顶部有几行标题(比如客户信息、发票号码等),然后是以下几列的内容:
| SKU编号 | 名称 | 描述 | 数量 | 价格
底部还会有一些小计和总计。

打印功能

当按下[Ctrl]+P或者选择文件-->打印时,系统的打印对话框应该弹出来,让你可以打印发票,发票可能会跨越多张信纸大小的页面。
另外,有没有简单快捷的方法来实现打印预览?

我不想花三天时间使用QTableWidget和QPrinter,结果发现它不能满足我的需求。我希望能从你们的经验中获得一些帮助、建议或见解,这样可以节省我的时间和精力。

谢谢

1 个回答

2

我很确定你想要实现的所有功能都可以用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_())

撰写回答