2012-01-04 119 views
2

背景

这只是我的第二个PyQt4项目。开发一个将INVOICE管理作为其组件之一的Windows应用程序。
如何创建正确跨越多页的可打印列表

问题

我需要如何成功地创建一个可以打印干净,即使在多个页面跨越名单的建议。
类似QTableView或QTableWidget。

UI细节

很少有标题行(客户信息,发票号码等),其次是行: | SKU#| NAME |描述| QUANTITY |价格
底部有一些小计和总计。

打印功能

当[Ctrl]键+ P按下或文件 - >选择打印,系统打印机对话框应弹出让您打印,可以跨越多个信纸大小的页面的发票。
(可选)有没有一种快速简单的方法来实现打印预览?

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

感谢

回答

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_())