与 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())
我正在从 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())