Проверить, является ли расширение файла частью данного списка

Я пытаюсь сделать простой виджет, который содержит lineedit, который показывает имя файла и кнопку, чтобы открыть файл диалога. и теперь я хочу проверить, является ли расширение файла допустимым, в данном случае это файл изображения, заканчивающийся на jpg, png или bmp. Я решил это с помощью QFileInfo и QList, этот код находится в моем слоте btn_clicked:

QString filename = QFileDialog::getOpenFileName(this, tr("Select an image File", "", tr("Image Files (*.bmp *.jpg *.png);; All Files(*)"));
QList<QString> ext_list;
ext_list<<"bmp"<<"jpg"<<"png";
QFileInfo fi(filename);
QString ext = fi.suffix();
if (ext_list.contains(ext)){
   // lineedit->setText(filename);
}
else {
QMessageBox msgBox;
msgBox.critical(0, "Error", "You must select a valid image file");

это работает, но есть ли более простой / элегантный способ достижения цели? Спасибо за вашу помощь.

1 ответ

Решение

Вас могут заинтересовать setNameFilters функция: http://doc.qt.io/qt-5/qfiledialog.html

Обновить

Если вы хотите фильтровать изображения, не называя каждое расширение, вы должны использовать QMimeDatabase, Это позволит вам определить ваш фильтр для QFileDialog а затем получить список расширений для проверки.

Например, с помощью JPEG и PNG:

QStringList mimeTypeFilters;
mimeTypeFilters << "image/jpeg" << "image/png";

QFileDialog fd;
fd.setFileMode(QFileDialog::ExistingFile);
fd.setMimeTypeFilters(mimeTypeFilters);
fd.exec();

QString filename = fd.selectedFiles().count() == 1 ? fd.selectedFiles().at(0) : "";

QMimeDatabase mimedb;
if(!mimeTypeFilters.contains(mimedb.mimeTypeForFile(filename).name()))
{
    // something is wrong here !
}
Другие вопросы по тегам