背景
这只是我的第二个 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_())
