添加SQL新条目后如何刷新QTableView,无需重启应用?
无需重启刷新QSqlRelationalTableModel与QTableView的方法
核心思路
QSqlRelationalTableModel本身支持动态刷新,无需重建模型或重启应用。只需在数据库数据变更后调用模型的select()方法,绑定的QTableView会自动同步最新数据。
具体实现步骤
1. 分离模型初始化与刷新逻辑
将模型的创建逻辑与数据刷新逻辑拆分,模型仅初始化一次,后续仅更新数据,避免重复创建资源:
class MitarbeiterWindow(QMainWindow, Ui_MitarbeiterWindow): def __init__(self): super().__init__() self.setupUi(self) # 菜单与按钮信号连接 self.actionLogout.triggered.connect(self.Logout) self.actionClose.triggered.connect(self.beendenfunktion) self.actionMitarbeiter.triggered.connect(self.mitarbeiteroeffnen) self.actionAirline.triggered.connect(self.airlinesoeffnen) self.actionAbteilungen.triggered.connect(self.abteilungenoeffnen) self.actionInfo.triggered.connect(self.hilfeanzeigen) self.btn_add.clicked.connect(self.mitarbeiterhinzufuegen) db.open() # 初始化模型(仅执行一次) self.init_table_model() # 首次加载数据 self.refresh_table_data() def init_table_model(self): self.mod_mitarbeiter = QtSql.QSqlRelationalTableModel() self.mod_mitarbeiter.setTable("mitarbeiter") self.mod_mitarbeiter.setRelation(2, QtSql.QSqlRelation("abteilungen", "Abteilungsid", "Abteilung")) self.tbl_mitarbeiter.setItemDelegate(QtSql.QSqlRelationalDelegate()) self.tbl_mitarbeiter.setModel(self.mod_mitarbeiter) def refresh_table_data(self): # 重新查询数据库,模型更新后视图自动同步 self.mod_mitarbeiter.select()
2. 在添加数据后触发刷新
根据添加窗口的打开方式,选择对应的刷新时机:
情况1:模态窗口打开添加界面
如果mitarbeiteraddwindow是模态窗口(通过exec_()打开),可在窗口关闭后直接调用刷新:
def mitarbeiterhinzufuegen(self): print("-----/////Mitarbeiter hinzufügen-----") # 模态打开窗口,关闭后立即刷新表格 mitarbeiteraddwindow.exec_() self.refresh_table_data()
情况2:非模态窗口打开添加界面
如果是非模态窗口,通过连接窗口的关闭信号触发刷新:
def mitarbeiterhinzufuegen(self): print("-----/////Mitarbeiter hinzufügen-----") # 绑定添加窗口关闭信号到刷新方法 mitarbeiteraddwindow.closeEvent = lambda event: self.on_add_window_closed(event) mitarbeiteraddwindow.show() self.hide() # 隐藏当前窗口而非关闭,保留对象状态 def on_add_window_closed(self, event): # 添加窗口关闭后,刷新表格并重新显示当前窗口 self.refresh_table_data() self.show() event.accept()
3. 优化Logout方法(可选)
原代码直接操作全局窗口对象不够规范,建议改为操作自身实例:
def Logout(self): print("-----Es wird ausgeloggt-----") self.close() mainwindow.close() loginwindow.show()
原理说明
QSqlRelationalTableModel.select()会重新执行SELECT查询,从数据库拉取最新数据。- 模型数据更新后,会自动向绑定的QTableView发送数据变更信号,视图接收到信号后会自动刷新显示,无需手动操作视图。
内容的提问来源于stack exchange,提问作者Manuel Jellitsch
相关产品推荐
相关产品推荐

