检查文件扩展名是否是给定列表的一部分

check if a file extension is part of a given list

我正在尝试制作一个简单的小部件,其中包含一个显示文件名的行编辑器和一个用于打开文件对话框的按钮。 现在我想检查文件扩展名是否有效,在本例中,是一个以 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");

它有效,但是否有更 simple/elegant 的方法来实现目标?感谢您的帮助。

您可能对 setNameFilters 函数感兴趣:http://doc.qt.io/qt-5/qfiledialog.html#setNameFilters

更新

如果你想在不命名每个扩展名的情况下过滤图像,你应该使用 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 !
}