- 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
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.






Olá, muito bem feita a série de artigos sobre PyQT.
Fica uma dica colocar os artigos número 3, 4 e 5 também na categoria PyQT pois da impressão de que só vai até o número 2.
Keep going!
Não percebi, mas vou colocar Rafael.
Valeu
Muito boa a sequência de artigos sobre PyQt, eu programo em Python, usando Tkinter e GTK, porém recentemente tive que criar um programa maior e ele tem que rodar no windows, sem falar que tive diversos problemas com recursos que não encontrei em widgets em GTK. Me surgiram então alguns problemas:
- Eu realmente não sei nada de Qt
- Não consigo nem mesmo ligar o sinal de um botão a uma função.
- não consegui encontrar documentação Qt em pdf para baixar, será que eu consigo um material de PyQt4 em PDF para download? o livro que eu encontrei é muito bom, porém não o vi em editoras brasileiras…
O melhor livro sobre PyQt que conheço é o “Rapid GUI Programming with Python and Qt”. Comprei o meu no amazon.com. Ainda pretendo escrever outros textos para esta série, mas não tenho previsão para quando.
Que pena, eu já procurei em diversas lojas online e não consegui nada, mas estou conseguindo me virar pouco a pouco, essa questão de signals e slots é que é barra para entender, no mais segue tranquilo…
O meu comprei na amazon.com
Para usar o “selectedFilter” basta usar o filtro completo, com nome e sobrenome :
>>> fileName = QFileDialog.getOpenFileName(None, ‘Open file’,’.’,'Texto (*.txt);;Imagem (*.jpeg *.jpg);;Audio (*.wav);;All (*)’, ‘All (*)’)