Формат QFileSystemModel setNameFilter для файлов без расширения

Есть ли способ отобразить все файлы без расширения с помощью 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 я хочу добавить условие, чтобы не рассматривать файлы с точкой на нем (я знаю, как это сделать, когда я хочу, чтобы файлы включали определенную строку, которая может быть расширением, но не когда я хочу НЕ включать конкретную строку).


person laurapons    schedule 25.09.2019    source источник


Ответы (1)


Нет, ты не можешь. Единственный способ сделать это — использовать прокси-модель. Вы даже не можете сделать это в QDir::setNameFilters(). Объяснение следует...

Вы пытались перечислить файлы каталога в cmd.exe? вы можете использовать что-то вроде:

dir *.

это бы сработало, верно? А теперь вместо этого откройте Powershell и попробуйте сделать то же самое :-) Не работает! Конечно, в powershell dir — это псевдоним для Get-ChildItem, и есть другой способ выразить это:

Get-ChildItem -Exclude *.*

И вы можете сделать что-то подобное в своем терминале Linux:

ls -I '*.*'

Но ничего похожего нет в классах Qt QDir и QFileSystemModel. Вам понадобится метод excludeNameFilter() (кстати, это было бы хорошим дополнением к Qt!).

Объяснение заключается в том, что Qt, powershell и ls используют один и тот же подстановочный синтаксис, и существует нельзя выразить на нем положительный фильтр, включающий только файлы без точек, как вы делаете в регулярном выражении.

person Former contributor    schedule 28.09.2019
comment
Спасибо! В итоге я создал QSortFilterProxyModel, и он работает как шарм (я согласен, было бы неплохо иметь возможность фильтровать путем исключения или с помощью регулярного выражения без необходимости создавать прокси-модель. - person laurapons; 30.09.2019