2012-08-23 5 views
3

나는 MySQL 데이터베이스에 연결하고 QTableView에 쿼리의 결과를 표시하는 Python 및 PySide 응용 프로그램이 있습니다. 테이블보기의 내용을 인쇄해야합니다. 여기에 일부 코드입니다 :인쇄 Pyside QTableView

self.db_table = QtGui.QTableView(self) 
    self.model = QtSql.QSqlQueryModel() 
    self.model.setQuery("SELECT * FROM simpsons") 
    self.model.setHeaderData(1, QtCore.Qt.Horizontal, self.tr("First Name")) 
    self.model.setHeaderData(2, QtCore.Qt.Horizontal, self.tr("Last Name")) 
    self.db_table.setModel(self.model) 

    self.print_btn = QtGui.QPushButton("Print") 
    self.print_btn.clicked.connect(self.print_btn_clicked) 

    def print_btn_clicked(self): 
     printDialog = QtGui.QPrintDialog(self.printer, self) 
     if printDialog.exec_() == QtGui.QDialog.Accepted: 
     #printing code 

그래서 도움을

감사

+0

시작 Qt는 문서를 읽기 : http://doc.qt.nokia.com/4.7 여기

는 사용자 정의 인쇄 방법을 수행하여, 테이블에서 직접 인쇄 할 수있는 방법의 대략적인 예입니다 -snapshot/printing.html –

+1

고마워,하지만 난 파이썬으로 C + + 코드를 변환하는 데 문제가 있습니다. 나는 C++을 정말로 모른다. 그러나 Qt 문서는 때때로 도움이된다. –

+3

이 질문은 실제 질문이 아니라 어떻게 닫히지 만 다음은 퀴즈없이 전달됩니까? http://stackoverflow.com/questions/3147030/qtableview-printing?rq=1 – neuronet

답변

4

한 가지 방법으로 감사하겠습니다 내가 이것에 대한 예를 찾을 수 없습니다 나는이 문서에서 많은 것을 이해하지 못한다 테이블 내용을 QTextDocument에 덤프 한 다음 인쇄하십시오.

다음 데모는 간단한 텍스트 테이블을 사용하지만, HTML은 더 정교한 형식을 얻기 위해 사용될 수있다 :

from PyQt4 import QtGui, QtCore 

class Window(QtGui.QWidget): 
    def __init__(self, rows, columns): 
     QtGui.QWidget.__init__(self) 
     self.table = QtGui.QTableView(self) 
     model = QtGui.QStandardItemModel(rows, columns, self.table) 
     for row in range(rows): 
      for column in range(columns): 
       item = QtGui.QStandardItem('(%d, %d)' % (row, column)) 
       item.setTextAlignment(QtCore.Qt.AlignCenter) 
       model.setItem(row, column, item) 
     self.table.setModel(model) 
     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) 
     model = self.table.model() 
     table = cursor.insertTable(
      model.rowCount(), model.columnCount()) 
     for row in range(table.rows()): 
      for column in range(table.columns()): 
       cursor.insertText(model.item(row, column).text()) 
       cursor.movePosition(QtGui.QTextCursor.NextCell) 
     document.print_(printer) 

if __name__ == '__main__': 

    import sys 
    app = QtGui.QApplication(sys.argv) 
    window = Window(25, 2) 
    window.resize(300, 400) 
    window.show() 
    sys.exit(app.exec_()) 
+0

감사합니다 ekhumoro 및 jdi, 귀하의 답변을 모두 좋은 작품이며,하지만 하나만 정답을 선택할 수 있으며 나는 그것을 에코 모로, 인쇄 할 때 그의 방법이 더 멋지 기 때문입니다. –

3

여러 페이지 QTable 인쇄에 접근을 찾고, 당신은 아마 사람을 찾을 것입니다 @ ekhumoro의 답변 에서처럼 QTextDocument로 덤프하거나 직접 페이지 크기를 직접 관리하여 테이블에서 직접 인쇄한다고 말합니다.

class Window(QtGui.QDialog): 

    def __init__(self): 
     ... 
     self.db_table = TableView(self)   

    def print_table(self): 
     dialog = QtGui.QPrintDialog(self) 
     if dialog.exec_() == dialog.Accepted: 
      self.db_table.print_(dialog.printer()) 


class TableView(QtGui.QTableView): 

    def print_(self, printer): 
     model = self.model() 

     rows = model.rowCount() 
     cols = model.columnCount() 

     totalWidth = 0.0 
     for i in xrange(cols): 
      totalWidth += self.columnWidth(i) 

     painter = QtGui.QPainter(printer) 

     pageSize = printer.pageRect() 
     pageHeight = pageSize.height() 

     scaleX = pageSize.width()/totalWidth 
     painter.scale(scaleX, 1.0) 

     totalHeight = 0.0 

     newPage = False 
     offsetY = 0 
     for row in xrange(rows): 

      height = self.rowHeight(row) 
      totalHeight += height 
      if totalHeight > pageHeight: 
       totalHeight = height 
       printer.newPage() 
       newPage = True 

      for col in xrange(cols): 
       idx = model.index(row, col) 
       option = self.viewOptions() 
       option.rect = self.visualRect(idx) 

       if newPage: 
        offsetY = option.rect.y() 
        newPage = False 

       option.rect.moveTop(option.rect.y()-offsetY) 
       self.itemDelegate().paint(painter, option, idx) 

     painter.end()