2012-01-04 73 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_())