You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

添加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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 00:05:32