简体   繁体   中英

print tableview or model in pyqt5

I'm trying to print a content of a tableview or the model taht running the table view by using the Qprinter and QPrintPreviewDialog but the best that I can get is an empty table like this

在此处输入图片说明

this is my code for handle Preview

def handlePreview(self):
        dialog = QtPrintSupport.QPrintPreviewDialog()
        dialog.setFixedSize(1000,690)
        dialog.paintRequested.connect(self.handlePaintRequest)
        dialog.exec_()

nd for the handle Print Request

def handlePaintRequest(self, printer):
        #printer = QPrinter()
        database = QSqlDatabase("QPSQL")
        database.setHostName("localhost")
        database.setDatabaseName("database")
        database.setUserName("username")
        database.setPassword("password")
        database.open()
        
        self.model_hjd = QSqlTableModel(db=database)
        self.model_hjd.setTable('transactions')

        date = str(self.dateEdit_10.text())
        date_2 = str(self.dateEdit_14.text())
        self.model_hjd.select()
        filter_ft = "date_d BETWEEN '%s' AND '%s'" % (date, date_2)
        self.model_hjd.setFilter(filter_ft)

        rows = self.model_hjd.rowCount()
        columns = self.model_hjd.columnCount()
        print (rows)
        print (columns)

        self.model_hjd =  QtGui.QStandardItemModel(self)
        #self.tableView_22.setModel(self.model_hjd)
        #self.table.setModel(self.model_hjd)

        for row in range(self.model_hjd.rowCount()):
            for column in range(self.model_hjd.columnCount()):
                myitem = self.model_hjd.item(row,column)
                if myitem is None:
                    item = QtGui.QStandardItem("")
                    self.model_hjd.setItem(row, column, item)

        document = QtGui.QTextDocument()
        cursor = QtGui.QTextCursor(document)
        #model_hjd = self.tableView_22.model_hjd()
        table = cursor.insertTable(rows, columns)
        for row in range(rows):
            for column in range(table.columns()):
                cursor.insertText(self.model_hjd.item(row, column))
                cursor.movePosition(QtGui.QTextCursor.NextCell)
            document.print_(printer)

Is there any idea or a hit to fix this?

I find a way to make it work, but it need more correction

def handlePaintRequest(self, printer):
        database = QSqlDatabase("QPSQL")
        database.setHostName("localhost")
        database.setDatabaseName("database)
        database.setUserName("user")
        database.setPassword("password")
        database.open()
        
        model_hjd = QSqlTableModel(db=database)
        model_hjd.setTable('transactions')
        
        model_hjd.setHeaderData(0, Qt.Horizontal,"id")
        model_hjd.setHeaderData(1, Qt.Horizontal,"montant")
        model_hjd.setHeaderData(2, Qt.Horizontal,"medecin")
        model_hjd.setHeaderData(3, Qt.Horizontal,"patient")
        model_hjd.setHeaderData(4, Qt.Horizontal,"acte")
        model_hjd.setHeaderData(5, Qt.Horizontal,"date")
        model_hjd.setHeaderData(6, Qt.Horizontal,"temps")

        model_hjd.setEditStrategy(QSqlTableModel.OnManualSubmit)
        
        model_hjd.removeColumns(7,1)
        #model_hjd.removeColumn(5)
        date = str(self.dateEdit_10.text())
        date_2 = str(self.dateEdit_14.text())

        self.tableView_22.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
        model_hjd.setSort(6, Qt.DescendingOrder)
        self.tableView_22.setModel(model_hjd)
        model_hjd.select()
        filter_ft = "date_d BETWEEN '%s' AND '%s'" % (date, date_2)
        model_hjd.setFilter(filter_ft)

        self.model = QtGui.QStandardItemModel(self)

        item = QtGui.QStandardItem()
        self.model.appendRow(item)
        self.model.setData(self.model.index(0, 5), "", 0)
        self.tableView_22.resizeColumnsToContents()

        self.tableView_22.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)

        # Selection of columns
        self.selectionModel = self.tableView_22.selectionModel()

        self.tableView_22.setModel(model_hjd)

        document = QTextDocument()
        cursor = QTextCursor(document)
        tableFormat = QTextTableFormat()
        tableFormat.setBorder(0.2)
        tableFormat.setBorderStyle(3)
        tableFormat.setCellSpacing(0);
        tableFormat.setTopMargin(0);
        tableFormat.setCellPadding(4)
        table = cursor.insertTable(model_hjd.rowCount() + 1, model_hjd.columnCount(), tableFormat)
        ### get headers
        myheaders = []
        for i in range(0, model_hjd.columnCount()):
            myheader = model_hjd.headerData(i, Qt.Horizontal)
            cursor.insertText(myheader)
            cursor.movePosition(QTextCursor.NextCell)

        for row in range(0, model_hjd.rowCount()):
           for col in range(0, model_hjd.columnCount()):
               index = model_hjd.index( row, col )
               cursor.insertText(str(index.data()))
               cursor.movePosition(QTextCursor.NextCell)
        document.print_(printer)

the result

表视图

在此处输入图片说明

###########################################

Is there a way to fix the date and time format? and add line in to the table

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM