Как вывести изображение из sqlite3 в формате blob в QLabel?

В общем пытаюсь вывести изображение из таблицы -

Табл 1

Под 3 id следующим образом -

    sqlite_blob_query = """SELECT photo FROM Album WHERE id = 3"""
    cursor.execute(sqlite_blob_query)
    record4 = cursor.fetchall()

    self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_4), _translate(str(record4)))

    cursor.close()
    sqlite_connection.close()

И выдаёт ошибку:

self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_4), _translate(str(record4)))
TypeError: translate(str, str, disambiguation: str = None, n: int = -1): not enough arguments

Что не так ?)


Ответы (1 шт):

Автор решения: S. Nick

Я уже как-то вам писал, но попробую еще раз дать вам некоторые советы.

Чтобы получать быстрые и правильные ответы - предоставляйте, пожалуйста, минимально-воспроизводимый пример, который можно скопировать, запустить и получить то о чем вы пишите.

По сути. Ошибка в строке

self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_4), _translate(str(record4)))

TypeError: translate(str, str, disambiguation: str = None, n: int = -1):
недостаточно аргументов

т.к. вы написали : _translate(str(record4))
тогда как ожидается: _translate(str, str)

я вообще не понимаю, зачем вы используете _translate() ? Вы можете написать строку, которая выдает ошибку так:

self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_4), str(record4))

т.к. согласно документации:

void QTabWidget::setTabText(int index, const QString &label)

Определяет новую метку для страницы на вкладке индекса позиции.

И это совсем не то, что вы спрашиваете в заголовке вопроса: "Как вывести изображение из sqlite3 в формате blob в QLabel?"

Вы пробовали посмотреть содержимое record4 ? Поставьте print(record4) после строки record4 = cursor.fetchall() и посмотрите.

Одно из возможных решений, того о чем вы спрашиваете, выглядит как показано в примере ниже.

Скопируйте пример и запуститн его.
Далее понажимайте кнопку "Выбрать изображение и загрузить в БД" - загрузите в БД несколько изображений.
Далее выберите в combo , то изображение, которое вы хотите поместить в label.

import sys
from PyQt5.QtWidgets import QMessageBox, QWidget, QApplication, \
    QVBoxLayout, QPushButton, QComboBox, QLabel, QFileDialog
from PyQt5.QtCore import QDir, QFile, QFileInfo, QIODevice
from PyQt5.QtGui import QPixmap
from PyQt5.QtSql import QSqlDatabase, QSqlQuery, QSqlTableModel


def createConnection():
    db = QSqlDatabase.addDatabase('QSQLITE')
    db.setDatabaseName("testImage.db")
    
    if not db.open():
        QMessageBox.critical(None, "Не удается открыть базу данных ",
                "Не удалось установить соединение с базой данных.\n"
                "Этот пример требует поддержки SQLite. Пожалуйста, прочитайте Qt SQL "
                "документацию для получения информации о том, как ее построить.\n\n"
                "Click Cancel to exit.",
                QMessageBox.Cancel)
        return False

    query = QSqlQuery()
    return query.exec_('''CREATE TABLE IF NOT EXISTS imgTable
        (id INTEGER primary key AUTOINCREMENT, filename TEXT, imagedata BLOB)''')


class Demo(QWidget):
    def __init__(self):
        super().__init__()

        self.load_btn = QPushButton("Выбрать изображение и загрузить в БД")
        self.combo = QComboBox()
        self.label = QLabel()
        
        self.model = QSqlTableModel()
        self.model.setTable("imgTable")
        self.model.select() 
        
        self.combo.setModel(self.model)
        self.combo.setModelColumn(1)
        
        vbox = QVBoxLayout(self)
        vbox.addWidget(self.load_btn)
        vbox.addWidget(self.combo)
        vbox.addWidget(self.label)

        self.load_btn.clicked.connect(self.load_image)
        self.combo.currentIndexChanged.connect(self.on_change_select)

    def on_change_select(self, row):
        ix  = self.combo.model().index(row, 2)
        pix = QPixmap()
        pix.loadFromData(ix.data())
        self.label.setPixmap(pix)

    def load_image(self):
        fname, _ = QFileDialog.getOpenFileName(
            self, 
            'Open file', 
            QDir.currentPath(), 
            "Image files (*.jpg, *.gif, *.png)"
        )
        if fname:
            self.saveImage(fname)

    def saveImage(self, filename):
        file = QFile(filename)
        if not file.open(QIODevice.ReadOnly):
            return

        ba = file.readAll()
        name = QFileInfo(filename).fileName()
        
        record = self.model.record()
        record.setValue("filename", name)
        record.setValue("imagedata", ba)

        if self.model.insertRecord(-1, record):
            self.model.select()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    if not createConnection():
        sys.exit(-1)
    w = Demo()
    w.show()
    sys.exit(app.exec_())

введите сюда описание изображения

→ Ссылка