diff --git a/src/gui/dialogs/qfiledialog.cpp b/src/gui/dialogs/qfiledialog.cpp index 2aba04d..ced8efa 100644 --- a/src/gui/dialogs/qfiledialog.cpp +++ b/src/gui/dialogs/qfiledialog.cpp @@ -2073,10 +2073,13 @@ void QFileDialog::accept() return; } if (info.isDir()) { + if (info.isSymLink() && (!resolveSymlinks())) + break; setDirectory(info.absoluteFilePath()); d->lineEdit()->clear(); return; } + } d->emitFilesSelected(files); QDialog::accept(); @@ -2138,6 +2141,7 @@ void QFileDialogPrivate::createWidgets() { Q_Q(QFileDialog); model = new QFileSystemModel(q); + model->setResolveSymlinks(!(this->opts & QFileDialog::DontResolveSymlinks)); model->setObjectName(QLatin1String("qt_filesystem_model")); #ifdef Q_WS_MAC model->setNameFilterDisables(true); diff --git a/src/gui/dialogs/qfilesystemmodel.cpp b/src/gui/dialogs/qfilesystemmodel.cpp index 28ea3a4..4c74bc7 100644 --- a/src/gui/dialogs/qfilesystemmodel.cpp +++ b/src/gui/dialogs/qfilesystemmodel.cpp @@ -494,8 +494,10 @@ bool QFileSystemModel::isDir(const QModelIndex &index) const if (!index.isValid()) return true; QFileSystemModelPrivate::QFileSystemNode *n = d->node(index); - if (n->hasInformation()) + if (n->hasInformation()) { + n->setResolveSymLinks(resolveSymlinks()); return n->isDir(); + } return fileInfo(index).isDir(); } diff --git a/src/gui/dialogs/qfilesystemmodel_p.h b/src/gui/dialogs/qfilesystemmodel_p.h index 2d1680f..62885c4 100644 --- a/src/gui/dialogs/qfilesystemmodel_p.h +++ b/src/gui/dialogs/qfilesystemmodel_p.h @@ -107,11 +107,19 @@ public: inline bool isExecutable() const { return ((permissions() & QFile::ExeUser) != 0); } inline bool isDir() const { if (info) - return info->isDir(); + if (info->isDir()) { + if (info->isSymLink() && !resolveSymLinks()) + return false; + return true; + } else { + return false; + } if (children.count() > 0) return true; return false; } + inline bool resolveSymLinks() const { return m_resolveSymLinks; } + inline void setResolveSymLinks(bool newRes) { m_resolveSymLinks = newRes; } inline bool isFile() const { if (info) return info->isFile(); return true; } inline bool isSystem() const { if (info) return info->isSystem(); return true; } inline bool isHidden() const { if (info) return info->isHidden(); return false; } @@ -199,6 +207,7 @@ public: QExtendedInformation *info; + bool m_resolveSymLinks; };