单击文件名时 PyQt5 QFileDialog 关闭

PyQt5 QFileDialog closes when filename clicked

我正在使用 PyQt5 QFileDialog.getOpenFileName。在单击“打开”按钮之前,我希望该框保持打开状态。但是,当我 运行 我的 Linux 系统上的代码时,单击文件名时对话框立即关闭。在 Windows 系统上,该框按预期运行并保持打开状态,直到单击 'Open' 按钮。无论是否设置 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 存在问题,并且其他 window 管理器下的代码 运行 可能会正常工作。

仍然不是真正的解决方案,但我现在比以前更了解情况了。

第二次编辑: 我发现如果我将工作区行为 -> 一般行为 -> 单击行为从单击更改为双击,我的 QFileDialog 问题就会消失。不过如何解决这个问题是另一个话题。

第三次编辑: 向示例代码添加了 'QFileDialog.DontUseNativeDialog' 选项。

Qt 似乎试图尊重 OS 在其文件管理器中打开文件和文件夹的方式,即使在使用本机对话框时也是如此。这取决于 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_()