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

时间:2017-11-07 15:28:09

标签: c++ qt

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

我不想定义1000个部件的过滤器。

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

那么有办法做我想要的吗?

感谢。

1 个答案:

答案 0 :(得分:1)

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

  

默认情况下,如果平台将使用平台本机文件对话框   有一个。在这种情况下,否则将使用的小部件   构造对话框不会被实例化,所以相关的访问器   例如layout()和itemDelegate()将返回null。

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

或者它可以使用基于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 documentation中有说明。但是对于你的情况,答案已经由@Scheff给出:*.[0-9][0-9][0-9]