Наверное всё-таки имеется в виду "вход" в выбранную папку.
После некоторого исследования могу констатировать, что к сожалению легальными средствами сделать это не получится
Т.е. double-click отрабатывает всегда.
Я тут покопался в исходниках немного, нашел следующий способ.
C++ (Qt)
/*!
2901 \internal
2902
2903 This is called when the user double clicks on a file with the corresponding
2904 model item \a index.
2905 */
2906 void QFileDialogPrivate::_q_enterDirectory(const QModelIndex &index)
2907 {
2908 Q_Q(QFileDialog);
2909 // My Computer or a directory
2910 QModelIndex sourceIndex = index.model() == proxyModel ? mapToSource(index) : index;
2911 QString path = sourceIndex.data(QFileSystemModel::FilePathRole).toString();
2912 if (path.isEmpty() || model->isDir(sourceIndex)) {
2913 q->setDirectory(path);
2914 emit q->directoryEntered(path);
2915 if (fileMode == QFileDialog::Directory
2916 || fileMode == QFileDialog::DirectoryOnly) {
2917 // ### find out why you have to do both of these.
2918 lineEdit()->setText(QString());
2919 lineEdit()->clear();
2920 }
2921 } else {
2922 q->accept();
2923 }
2924 }
Прежде всего, коннектимся к сигналу currentChanged, где запоминаем имя выделенной директории и через SelectionModel получаем порядковый номер выделенного файла.
Еще нам нужно перехватить directoryEntered(QString), в котором будет сосредоточена основная работа. Проверяем, нужно ли нам открывать эту директорию. Если не нужно - оставляем пользователя в текущей директории: this->setDirectory(mOldPath), восстанавливаем ModelIndex и имя файла в lineEdit. Причем, чтобы обойти очистку lineEdit в исходниках (строка 2918-2919), подключим directoryEntered с режимом Qt::QueuedConnection.
Вот такой костыль получился. Вроде бы я пробежался по тексту QFileDialog, проблем с QueuedConnection быть не должно - там всего 2 вызова directoryEntered.
И все это в коде, может кому-нибудь пригодится:
C++ (Qt)
FileDialog::FileDialog(QWidget* parent, const QString& caption, const QString& directory, const QString& filter) :
QFileDialog(parent, caption, directory, filter)
{
this->connect(this, SIGNAL(directoryEntered(QString)),
this, SLOT(slotDirectoryEntered(QString)),
Qt::QueuedConnection);
this->connect(this, SIGNAL(currentChanged(QString)),
this, SLOT(slotCurrentChanged(QString)));
mPath = qApp->applicationDirPath();
modelView = this->findChild<QListView*>("listView");
lineEdit = this->findChild<QLineEdit*>();
}
int FileDialog::slotDirectoryEntered(QString path)
{
QDir newDirectory(path);
// Получение списка файлов и директорий в папке
QStringList objects = newDirectory.entryList(QDir::AllDirs | QDir::NoDotAndDotDot);
// Проверка элементов
...
// Если заходить в директорию не нужно
if (objects.size() == 0)
{
this->setDirectory(mPath);
if (lineEdit && modelView)
{
modelView->setCurrentIndex(mModelIndex);
lineEdit->setText(mSelectedFileName);
}
}
else
{
mPath = path;
}
return 0;
}
int FileDialog::slotCurrentChanged(QString path)
{
if (path.isEmpty())
return 0;
if (lineEdit && modelView)
{
mModelIndex = modelView->currentIndex();
mSelectedFileName = QDir(path).dirName();
}
return 0;
}