Как вывести изображение из sqlite3 в формате blob в QLabel?
В общем пытаюсь вывести изображение из таблицы -
Под 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 шт):
Я уже как-то вам писал, но попробую еще раз дать вам некоторые советы.
Чтобы получать быстрые и правильные ответы - предоставляйте, пожалуйста, минимально-воспроизводимый пример, который можно скопировать, запустить и получить то о чем вы пишите.
По сути. Ошибка в строке
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_())

