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

Qt开发:如何从子编辑对话框触发主对话框数据刷新?

问题需求

我有一个用于展示信息的主对话框(Main Dialog),其上设有编辑数据按钮。点击该按钮会弹出新的编辑对话框,可在其中编辑修改数据,点击OK按钮后将数据保存至存储数据的txt文件。我希望实现:优先采用点击编辑对话框OK按钮触发的通用方式,或在txt文件数据变更时,让主对话框的数据自动刷新。

主对话框代码

from .list_management import ListManagement
class MainDialog(QDialog): 

    def __init__(self, iface, parent=None, flags=Qt.WindowFlags()):
        QDialog.__init__(self, parent, flags)
        uic.loadUi(UI_PATH, self)
        self.ListManage_dialog_instance = ListManagement(self.iface)
        self.manage_button.clicked.connect(self.manage_tab)

    # 数据库管理标签页
    def manage_tab(self):
        self.ListManage_dialog_instance.execDialog()

管理对话框代码

class ListManagementDialog(QDialog):

    def __init__(self, iface, parent=None, flags=Qt.WindowFlags()):
        QDialog.__init__(self, parent, flags)
        uic.loadUi(UI_PATH, self)
        self.iface = iface
        ### 编辑相关逻辑 ###

    def ok_pressed(self):
        self.writedata()
        self.close()

class ListManagement(object):
    def execDialog(self):
        self.dialog = ListManagementDialog(self.iface, self.iface.mainWindow())
        self.dialog.show()
解决方案

方式一:点击OK按钮触发主对话框刷新(优先方案)

这种方式直接在编辑对话框的OK按钮点击事件中通知主对话框刷新数据,是最直接可靠的实现方式。

修改步骤:

  1. 在编辑对话框类中定义信号
    在ListManagementDialog里添加自定义信号,数据保存完成后发出该信号:

    from PyQt5.QtCore import pyqtSignal
    
    class ListManagementDialog(QDialog):
        # 定义数据更新完成的信号
        data_updated = pyqtSignal()
    
        def __init__(self, iface, parent=None, flags=Qt.WindowFlags()):
            QDialog.__init__(self, parent, flags)
            uic.loadUi(UI_PATH, self)
            self.iface = iface
            # 绑定OK按钮点击事件到ok_pressed(需确保UI中按钮对象名为ok_button)
            self.ok_button.clicked.connect(self.ok_pressed)
    
        def ok_pressed(self):
            self.writedata()
            # 数据保存后发出信号
            self.data_updated.emit()
            self.close()
    
  2. 主对话框连接信号实现刷新
    修改MainDialog的相关方法,连接信号到数据刷新函数:

    class MainDialog(QDialog): 
        def __init__(self, iface, parent=None, flags=Qt.WindowFlags()):
            QDialog.__init__(self, parent, flags)
            uic.loadUi(UI_PATH, self)
            self.ListManage_dialog_instance = ListManagement(self.iface)
            self.manage_button.clicked.connect(self.manage_tab)
            # 初始化加载数据到UI
            self.load_data_to_ui()
    
        # 读取txt数据并更新主对话框UI的方法
        def load_data_to_ui(self):
            with open("data.txt", "r", encoding="utf-8") as f:
                data = f.read()
                # 示例:假设主对话框用textBrowser展示数据
                self.textBrowser.setPlainText(data)
    
        # 数据库管理标签页
        def manage_tab(self):
            # 获取编辑对话框实例并连接信号
            dialog = self.ListManage_dialog_instance.execDialog()
            dialog.data_updated.connect(self.load_data_to_ui)
    
    # 修改ListManagement的execDialog方法,返回对话框实例
    class ListManagement(object):
        def execDialog(self):
            self.dialog = ListManagementDialog(self.iface, self.iface.mainWindow())
            self.dialog.show()
            return self.dialog
    

方式二:监听txt文件变更自动刷新

如果需要在文件被外部修改时也触发刷新,可使用QFileSystemWatcher监听文件变化:

修改步骤:

from PyQt5.QtCore import QFileSystemWatcher

class MainDialog(QDialog): 
    def __init__(self, iface, parent=None, flags=Qt.WindowFlags()):
        QDialog.__init__(self, parent, flags)
        uic.loadUi(UI_PATH, self)
        self.ListManage_dialog_instance = ListManagement(self.iface)
        self.manage_button.clicked.connect(self.manage_tab)
        
        # 初始化文件监听器
        self.data_file_path = "data.txt"
        self.file_watcher = QFileSystemWatcher([self.data_file_path])
        # 连接文件变化信号到刷新方法
        self.file_watcher.fileChanged.connect(self.on_file_changed)
        
        # 初始加载数据
        self.load_data_to_ui()

    def load_data_to_ui(self):
        try:
            with open(self.data_file_path, "r", encoding="utf-8") as f:
                data = f.read()
                self.textBrowser.setPlainText(data)
        except FileNotFoundError:
            self.textBrowser.setPlainText("数据文件不存在")

    def on_file_changed(self, path):
        # 文件变更时重新加载数据
        self.load_data_to_ui()

    def manage_tab(self):
        self.ListManage_dialog_instance.execDialog()

注意事项:

  • QFileSystemWatcher在文件被覆盖保存时可能触发两次信号,可添加延迟处理避免重复刷新;
  • 确保data_file_path为txt文件的正确绝对路径,避免路径问题导致监听失效。

内容的提问来源于stack exchange,提问作者Nidal Barada

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 02:03:22