与 QSqlQueryModel 一起使用时如何更新 QListView?

how to update QListView when using it with QSqlQueryModel?

我正在从 QSqlQuery 模型实例化 QListView,但是当添加新项目时,它会将其添加到数据库但不会将其添加到视图,这是我的代码

class MainWindow(QMainWindow):
    def __init__(self, *args, **kwargs):
        super(MainWindow, self).__init__(*args, **kwargs)
        self.setGeometry(900,180,800,600)
        self.setWindowTitle("Media Display")
        self.setWindowIcon(QIcon('favicon.png'))
        self.model = QSqlQueryModel()
        self.model.setQuery("SELECT path FROM fichiers")
        
        self.listview = QListView()
        self.listview.setModel(self.model)
        self.listview.setModelColumn(1)



    def addImage(self):
        fichier_base, _ = QFileDialog.getOpenFileName(self, 'select video', QDir.homePath(),"Images (*.png *.xpm *.jpg *.jpeg)")


            query = QSqlQuery()
            query.exec(
                f"""INSERT INTO fichiers (path) VALUES ('{fichier_base}')"""
            )
            print('paaath', fichier_base)
            self.model.layoutChanged.emit()

        

首先,不要使用 f-string 创建查询,因为您的代码容易受到 SQL 注入的影响,而是使用占位符。另一方面,QSqlQueryModel是一个读取模型,在你建立查询时会被重置,所以一个可能的解决方案是重新建立查询:

def addImage(self):
    fichier_base, _ = QFileDialog.getOpenFileName(
        self, "select video", QDir.homePath(), "Images (*.png *.xpm *.jpg *.jpeg)"
    )
    if not fichier_base:
        return
    query = QSqlQuery()
    query.prepare("""INSERT INTO fichiers (path) VALUES (?)""")
    query.addBindValue(fichier_base)
    if query.exec_():
        last_query = self.model.query().executedQuery()
        self.model.setQuery("")
        self.model.setQuery(last_query)
    else:
        print(query.lastError().text())