PyQt 05 – Diálogo QFileDialog
- PyQt 01 – O Primeiro Programa
- PyQt 02 – Criando uma caixa de mensagem
- PyQt 03 – Diálogos com QMessageBox
- PyQt 04 – Diálogos com QInputDialog
- PyQt 05 – Diálogo QFileDialog
- PyQt 06 – Mais diálogos
- PyQt 07 – QLabel e Qt Designer
- PyQt 08 – QLineEdit e mais Qt Designer
- PyQt 09 – QPushButton, apertando os botões
- PyQt 10 – QCheckBox e QRadioButton: checando as opções
- PyQt 11 – QButtonGroup e QGroupBox: mais opções
- PyQt 12 – QComboBox
- PyQt 13 – QSpinBox, QProgressBar e + sinais
- PyQt 14 – QNetwork, baixando arquivos
Índice
A seção de diálogos rápidos ainda tem outras opções bem práticas. Neste texto vou apresentar os diálogos da classe QFileDialog. Esta classe possui funções estáticas que criam diálogos para salvar e abrir arquivos. Essencialmente, estes diálogos permitem criar diretórios, navegar pelo sistema e retornam um nome de arquivo ou nomes de vários arquivos, diretórios do sistema.
Para dar conta do trabalho, o QFileDialog possui quatro funções estáticas: getExistingDirectory, getOpenFileName, getOpenFileNames e getSaveFileName, que serão apresentadas neste texto.
1. Pegando nomes de arquivos
As funções estáticas para pegar nomes de arquivos são:
- getOpenFileName – abre um diálogo que retorna o nome de um arquivo selecionado pelo usuário;
- getOpenFileNames – abre um diálogo que permite ao usuário selecionar um ou mais arquivos.
Suas sintaxes são idênticas, a menos dos nomes das funções estáticas. Veja-as a seguir:
QFileDialog.getOpenFileName (parent, caption, dir,
filter, selectedFilter, options)
QFileDialog.getOpenFileNames (parent, caption, dir,
filter, selectedFilter, options)
onde:
- parent – é o diálogo pai;
- caption – o título do diálogo;
- dir – uma string com o diretório base
- filter – uma string com o filtro para os arquivos;
- selectedFilter – seleciona o filtro padrão;
- options – uma das opções apresentadas na tabela a seguir.
[TABLE=10]
Como não uso Mac OS X e nem Windows, não me atrevi a entender as duas últimas opções.
A string filter deve conter uma lista de filtros na sintaxe:
NomeDoFiltro1 (masc11 masc12 …);;NomeDoFiltro2 (masc21 masc22 …) …
Por exemplo, para adicionar filtros para arquivos texto, imagens e multimídia, seria uma string como:
"Text (*.txt *.asc);;Imagens (*.jpg *.jpeg *.gif *.png);;
Mult (*.wav *.ogg *.avi)"
Não deixe espaços entre o ponto e vírgula e o NomeDoFiltro. Fiz alguns testes tentando selecionar o filtro, com o parâmetro selectedFilter, mas nenhum deu resultado. Por isto se alguém descobrir como fazer esta seleção não deixe de compartilha a informação.
Neste diálogo, todos os argumentos são opcionais, e por isto basta o comando direto, como:
fileName = QFileDialog.getOpenFileName()
1.2. O QFileDialog em ação
A linha a seguir captura um nome de arquivo com a seleção de três tipos de filtro:
>>> from PyQt4.QtGui import *
>>> app = QApplication([])
>>> fileName = QFileDialog.getOpenFileName(None, 'Open file','.',
... 'Texto (*.txt);;Imagem (*.jpeg);;Audio (*.wav);;All (*)')
As linhas a seguir, capturam vários nomes de arquivos,
>>> fileNames = QFileDialog.getOpenFileNames(None, 'Open file', '.',
... 'All(*);;Imagem (*.jpeg);;Audio (*.wav)')
>>> for name in fileNames: print name
...
/home/rudson/temp/contrato_adesao_oivelox_res.pdf
/home/rudson/temp/essential-amd64-20071007.tar.bz2
/home/rudson/temp/ies4linux-2.99.0.tar.gz
No caso do uso da função estática getOpenFileNames, o retorno é uma QStringList. Embora seja uma lista, não é igual a lista padrão do Python, e um print, não retorna seus elementos.
>>> print fileNames
<pyqt4 .QtCore.QStringList object at 0x7fcc69c840d8>
No entanto, os elementos da lista podem ser acessados normalmente, como em uma lista Python,
>>> print fileNames[1]
/home/rudson/temp/essential-amd64-20071007.tar.bz2
Outra forma é transformar a QStringList em uma lista padrão do Python,
>>> List = list(fileNames)
>>> print List
[PyQt4.QtCore.QString(u'/home/rudson/temp/contrato_adesao_oivelox_res.pdf'),
PyQt4.QtCore.QString(u'/home/rudson/temp/essential-amd64-20071007.tar.bz2'),
PyQt4.QtCore.QString(u'/home/rudson/temp/ies4linux-2.99.0.tar.gz')]
No entanto, o manuseio de uma QStringList não deixa nada a desejar a uma List do Python.
2. Salvando um arquivo
O diálogo gerado pela função estática getSaveFileName, tem a mesmas sintaxe e funcionalidades dos diálogos anteriores, com uma única diferença, que o nome do arquivo selecionado, não tem que necessariamente ser de um arquivo existente.
>>> fileName = QFileDialog.getSaveFileName(None, 'Open file', '.',
... 'All(*);;Imagem (*.jpeg);;Audio (*.wav)')
>>> print fileName
/home/rudson/temp/teste.sav
3. Retornando um diretório existente
A última função estática, getExistingDirectory, retorna um diretório existente no sistema, selecionado pelo usuário. Sua sintaxe difere um pouco funções anteriores, pois não necessita dos argumentos de filtro.
QFileDialog.getExistingDirectory (parent, caption, dir, options)
A opção padrão deste diálogo é QFileDialog.ShowDirsOnly, para mostras apenas os diretórios, o que nas funções anteriores era apenas None. A linha a seguir criar um diálogo QFileDialog.ShowDirsOnly:
>>> dirName = QFileDialog.getExistingDirectory(None, 'Dir name', '/etc/')
>>> print dirName
/etc/cups
4. Customizando diálogo com QFileDialog
Todos os diálogos apresentados nestes três últimos textos que escrevi, ainda podem ser construídos por partes, editando os atributos e usando os métodos da classe. Geralmente não há esta necessidade e por isto tenho focado mais nas funções estáticas principais da cada classe.
Nas linhas seguintes, crio um diálogo, utilizando alguns métodos, apenas como ilustração:
>>> dl = QFileDialog()
>>> dl.setNameFilter("All C++ files (*.cpp *.cc *.C);;All files(*)")
>>> dl.setNameFilterDetailsVisible(True)
>>> dl.resolveSymlinks()
True
>>> dl.setLabelText(QFileDialog.FileName, '&Nome do Arquivo')
>>> dl.setLabelText(QFileDialog.LookIn, 'Olhando em:')
>>> dl.setLabelText(QFileDialog.FileType, 'Arquivos do tipo:')
>>> dl.setLabelText(QFileDialog.Accept, '&Abrir')
>>> dl.setLabelText(QFileDialog.Reject, '&Cancelar')
>>> dl.setWindowTitle('Salvar Programa')
>>> resp = dl.exec_()
>>> print resp
1
>>> dl.selectedFiles()[0]
PyQt4.QtCore.QString(u'/home/rudson/temp/teste.cpp')
QFileDialog herda de QDialog, que herda de QWidget, …, e isto pode dar algum trabalho encontrar os atributos e métodos desejados.
Observe que vários labels do diálogo padrão foram redefinidos. Neste exemplo, fiz uma tradução dos conteúdos padrões, mas poderia ser feito personalizações mais apropriadas ao aplicativo em desenvolvimento.
9 Comentários