【问题标题】:How can I print data from my database while in QTableWidget?如何在 QTableWidget 中打印数据库中的数据?
【发布时间】:2014-04-15 04:15:46
【问题描述】:

如何将我的数据库 (sqlite) 中的数据从我的 GUI 中的表格打印到记事本/word 文档中(使用相同的格式)。这是我的 gui 上表示的表格的代码。

class Table(QtGui.QDialog):
    def __init__(self):
        super(Table, self).__init__()
        with sqlite3.connect('database.db') as db:
            cursor=db.cursor()
            cursor.execute('select* from Receipt Order BY ReceiptID ASC')
            title = [cn[0] for cn in cursor.description]
            rows = [cn[0] for cn in cursor.description]
            cur=cursor.fetchall()
            layout = QtGui.QGridLayout() 
            self.table = QtGui.QTableWidget()
            self.setGeometry(500,500,500,400)
            qr = self.frameGeometry()
            cp = QtGui.QDesktopWidget().availableGeometry().center()
            qr.moveCenter(cp)
            self.move(qr.topLeft())
            self.label2=QtGui.QLabel(self)
            self.label2.setPixmap(QtGui.QPixmap('receipt_pic.jpg'))
            self.label2.setGeometry(0,0,500,400)
            self.table.setColumnCount(2)
            self.table.setHorizontalHeaderLabels(title)
            for i,row in enumerate(cur):
                self.table.insertRow(self.table.rowCount())
                for j,val in enumerate(row):
                    self.table.setItem(i, j, QtGui.QTableWidgetItem(str(val)))
            layout.addWidget(self.table, 0, 0)
            self.setLayout(layout)
            self.setWindowTitle('Receipt Table')

我希望能够单击一个按钮,该按钮将此信息(将显示为带有填充的列和行的表格)复制到单独的记事本文件/或任何文本文档中(我可以将表格发送到打印机被打印)。

【问题讨论】:

    标签: python sqlite user-interface pyqt4 qtablewidget


    【解决方案1】:

    直接打印表格可能比使用中间文件更容易。

    为此,您可以使用QTextDocument 创建表格的可打印表示,然后使用内置的打印对话框完成其余工作。

    所以,首先添加一些按钮:

        ...
        layout.addWidget(self.table, 0, 0, 1, 2)
        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.addWidget(self.buttonPrint, 1, 0)
        layout.addWidget(self.buttonPreview, 1, 1)
        self.setLayout(layout)
        ...
    

    然后是打印和打印预览对话框的一些处理程序:

    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 = self.makeTableDocument()
        document.print_(printer)
    
    def makeTableDocument(self):
        document = QtGui.QTextDocument()
        cursor = QtGui.QTextCursor(document)
        rows = self.table.rowCount()
        columns = self.table.columnCount()
        table = cursor.insertTable(rows + 1, columns)
        format = table.format()
        format.setHeaderRowCount(1)
        table.setFormat(format)
        format = cursor.blockCharFormat()
        format.setFontWeight(QtGui.QFont.Bold)
        for column in range(columns):
            cursor.setCharFormat(format)
            cursor.insertText(
                self.table.horizontalHeaderItem(column).text())
            cursor.movePosition(QtGui.QTextCursor.NextCell)
        for row in range(rows):
            for column in range(columns):
                cursor.insertText(
                    self.table.item(row, column).text())
                cursor.movePosition(QtGui.QTextCursor.NextCell)
        return document
    

    如果您喜欢保存到文件,可以使用QTextDocument.toHtml 将表格转储为 html。

    打印出来的结果很基本,但如果你想要更花哨的东西,你可以随时使用 html/css 构建文档。

    【讨论】:

    • 感谢这出色的作品!如何让我的列显示在数据行的顶部?
    • @Jurisdiction。我更新了示例,在文档每一页的顶部添加了一个粗体标题。
    【解决方案2】:

    我用这个功能

        def LoadDatabase(self):
            self.banco = sqlite3.connect ( 'Vendas.db' )
            self.cursor = banco.cursor ( )
            query = "SELECT * FROM Produtos"
            result = self.banco.execute ( query )
            self.listaprodutos.setRowCount ( 0 )
            for row_number, row_data in enumerate ( result ):
                self.listaprodutos.insertRow ( row_number )
                for colum_number, data in enumerate ( row_data ):
                    self.listaprodutos.setItem ( row_number, colum_number, QtWidgets.QTableWidgetItem ( str ( data ) ) )
    

    【讨论】:

      猜你喜欢
      • 2017-12-13
      • 1970-01-01
      • 2019-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-27
      • 1970-01-01
      相关资源
      最近更新 更多