单击文件名时 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_()
我正在使用 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_()