No Firefox, se eu baixar um arquivo, há um ícone de pasta "Mostrar na pasta":
... que, quando clicado, abre o explorador de arquivos nativo do sistema operacional no diretório Downloads, com o arquivo de download de destino selecionado:
Eu gostaria do mesmo tipo de funcionalidade - exceto que eu quero isso em um aplicativo PyQt5, quando o QFileDialog é aberto, ao escolher uma ação no menu de contexto do botão direito ativado quando o arquivo de destino é selecionado; por exemplo, com o exemplo do PyQt5 (abaixo), posso obter esta caixa de diálogo do Qt5:
... então, quando clico com o botão direito em um arquivo de destino (como test.txt
na imagem), gostaria que uma ação "Mostrar na pasta" fosse adicionada ao menu de contexto e, quando ela fosse escolhida, gostaria que o explorador de arquivos nativo fosse aberto no diretório que contém o arquivo de destino e o arquivo de destino selecionado, como o Firefox faz.
Como posso fazer isso no PyQt5?
Código de exemplo:
# 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_())
Conforme observado nos comentários, não há suporte Qt integrado para isso. Abrir e selecionar um arquivo no gerenciador de arquivos do sistema é bem complicado e não há soluções multiplataforma perfeitas. No entanto, há um pacote Python show-in-file-manager que faz um trabalho razoável se você não quiser desenvolver sua própria solução. Resta então subclassificar
QFileDialog
e reimplementar o tratamento do menu de contexto. (NB: isso significa que não será mais possível usar funções estáticas comogetOpenFileName
, que usam uma instância interna do Qt deQFileDialog
- a menos, é claro, que você escolha reimplementar essas funções também).Aqui está uma demonstração básica (testada apenas no Linux):
Bem, graças aos comentários de @ekhumoro e @musicamante, finalmente cheguei a uma solução funcional, com classe e exemplo de uso - mas cara, isso foi incrível:
show_in_file_manager
, porém como uso MINGW64 Python3 no Windows 10,os.path.normpath
etc. todos convertem caminhos para barras (mesmo se você fornecer manualmente um caminho do Windows com barras invertidas) o que quebrashow_in_file_manager
- felizmente, há uma solução alternativa aqui: forneça pathas_uri()
e useallow_conversion=False
emshow_in_file_manager
Então, aqui está como o exemplo abaixo se parece na minha máquina:
Aqui está o código: