📄 qfiledialog.cpp
字号:
/*! \since 4.3 Restores the dialogs's layout, history and current directory to the \a state specified. Typically this is used in conjunction with QSettings to restore the size from a past session. Returns false if there are errors*/bool QFileDialog::restoreState(const QByteArray &state){ Q_D(QFileDialog); int version = 3; QByteArray sd = state; QDataStream stream(&sd, QIODevice::ReadOnly); if (stream.atEnd()) return false; QByteArray splitterState; QByteArray headerData; QList<QUrl> bookmarks; QStringList history; QString currentDirectory; qint32 marker; qint32 v; qint32 viewMode; stream >> marker; stream >> v; if (marker != QFileDialogMagic || v != version) return false; stream >> splitterState >> bookmarks >> history >> currentDirectory >> headerData >> viewMode; if (!d->qFileDialogUi->splitter->restoreState(splitterState)) return false; QList<int> list = d->qFileDialogUi->splitter->sizes(); if (list.count() >= 2 && list.at(0) == 0 && list.at(1) == 0) { for (int i = 0; i < list.count(); ++i) list[i] = d->qFileDialogUi->splitter->widget(i)->sizeHint().width(); d->qFileDialogUi->splitter->setSizes(list); } d->qFileDialogUi->sidebar->setUrls(bookmarks); setHistory(history); setDirectory(currentDirectory); if (!d->qFileDialogUi->treeView->header()->restoreState(headerData)) return false; setViewMode(ViewMode(viewMode)); return true;}/*! \reimp*/void QFileDialog::changeEvent(QEvent *e){ Q_D(QFileDialog); if (e->type() == QEvent::LanguageChange) { d->retranslateWindowTitle(); d->retranslateStrings(); } QDialog::changeEvent(e);}void QFileDialogPrivate::retranslateWindowTitle(){ Q_Q(QFileDialog); if (!useDefaultCaption || setWindowTitle != q->windowTitle()) return; if (fileMode == QFileDialog::ExistingFiles || fileMode == QFileDialog::ExistingFile) q->setWindowTitle(QFileDialog::tr("Open")); if (fileMode == QFileDialog::AnyFile) q->setWindowTitle(QFileDialog::tr("Save As")); if (fileMode == QFileDialog::DirectoryOnly || fileMode == QFileDialog::Directory) q->setWindowTitle(QFileDialog::tr("Find Directory")); setWindowTitle = q->windowTitle();}void QFileDialogPrivate::retranslateStrings(){ Q_Q(QFileDialog); /* WIDGETS */ if (defaultFileTypes) q->setFilter(QFileDialog::tr("All Files (*)")); QList<QAction*> actions = qFileDialogUi->treeView->header()->actions(); QAbstractItemModel *abstractModel = model;#ifndef QT_NO_PROXYMODEL if (proxyModel) abstractModel = proxyModel;#endif int total = qMin(abstractModel->columnCount(QModelIndex()), actions.count() + 1); for (int i = 1; i < total; ++i) { actions.at(i - 1)->setText(QFileDialog::tr("Show ") + abstractModel->headerData(i, Qt::Horizontal, Qt::DisplayRole).toString()); } /* MENU ACTIONS */ renameAction->setText(QFileDialog::tr("&Rename")); deleteAction->setText(QFileDialog::tr("&Delete")); showHiddenAction->setText(QFileDialog::tr("Show &hidden files")); newFolderAction->setText(QFileDialog::tr("&New Folder")); qFileDialogUi->retranslateUi(q);}/*! \internal set the directory to url*/void QFileDialogPrivate::_q_goToUrl(const QUrl &url){ QModelIndex idx = model->index(url.toLocalFile()); _q_enterDirectory(idx);}/*! \fn void QFileDialog::setDirectory(const QDir &directory) \overload*//*! Sets the file dialog's current \a directory.*/void QFileDialog::setDirectory(const QString &directory){ Q_D(QFileDialog); if (d->rootPath() == directory) return; QModelIndex idx = d->model->index(directory);#ifndef QT_NO_COMPLETER d->completer->setCompletionPrefix(directory);#endif QModelIndex root = d->model->setRootPath(directory); d->qFileDialogUi->newFolderButton->setEnabled(d->model->flags(root) & Qt::ItemIsDropEnabled); d->setRootIndex(root); d->qFileDialogUi->listView->selectionModel()->clear();}/*! Returns the directory currently being displayed in the dialog.*/QDir QFileDialog::directory() const{ Q_D(const QFileDialog); return QDir(d->rootPath());}/*! Selects the given \a filename in the file dialog. \sa selectedFiles()*/void QFileDialog::selectFile(const QString &filename){ Q_D(QFileDialog); if (filename.isEmpty()) return; QModelIndex index = d->model->index(filename); if (!index.isValid()) { // save as dialog where we want to input a default value QString text = filename; if (QFileInfo(filename).isAbsolute()) { QString current = d->rootPath(); text.remove(current); } if (!d->lineEdit()->hasFocus()) d->lineEdit()->setText(text); } else { d->qFileDialogUi->listView->selectionModel()->clear(); if (!d->lineEdit()->hasFocus()) d->lineEdit()->setText(index.data().toString()); }}/** Returns the text in the line edit which can be one or more file names */QStringList QFileDialogPrivate::typedFiles() const{ QStringList files; QString editText = lineEdit()->text(); if (editText.contains(QLatin1Char('"'))) { // " is used to separate files like so: "file1" "file2" "file3" ... // ### need escape character for filenames with quotes (") QStringList tokens = editText.split(QLatin1Char('\"')); for (int i = 0; i < tokens.size(); ++i) { if ((i % 2) == 0) continue; // Every even token is a separator QString name = toInternal(tokens.at(i)); QFileInfo info(name); // if the filename has no suffix, add the default suffix if (!defaultSuffix.isEmpty() && !info.isDir() && name.lastIndexOf(QLatin1Char('.')) == -1) name += QLatin1Char('.') + defaultSuffix; // a new filename if ((fileMode == QFileDialog::ExistingFiles) || files.isEmpty()) { if (info.isAbsolute()) files.append(name); else files.append(toInternal(rootPath() + QDir::separator() + name)); } } } else { QString name = editText; QFileInfo info(name); // if the filename has no suffix, add the default suffix if (!defaultSuffix.isEmpty() && !info.isDir() && name.lastIndexOf(QLatin1Char('.')) == -1) name += QLatin1Char('.') + defaultSuffix; if (info.isAbsolute()) files.append(name); else files.append(toInternal(rootPath() + QDir::separator() + name)); } return files;}/*! Returns a list of strings containing the absolute paths of the selected files in the dialog. If no files are selected, or the mode is not ExistingFiles, selectedFiles() is an empty string list. \sa selectedFilter(), selectFile()*/QStringList QFileDialog::selectedFiles() const{ Q_D(const QFileDialog); QModelIndexList indexes = d->qFileDialogUi->listView->selectionModel()->selectedRows(); QStringList files; for (int i = 0; i < indexes.count(); ++i) files.append(d->model->filePath(d->mapToSource(indexes.at(i)))); if (files.isEmpty()) files = d->typedFiles(); if (files.isEmpty() && d->fileMode == DirectoryOnly) files.append(d->model->filePath(d->rootIndex())); return files;}/* Makes a list of filters from ;;-separated text. Used by the mac and windows implementations*/QStringList qt_make_filter_list(const QString &filter){ QString f(filter); if (f.isEmpty()) return QStringList(); QString sep(QLatin1String(";;")); int i = f.indexOf(sep, 0); if (i == -1) { if (f.indexOf(QLatin1Char('\n'), 0) != -1) { sep = QLatin1Char('\n'); i = f.indexOf(sep, 0); } } return f.split(sep);}/*! Sets the filter used in the file dialog to the given \a filter. If \a filter contains a pair of parentheses containing one or more of \bold{anything*something}, separated by semicolons, then only the text contained in the parentheses is used as the filter. This means that these calls are all equivalent: \code dialog.setFilter("All C++ files (*.cpp;*.cc;*.C;*.cxx;*.c++)"); dialog.setFilter("*.cpp;*.cc;*.C;*.cxx;*.c++"); \endcode \sa setFilters()*/void QFileDialog::setFilter(const QString &filter){ setFilters(qt_make_filter_list(filter));}/*! Sets the \a filters used in the file dialog. \code QStringList filters; filters << "Image files (*.png *.xpm *.jpg)" << "Text files (*.txt)" << "Any files (*)"; QFileDialog dialog(this); dialog.setFilters(filters); dialog.exec(); \endcode*/void QFileDialog::setFilters(const QStringList &filters){ Q_D(QFileDialog); d->defaultFileTypes = (filters == QStringList(QFileDialog::tr("All Files (*)"))); d->qFileDialogUi->fileTypeCombo->clear(); if (filters.isEmpty()) return; d->qFileDialogUi->fileTypeCombo->addItems(filters); d->_q_useNameFilter(filters.first());}/*! Returns the file type filters that are in operation on this file dialog.*/QStringList QFileDialog::filters() const{ Q_D(const QFileDialog); QStringList items; for (int i = 0; i < d->qFileDialogUi->fileTypeCombo->count(); ++i) items.append(d->qFileDialogUi->fileTypeCombo->itemText(i)); return items;}/*! Sets the current file type \a filter. Multiple filters can be passed in \a filter by separating them with semicolons or spaces. \sa setFilter(), setFilters(), selectedFilter()*/void QFileDialog::selectFilter(const QString &filter){ Q_D(QFileDialog); int i = d->qFileDialogUi->fileTypeCombo->findText(filter); if (i >= 0) { d->qFileDialogUi->fileTypeCombo->setCurrentIndex(i); d->_q_useNameFilter(d->qFileDialogUi->fileTypeCombo->currentText()); }}/*! Returns the filter that the user selected in the file dialog. \sa selectedFiles()*/QString QFileDialog::selectedFilter() const{ Q_D(const QFileDialog); return d->qFileDialogUi->fileTypeCombo->currentText();}/*! \property QFileDialog::viewMode \brief the way files and directories are displayed in the dialog By default, the \c Detail mode is used to display information about files and directories. \sa ViewMode*/void QFileDialog::setViewMode(QFileDialog::ViewMode mode){ Q_D(QFileDialog); if (mode == Detail) d->_q_showDetailsView(); else d->_q_showListView();}QFileDialog::ViewMode QFileDialog::viewMode() const{ Q_D(const QFileDialog); return (d->qFileDialogUi->stackedWidget->currentWidget() == d->qFileDialogUi->listView->parent() ? QFileDialog::List : QFileDialog::Detail);}/*! \property QFileDialog::fileMode \brief the file mode of the dialog
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -