PyQt 05 – Diálogo QFileDialog

Agosto 8th, 2009 por rudsonalves Leave a reply »
Este artigo é a parte 5 de 8 na série PyQt

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);;Images (*.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 (*)')

dialog-09

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

dialog-10

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

dialog-11

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

dialog-12

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.

dialog-13

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.

Advertisement

8 comments

  1. Rafael says:

    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!

  2. rudsonalves says:

    Não percebi, mas vou colocar Rafael.

    Valeu

  3. Artur says:

    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 :D
    - 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…

  4. Rudson Alves says:

    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.

  5. Artur says:

    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…

  6. rudsonalves says:

    O meu comprei na amazon.com

  7. Mamaeh Uarahu says:

    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 (*)’)

Leave a Reply

Spam Protection by WP-SpamFree

Better Tag Cloud