首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用pyqt QFileDialog将图像上传到sqllite数据库?

如何使用pyqt QFileDialog将图像上传到sqllite数据库?
EN

Stack Overflow用户
提问于 2018-05-02 11:33:04
回答 1查看 1.2K关注 0票数 1

我正在用sqlite3数据库做图像查看器pyqt应用程序。但我不能上传图片到数据库。我该怎么做?

代码语言:javascript
复制
def open(ui):
    fname = QFileDialog.getOpenFileName(ui, 'Open file','c:\\',"Image files (*.jpg *.gif)")
    ui.FirmEditLogoEntry.setText(fname)

我能得到文件名。但不能转换成二进制。

请帮我做这个。谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-02 17:17:42

对于QFileDialog,您只能获得文件的名称,您必须使用该信息来读取文件的字节,使用QFile并将数据保存在BLOB中。

代码语言:javascript
复制
import sys

from PyQt4.QtGui import *
from PyQt4.QtSql import *
from PyQt4.QtCore import *

def createConnection():
    db = QSqlDatabase.addDatabase('QSQLITE')
    db.setDatabaseName(':memory:')
    if not db.open():
        QMessageBox.critical(None, "Cannot open database",
                "Unable to establish a database connection.\n"
                "This example needs SQLite support. Please read the Qt SQL "
                "driver documentation for information how to build it.\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 Widget(QWidget):
    def __init__(self, *args, **kwargs):
        QWidget.__init__(self, *args, **kwargs)
        vbox = QVBoxLayout(self)

        self.load_btn = QPushButton("Select Image")
        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.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 = Widget()
    w.show()
    sys.exit(app.exec_())
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50133693

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档