Return a correct filter from QFileDialog::selectedMimeTypeFilter()

QFileDialog::selectedMimeTypeFilter() returns either an empty
filter in the case when a platform file dialog doesn't implement
mime type filters, or initiallySelectedMimeTypeFilter() in the
case of Qt's file dialog. In both cases the result is incorrect.

Make it return a mime type filter corresponding to a selected
name filter. As a result, tst_QFiledialog::setMimeTypeFilters()
has to be fixed: QFileDialog::selectMimeTypeFilter() can't select
a name filter for an invalid mime type, and "application/json"
is not supported by RHEL 6.6, so replace it by "application/pdf".

Change-Id: I58d3be860a9b5e8a72cba86d74b520178115a812
Reviewed-by: David Faure <david.faure@kdab.com>
bb10
Alexander Volkov 2018-04-23 14:10:01 +03:00
parent 4af292fe51
commit 4d73ab73c8
2 changed files with 37 additions and 16 deletions

View File

@ -1462,19 +1462,6 @@ void QFileDialog::selectNameFilter(const QString &filter)
}
}
/*!
* \since 5.9
* \return The mimetype of the file that the user selected in the file dialog.
*/
QString QFileDialog::selectedMimeTypeFilter() const
{
Q_D(const QFileDialog);
if (!d->usingWidgets())
return d->selectedMimeTypeFilter_sys();
return d->options->initiallySelectedMimeTypeFilter();
}
/*!
\since 4.4
@ -1611,6 +1598,36 @@ void QFileDialog::selectMimeTypeFilter(const QString &filter)
#endif // QT_NO_MIMETYPE
/*!
* \since 5.9
* \return The mimetype of the file that the user selected in the file dialog.
*/
QString QFileDialog::selectedMimeTypeFilter() const
{
Q_D(const QFileDialog);
QString mimeTypeFilter;
if (!d->usingWidgets())
mimeTypeFilter = d->selectedMimeTypeFilter_sys();
#ifndef QT_NO_MIMETYPE
if (mimeTypeFilter.isNull() && !d->options->mimeTypeFilters().isEmpty()) {
const auto nameFilter = selectedNameFilter();
const auto mimeTypes = d->options->mimeTypeFilters();
for (const auto &mimeType: mimeTypes) {
QString filter = nameFilterForMime(mimeType);
if (testOption(HideNameFilterDetails))
filter = qt_strip_filters({ filter }).first();
if (filter == nameFilter) {
mimeTypeFilter = mimeType;
break;
}
}
}
#endif
return mimeTypeFilter;
}
/*!
\property QFileDialog::viewMode
\brief the way files and directories are displayed in the dialog

View File

@ -1049,12 +1049,12 @@ void tst_QFiledialog::setMimeTypeFilters_data()
QTest::addColumn<QString>("expectedSelectedMimeTypeFilter");
const auto headerMime = QStringLiteral("text/x-chdr");
const auto jsonMime = QStringLiteral("application/json");
const auto pdfMime = QStringLiteral("application/pdf");
const auto zipMime = QStringLiteral("application/zip");
QTest::newRow("single mime filter (C header file)") << QStringList {headerMime} << headerMime << headerMime;
QTest::newRow("single mime filter (JSON file)") << QStringList {jsonMime} << jsonMime << jsonMime;
QTest::newRow("multiple mime filters") << QStringList {jsonMime, zipMime} << jsonMime << jsonMime;
QTest::newRow("single mime filter (JSON file)") << QStringList {pdfMime} << pdfMime << pdfMime;
QTest::newRow("multiple mime filters") << QStringList {pdfMime, zipMime} << pdfMime << pdfMime;
}
void tst_QFiledialog::setMimeTypeFilters()
@ -1068,6 +1068,10 @@ void tst_QFiledialog::setMimeTypeFilters()
fd.selectMimeTypeFilter(targetMimeTypeFilter);
QCOMPARE(fd.selectedMimeTypeFilter(), expectedSelectedMimeTypeFilter);
auto *filters = fd.findChild<QComboBox*>("fileTypeCombo");
filters->setCurrentIndex(filters->count() - 1);
QCOMPARE(fd.selectedMimeTypeFilter(), mimeTypeFilters.last());
}
void tst_QFiledialog::setEmptyNameFilter()