在 Firefox 中,如果我下载文件,则会有一个文件夹图标“在文件夹中显示”:
...单击后,将打开下载目录中的本机操作系统文件资源管理器,并选择目标下载文件:
我想要相同类型的功能 - 除了我希望它在 PyQt5 应用程序中,当打开 QFileDialog 时,在选择目标文件时激活的右键单击上下文菜单中选择一个操作;例如使用 PyQt5 示例(如下),我可以得到这个 Qt5 对话框:
...因此,当我右键单击目标文件(如图所示test.txt
)时,我希望在上下文菜单中添加“在文件夹中显示”操作,当选择该操作时,我希望在包含目标文件的目录中打开本机文件资源管理器,并选择目标文件 - 就像 Firefox 所做的那样。
我如何在 PyQt5 中做到这一点?
示例代码:
# started from https://pythonspot.com/pyqt5-file-dialog/
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QInputDialog, QLineEdit, QFileDialog
from PyQt5.QtGui import QIcon
class App(QWidget):
def __init__(self):
super().__init__()
self.title = 'PyQt5 file dialogs - pythonspot.com'
self.left = 10
self.top = 10
self.width = 640
self.height = 480
self.initUI()
def initUI(self):
self.setWindowTitle(self.title)
self.setGeometry(self.left, self.top, self.width, self.height)
self.openFileNameDialog()
self.show()
def openFileNameDialog(self):
options = QFileDialog.Options()
options |= QFileDialog.DontUseNativeDialog
fileName, _ = QFileDialog.getOpenFileName(self,"QFileDialog.getOpenFileName()", "","Text Files (*.txt)", options=options)
if fileName:
print(fileName)
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = App()
sys.exit(app.exec_())
正如评论中所述,没有内置的 Qt 支持。在系统文件管理器中打开和选择文件非常棘手,并且没有完美的跨平台解决方案。但是,如果您不想开发自己的解决方案,有一个 Python show-in-file-manager 包
QFileDialog
可以完成合理的工作。然后剩下的就是子类化和重新实现上下文菜单处理。(注意:这意味着将不再可能使用像这样的静态函数getOpenFileName
,它们使用的内部 Qt 实例QFileDialog
- 当然,除非您选择也重新实现这些函数)。这是一个基本的演示(仅在 Linux 上测试):
好吧,感谢 @ekhumoro 和 @musicamante 的评论,我终于找到了一个可行的解决方案,其中包含类和用法示例 - 但天哪,这真是太难了:
show_in_file_manager
,但是由于我在 Windows 10 等上使用 MINGW64 Python3,os.path.normpath
所有路径都会转换为正斜杠(即使你手动提供带有反斜杠的 Windows 路径),这会中断show_in_file_manager
- 幸运的是,这里有一个解决方法:提供路径as_uri()
,并allow_conversion=False
在show_in_file_manager
因此,下面的示例在我的计算机上如下所示:
以下是代码: