PyQt5中QFileDialog.getExistingDirectory函数弹窗异常求助
解决QFileDialog.getExistingDirectory重复弹出对话框的问题
问题诊断
你遇到的重复弹出对话框问题,核心原因是信号槽重复绑定:
PyQt自带自动信号槽连接机制,当槽函数命名为on_<控件对象名>_<信号名>(比如你的on_workDirButton_clicked)时,调用setupUi时Qt会自动将按钮的clicked信号绑定到该槽函数。而你又手动执行了self.workDirButton.clicked.connect(self.on_workDirButton_clicked),导致同一个信号被多次绑定,每次点击按钮都会触发多次槽函数调用,每次调用都会弹出一个目录选择对话框。
解决方案
提供两种可行的修复方式:
方式一:移除手动信号连接
保留on_workDirButton_clicked的命名,依靠PyQt的自动连接机制,删掉手动绑定的代码:
import sys import os from PyQt5 import QtWidgets import mdat2cm_QtD # file created using QtDessing and pyuic5 filename.ui -o filename.py def setCurrentDirectory(self) : self.workDirLabel.setText(self.directory) return class MyApp(QtWidgets.QMainWindow, mdat2cm_QtD.Ui_MainWindow): def __init__(self): super().__init__() self.setupUi(self) # Add your custom code here try: self.previousPath= open(os.path.expanduser('~')+"\\.mdat2cm_last").readlines() self.directory=self.previousPath[0] setCurrentDirectory(self) except: self.previousPath=[""] # 移除手动连接代码,依赖PyQt自动连接 # self.workDirButton.clicked.connect(self.on_workDirButton_clicked) def on_workDirButton_clicked(self): self.directory= QtWidgets.QFileDialog.getExistingDirectory(self,'Select Working Directory',self.previousPath[0]) try: with open(os.path.expanduser('~')+"\\.mdat2cm_last","w") as fff: fff.write(self.directory) except: pass # 替换无意义的a=0,更符合Python惯用写法 return
方式二:修改槽函数名称
修改槽函数名避免触发自动连接,保留手动绑定逻辑:
import sys import os from PyQt5 import QtWidgets import mdat2cm_QtD # file created using QtDessing and pyuic5 filename.ui -o filename.py def setCurrentDirectory(self) : self.workDirLabel.setText(self.directory) return class MyApp(QtWidgets.QMainWindow, mdat2cm_QtD.Ui_MainWindow): def __init__(self): super().__init__() self.setupUi(self) # Add your custom code here try: self.previousPath= open(os.path.expanduser('~')+"\\.mdat2cm_last").readlines() self.directory=self.previousPath[0] setCurrentDirectory(self) except: self.previousPath=[""] # 修改槽函数名后手动连接 self.workDirButton.clicked.connect(self.select_work_directory) def select_work_directory(self): self.directory= QtWidgets.QFileDialog.getExistingDirectory(self,'Select Working Directory',self.previousPath[0]) try: with open(os.path.expanduser('~')+"\\.mdat2cm_last","w") as fff: fff.write(self.directory) except: pass return
内容的提问来源于stack exchange,提问作者Carlos
相关产品推荐
相关产品推荐

