单击文件名时 PyQt5 QFileDialog 关闭
Posted
技术标签:
【中文标题】单击文件名时 PyQt5 QFileDialog 关闭【英文标题】:PyQt5 QFileDialog closes when filename clicked 【发布时间】:2020-07-30 16:48:03 【问题描述】:我正在使用PyQt5 QFileDialog.getOpenFileName
。我希望该框保持打开状态,直到单击“打开”按钮。但是,当我在我的 Linux 系统上运行代码时,单击文件名时对话框会立即关闭。在 Windows 系统上,该框按预期运行并保持打开状态,直到单击“打开”按钮。无论是否设置QFileDialog.DontUseNativeDialog
选项集,结果都相同。
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QFileDialog
import sys
class Main(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("QFileDialog Test")
button = QPushButton("Click to open file")
button.setCheckable(True)
button.clicked.connect(self.open_file)
# Set the central widget of the Window.
self.setCentralWidget(button)
def open_file(self):
options = QFileDialog.Options()
options |= QFileDialog.DontUseNativeDialog
file_name, _ = QFileDialog.getOpenFileName(None, "Open File",
"", "Python Files (*.py);;Text Files (*.txt)",options=options)
app = QApplication(sys.argv)
window = Main()
window.show()
app.exec_()
编辑: 我退出了 KDE 并开始了一个 Openbox 会话,然后运行了上面的代码。 QFileDialog 的行为与我预期的一样,并等待我单击“打开”按钮。这验证了 KDE / KWin 存在问题,并且在其他窗口管理器下运行的代码可能会正常工作。
仍然不是一个真正的解决方案,但我现在比以前更了解情况。
第二次编辑: 我发现如果我将 Workspace Behavior -> General Behavior -> Click Behavior 从 Single click 更改为 Double click,我的 QFileDialog 问题就会消失。但是如何解决这个问题将是一个不同的话题。
第三次编辑: 在示例代码中添加了“QFileDialog.DontUseNativeDialog”选项。
【问题讨论】:
您的代码在 artix linux、python 3.8.5、pyqt 5.15 上按预期运行 你的窗口管理器是什么:gnome、kde 等? 这个系统是 Fedora 32 上的 KDE Plasma,带有 Python 3.8.5 和 pyqt 5.15。令人鼓舞的是,它在不同的 linux 系统上运行良好。我仍然不知道为什么它在我的系统上表现得这样以及如何处理它。但至少我现在知道范围有点窄了。 我在 i3、openbox、xfce、gnome-wayland 上尝试成功 @a_manthey_67 - 感谢您的信息。看起来它在任何地方都可以工作,但 KDE 除外。 【参考方案1】:Qt 似乎试图尊重操作系统在其文件管理器中打开文件和文件夹的方式,即使在使用本机对话框时也是如此。这取决于SH_ItemView_ActivateItemOnSingleClick
style hint,绕过它的唯一方法是应用代理样式。
虽然您可以在其__init__
中将样式应用于 QFileDialog 的视图(只要您使用本机对话框),但您使用的是静态方法,因此您只能通过将样式设置为整个 QApplication。
请注意,与样式表、调色板和字体不同,样式不会传播到子小部件,并且它们始终使用 QApplication 样式(或为它们手动设置的样式)。
class SingleClickWorkaroundProxy(QProxyStyle):
def styleHint(self, hint, option, widget, data):
if hint == self.SH_ItemView_ActivateItemOnSingleClick:
return False
return super().styleHint(hint, option, widget, data)
# ...
app = QApplication(sys.argv)
app.setStyle(SingleClickWorkaroundProxy())
window = Main()
window.show()
app.exec_()
【讨论】:
你好@musicamante。您的建议非常有效,非常感谢。我永远不会解决这个问题。以上是关于单击文件名时 PyQt5 QFileDialog 关闭的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 QFileDialog 打开带有 .mid 后缀的文件
PyQt4 和 PyQt5 中的 QFileDialog 字符串有区别吗?