QFileSystemModel setNameFilter format for files without extension

QFileSystemModel setNameFilter format for files without extension

有什么方法可以使用setNameFilters 显示所有不带扩展名的文件吗?我知道如何处理具有多个扩展名的文件(如下例中的 .txt),但我不知道如何检测没有扩展名的文件,而不是使用正则表达式,但我需要一些东西像这样(如果我可以直接使用 setNameFilters,我想避免这样做):

QSortFilterProxyModel* filter = new QSortFilterProxyModel(model);
filter->setFilterRegExp(QRegExp("^([^.]+)$", Qt::CaseInsensitive));

这是示例代码:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    Filemodel = new QFileSystemModel(this);
    Filemodel->setFilter( QDir::NoDotAndDotDot | QDir::Files );

    QStringList filters;
    filters << "*.txt";

    Filemodel.setNameFilters(filters);
    Filemodel.setNameFilterDisables(false);

    ui->Filtered_tbView->setModel( Filemodel );
}

所以基本上在 setNameFilters 上我想添加一个条件来不考虑上面有一个点的文件(当我希望文件包含一个特定的字符串时我知道该怎么做 - 这可以是扩展名 - 但是不是当我不想包含特定字符串时)。

不,你不能。唯一的方法是使用代理模型。你甚至不能在 QDir::setNameFilters() 中做到这一点。解释如下...

您是否尝试在 cmd.exe 中列出您的目录文件?你可以使用类似的东西:

dir *.

这样就可以了,对吧?现在改为打开 Powershell,并尝试执行相同的操作 :-) 它不起作用!当然,在powershell中dirGet-ChildItem的别名,还有另外一种表达方式:

Get-ChildItem -Exclude *.*

你可以在你的 Linux 终端中做类似的事情:

ls -I '*.*'

但是 Qt 类 QDirQFileSystemModel 中都没有类似的东西。您将需要一个 excludeNameFilter() 方法(顺便说一句,这将是对 Qt 的一个很好的补充!)。

解释是 Qt、powershell 和 ls 使用相同的 globbing syntax 并且无法像在正则表达式中那样在其上表达仅包括不带点的文件的正过滤器。