如何为文件对话框过滤器设置通配符

How can I set a wildcard for a File Dialog filter?

本文关键字:过滤器 设置 通配符 对话框 文件      更新时间:2023-10-16

我想设置一个文件对话框,允许 *.000 到 *.999 之间的所有文件扩展名。在幕后,我们使用QFileDialog,getOpenFileNames()函数文档似乎没有解释如何做我想做的事情(或者我想做的事情是否可行)。

我不想定义一个包含 1000 个零件的过滤器。

我知道我想要的正则表达式是"\d\d\d",但我不知道如何为过滤器定义它。

那么有没有办法做我想做的事呢?

谢谢。

QFileDialog的行为会有所不同,具体取决于您的使用方式:

默认情况下,如果平台 有一个。在这种情况下,本来会用于 构造对话框不会被实例化,因此相关访问器 例如 layout() 和 itemDelegate() 将返回 null。

它可以使用底层操作系统本机文件对话框,并且必须为每个平台回答通配符使用问题。

或者它可以使用基于Qt小部件的界面。在这种情况下,过滤器由QFileSystemModel处理,查看Qt代码,可以看到过滤器是使用QRegExpQRegExp::Wildcard实现的。

void QFileSystemModel::setNameFilters(const QStringList &filters)
{
...
    for (const auto &filter : filters)
        d->nameFilters << QRegExp(filter, caseSensitive, QRegExp::Wildcard);
...
}
...
bool QFileSystemModelPrivate::passNameFilters(const QFileSystemNode *node) const
{
...
        for (const auto &nameFilter : nameFilters) {
            QRegExp copy = nameFilter;
            if (copy.exactMatch(node->fileName))
                return true;
...
}

因此,如果您可以确保不使用本机文件对话框,则可以使用通配符。为此,您可以使用QFileDialog::DontUseNativeDialog

fileDialog->setOption(QFileDialog::DontUseNativeDialog, true);

对于通配符语法,Qt文档中有描述。但是对于您的情况,@Scheff已经给出了答案:*.[0-9][0-9][0-9]