PyTest-qt无法自动处理QFileDialog,需手动点击取消按钮求助
问题原因及解决方案
核心问题
你在change_folder里实例化的self.dialog,和getExistingDirectory弹出的对话框不是同一个对象。getExistingDirectory是QFileDialog的静态方法,调用时会自动创建一个全新的模态对话框,完全独立于你提前创建的self.dialog。所以测试代码里通过main_window.dialog获取的对象,根本不是实际显示的那个对话框,自然无法触发取消操作。
解决方案
有两种可行的修复方式,选一种即可:
方式一:修改业务代码(推荐)
放弃静态方法,改用QFileDialog实例的方式显示对话框,这样能确保self.dialog就是实际弹出的窗口:
from PySide6.QtWidgets import QFileDialog def change_folder(self, side: int): self.dialog = QFileDialog(self, caption="Select a folder") self.dialog.setFileMode(QFileDialog.Directory) self.dialog.setOption(QFileDialog.ShowDirsOnly) # 只显示目录,和getExistingDirectory行为一致 if self.dialog.exec(): # 用户选择了目录,获取路径 new_folder_name = self.dialog.selectedFiles()[0] # 你的后续处理逻辑 else: # 用户取消了对话框,这里可以加取消后的逻辑(如果需要) pass
修改后,原来的测试代码就能正常工作,因为main_window.dialog现在就是实际弹出的对话框了。
方式二:修改测试代码(不改动业务逻辑)
如果不想修改业务代码,就在测试里通过遍历应用顶级窗口的方式,找到实际弹出的QFileDialog:
from PySide6.QtWidgets import QApplication, QFileDialog def test_change_folder(main_window, qtbot): # 点击按钮触发对话框 qtbot.mouseClick(main_window.change_folder_left_button, Qt.LeftButton) # 等待对话框出现并获取它 dialog = qtbot.waitForWindowShown(QFileDialog) # 模拟取消操作 qtbot.addWidget(dialog) dialog.reject() # 断言对话框已关闭 assert not dialog.isVisible() # 这里添加其他断言,验证程序状态未发生变化
这种方式用qtbot.waitForWindowShown替代定时器,能更可靠地等待对话框加载完成,避免定时器延迟设置不合理的问题。
内容的提问来源于stack exchange,提问作者larrycaverga
相关产品推荐
相关产品推荐

