- 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
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.
| Constante | Valor | Descrição |
|---|---|---|
| QFileDialog.ShowDirsOnly | 0x01 | mostra apenas diretórios no diálogo |
| QFileDialog.DontResolveSymlinks | 0x02 | não resolve links simbólicos |
| QFileDialog.DontConfirmOverwrite | 0x04 | não solicita confirmação se um arquivo existente for selecionado |
| QFileDialog.DontUseSheet | 0x08 | Don't make the native file dialog a sheet. By default on Mac OS X, the native file dialog is made a sheet if it has a parent that can take a sheet. |
| QFileDialog.DontUseNativeDialog | 0x10 | Don't use the native file dialog. By default on Mac OS X and Windows, the native file dialog is used. |
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.
<< Slackmirror 3.2.32 Slackmirror 3.2.33 >>
You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.
One Trackback/Ping
-
PyQt: 04 – Diálogos com QInputDialog » a bit of… Out 03 2009 at 10am:
[...] Próximo > PyQt: 05 – Diálogo QFileDialog [...]





7 comments so far
Rafael
rudsonalves
Artur
Rudson Alves
Artur
rudsonalves
Mamaeh Uarahu