【问题标题】:QFileSystemModel setNameFilter format for files without extension没有扩展名的文件的 QFileSystemModel setNameFilter 格式
【发布时间】:2019-09-29 02:01:56
【问题描述】:

有没有什么方法可以使用 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 上我想添加一个条件以不考虑带有点的文件(我知道当我希望文件包含特定字符串时该怎么做 - 可以是扩展名 - 但不是什么时候我不想包含特定的字符串)。

【问题讨论】:

    标签: qt qfilesystemmodel


    【解决方案1】:

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

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

    dir *.
    

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

    Get-ChildItem -Exclude *.*
    

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

    ls -I '*.*'
    

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

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

    【讨论】:

    • 谢谢!我最终创建了一个 QSortFilterProxyModel,它的工作原理就像一个魅力(我同意能够通过排除或使用正则表达式进行过滤而不必创建代理模型。
    猜你喜欢
    • 1970-01-01
    • 2016-12-24
    • 1970-01-01
    • 2012-12-24
    • 1970-01-01
    • 2017-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多