从MySQL获取图像到PyQt5中的tableWidget中

问题描述

我已经能够从数据库获取数据并填充到tableWidget中,但是没有显示image列。我尝试了在网上找到的代码,但仍然没有用。数据库中的image列具有BLOB数据类型。请协助纠正我的以下代码。或者您可能要建议并推荐tableWidget以外的其他方法

 def getPersData(self):
    con = MysqLdb.connect(host="localhost",user="root",password="",database="db")
    with con:
        cur = con.cursor()
        query = cur.execute("SELECT * FROM persons")

        rows = cur.fetchall()

    for row_number,row_data in enumerate(rows):
        self.ui.tableWidget.insertRow(row_number)
        for column_number,column_data in enumerate(row_data):
            if column_number == 1:
                item = self.getImg(column_data)
                self.ui.tableWidget.setCellWidget(row_number,column_number,item)
            else:
                self.ui.tableWidget.setItem(row_number,QTableWidgetItem(str(column_data)))
    self.ui.tableWidget.verticalHeader().setDefaultSectionSize(100)
    self.ui.tableWidget.show()


def getImg(self,img):
    img_label = self.ui.label
    img_label.setText("")
    img_label.setScaledContents(True)
    pixmap = Qpixmap()
    pixmap.loadFromData(img,"PNG")
    img_label.setpixmap(pixmap)
    return img_label

解决方法

使用字节的逻辑(在my previous answer中,我建议使用base64,因此在这种情况下也要使用它)来构建QPixmap,该QPixmap可以转换为可以在QTableWidget中显示的QIcon:

for row_number,row_data in enumerate(rows):
    self.ui.tableWidget.insertRow(row_number)
    for column_number,column_data in enumerate(row_data):
        it = QTableWidgetItem()
        if column_number == 1:
            pixmap = QPixmap()
            pixmap.loadFromData(QByteArray.fromBase64(row_data))
            icon = QIcon(pixmap)
            it.setIcon(icon)
        else:
            it.setText(row_data)
        self.ui.tableWidget.setItem(row_number,column_number,it)