Фотография | Компьютеры | Программы | Эсперанто | Кровное
FileDialog для Qtopia
В Qtopia на Sharp Zaurus отсутствует QFileDialog (есть, правда, другое средство, но гораздо менее удобное и практичное). Вот класс, который может заменить QFileDialog:
# filedialog.py # Copyright (C) Dmitri Brechalov, 2005 from qt import * import os.path pics_path = '/usr/QtPalmtop.rom/pics' file_pic_name = 'slUnknown.png' dir_pic_name = 'slfolder.png' btnUp_pic_name = 'folderup.png' class FileDialog(QDialog): '''Simple replacement for QFileDialog on Zaurus FileDialog(parent, name, caption, dirName, filter) Example: d = FileDialog(name="FileDialog", dirName="/home/zaurus/", filter="*.txt") ''' def __init__(self, parent=None, name=None, caption=None, dirName=None, filter=None): QDialog.__init__(self,parent,name,1) self.__filename = None if dirName is None: dirName = '.' self.__dirname = os.path.abspath(dirName) if filter is None: self.__filter = '*' else: self.__filter = filter self.__init(parent, name, caption) self.__refreshFileList() self.__connect() def __init(self, parent, name, caption): if not name: name = 'FileDialog' if not caption: caption = 'Open File' self.__name = name self.setName(name) self.setCaption(caption) self.btnUp_pic = QPixmap(QString(os.path.join(pics_path, btnUp_pic_name))) self.dir_pic = QPixmap(QString(os.path.join(pics_path, dir_pic_name))) self.file_pic = QPixmap(QString(os.path.join(pics_path, file_pic_name))) self.setSizePolicy(QSizePolicy(7,7,self.sizePolicy().hasHeightForWidth())) self.setBaseSize(QSize(640,480)) FileDialogLayout = QVBoxLayout(self,1,2,"FileDialogLayout") self.topPanel = QFrame(self,"topPanel") self.topPanel.setSizePolicy(QSizePolicy(7,7,self.topPanel.sizePolicy().hasHeightForWidth())) self.topPanel.setFrameShape(QFrame.NoFrame) self.topPanel.setFrameShadow(QFrame.Plain) topPanelLayout = QHBoxLayout(self.topPanel,1,2,"topPanelLayout") self.lblFile = QLabel(self.topPanel,"lblFile") topPanelLayout.addWidget(self.lblFile) self.fileEdit = QLineEdit(self.topPanel,"fileEdit") self.fileEdit.setSizePolicy(QSizePolicy(7,0,self.fileEdit.sizePolicy().hasHeightForWidth())) ## self.fileEdit.setEditable(1) topPanelLayout.addWidget(self.fileEdit) self.btnUp = QToolButton(self.topPanel, "btnUp") self.btnUp.setPixmap(self.btnUp_pic) self.btnUp.setMinimumSize(QSize(20,20)) ## self.btnUp.setMaximumSize(QSize(20,20)) topPanelLayout.addWidget(self.btnUp) FileDialogLayout.addWidget(self.topPanel) self.fileList = QListBox(self,"fileList") FileDialogLayout.addWidget(self.fileList) self.lblFile.setText(self.tr("File name:")) self.fileList.clear() ## self.fileList.insertItem(self.tr("New Item")) if parent is not None: self.resize(parent.size()) else: self.resize(QSize(497,311).expandedTo(self.minimumSizeHint())) def __connect(self): self.connect(self.fileList,SIGNAL("highlighted(QListBoxItem*)"), self.fileListClicked) self.connect(self.fileList,SIGNAL("selected(QListBoxItem*)"), self.fileListSelected) self.connect(self.fileEdit,SIGNAL("textChanged(const QString &)"), self.fileEditChanged) self.connect(self.btnUp,SIGNAL("clicked()"), self.btnUpClicked) def __refreshFileList(self): import glob #### collect all folders fldrlst = [ fname for fname in glob.glob1(self.__dirname, '*') if os.path.isdir(os.path.join(self.__dirname, fname)) ] fldrlst.sort() #### collect files matched the filter filelst = [] filters = self.__filter.split('|') for filt in filters: for fname in glob.glob1(self.__dirname, filt): if not os.path.isdir(os.path.join(self.__dirname, fname)): filelst.append(fname) filelst.sort() #### fill the listbox self.fileList.clear() if self.__dirname != '/': self.fileList.insertItem(self.dir_pic, '..') for fname in fldrlst: self.fileList.insertItem(self.dir_pic, fname) for fname in filelst: self.fileList.insertItem(self.file_pic, fname) def setCaption(self, caption): self.__title = caption self.__updateCaption() def __updateCaption(self): QDialog.setCaption(self, '%s : %s' % (self.__title, self.__dirname)) def fileListClicked(self, item): fname = str(item.text().utf8()) if os.path.isdir(os.path.join(self.__dirname, fname)): self.fileEdit.setText('') else: self.fileEdit.setText(item.text()) def fileListSelected(self, item): ## print item.text() fname = str(item.text().utf8()) if fname == '..': self.btnUpClicked() return new_dir = os.path.join(self.__dirname, fname) if os.path.isdir(new_dir): self.__dirname = new_dir self.__refreshFileList() self.__updateCaption() else: self.fileListClicked(item) def btnUpClicked(self): (new_dir, fname) = os.path.split(self.__dirname) self.__dirname = new_dir self.__refreshFileList() self.__updateCaption() item = self.fileList.findItem(QString(fname)) if item: self.fileList.setCurrentItem(item) def fileEditChanged(self, qstr): self.__filename = str(qstr.utf8()) def selectedFile(self): if self.__filename: return os.path.join(self.__dirname, self.__filename) else: return None # end of filedialog.py