python - 单击文件名时 PyQt5 QFileDialog 关闭
问题描述
我正在使用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 存在问题,并且在其他窗口管理器下运行的代码可能会正常工作。
仍然不是一个真正的解决方案,但我现在比以前更了解情况。
第二次编辑:我发现如果我将工作区行为 -> 常规行为 -> 单击行为从单击更改为双击,我的 QFileDialog 问题就会消失。但是,如何解决这个问题将是一个不同的话题。
第三次编辑:在示例代码中添加了“QFileDialog.DontUseNativeDialog”选项。
解决方案
似乎 Qt 试图尊重操作系统在其文件管理器中打开文件和文件夹的方式,即使在使用本机对话框时也是如此。这取决于SH_ItemView_ActivateItemOnSingleClick
样式提示,绕过它的唯一方法是应用代理样式。
虽然您可以将样式应用于 QFileDialog 的视图__init__
(只要您使用本机对话框),但您使用的是静态方法,因此您只能通过将样式设置为整个 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_()
推荐阅读
- c++ - 编译 llvm 3.1 时,为什么会出现错误:“>”标记之前的预期主表达式
- node.js - 如何在渲染器进程中的托盘上下文菜单上附加项目?
- vim - 重映射问题。如何将 CtrlP 映射到“ff”
- python - 电子 rpc 调用以创建新钱包
- netsuite - 用户事件脚本不会在记录子列表修改时触发
- javascript - videojs“控制栏”是否应该调整为视频或容器的宽度?
- google-sheets - 试图解析单元格中的多个值,数据类型字符串并返回最大值
- javascript - NuxtJS 错误的 css 加载顺序
- r - 当 DF 在 R 中有 2 个相似的列名时选择 1 列
- plotly - Plotly Dash - 如何处理庞大的国家?