Russian Qt Forum

Qt => Model-View (MV) => Тема начата: Serega от Апрель 06, 2015, 15:42



Название: QTreeView + QFileSystemModel - скрыть стрелку пустых папок
Отправлено: Serega от Апрель 06, 2015, 15:42
Теперь наверное точно застрял в этой серии http://www.prog.org.ru/topic_28581_0.html
Понятия не имею как скрыть расскрывающие стрелки пустых папок?
Пытался переопределить:
Код
C++ (Qt)
bool managerModel::hasChildren( const QModelIndex & parent ) const
{
 return rowCount(parent) > 0;
}
Не дает должного результата.

Здесь уже вряд ли без помощи профи разобраться, во всяком случае быстро.


Название: Re: QTreeView + QFileSystemModel - скрыть стрелку пустых папок
Отправлено: Serega от Апрель 06, 2015, 19:46
Снова метод железного тыка привел к такому варианту:
Код
C++ (Qt)
bool managerModel::hasChildren( const QModelIndex & parent ) const
{
 if(fileInfo(parent).isDir())
 {
   QDirIterator it(filePath(parent));
   it.next();
   it.next();
   return it.hasNext();
 }
 return false;
}

Работает и покороче (что посоветуете?):
Код
C++ (Qt)
bool managerModel::hasChildren( const QModelIndex & parent ) const
{
 QDirIterator it(filePath(parent));
 it.next();
 it.next();
 return it.hasNext();
}

Работает как часы. Однако хотелось бы спросить на сколько все плохо? Почему приходится итератор пару раз передвигать и почему его вообще надо двигать?


Название: Re: QTreeView + QFileSystemModel - скрыть стрелку пустых папок
Отправлено: Old от Апрель 06, 2015, 19:48
Это специальные элементы директория "." и ".."


Название: Re: QTreeView + QFileSystemModel - скрыть стрелку пустых папок
Отправлено: Serega от Апрель 06, 2015, 20:17
Да действительно. Спасибо! Сам не догадался проверить :)
qDebug() << it.next();
А как само решение? Не слишком грубо и какой вариант предпочесть?
Спрашиваю, поскольку практического опыта не много и не могу оценить решение.


Название: Re: QTreeView + QFileSystemModel - скрыть стрелку пустых папок
Отправлено: Old от Апрель 06, 2015, 20:30
Я бы проверил на isDir, получил из fileInfo объект QDir и смотрел на количество файлов QDir::count.


Название: Re: QTreeView + QFileSystemModel - скрыть стрелку пустых папок
Отправлено: Serega от Апрель 06, 2015, 20:44
Помоему это первое, что пришло в голову испробовать. Однако почему то не прокатило. Пустые папки не оказывались таковыми.
Но попробую повнимательней, возможно какая нибудь мелочь типа "." и ".." не дала результат сразу.


Название: Re: QTreeView + QFileSystemModel - скрыть стрелку пустых папок
Отправлено: Old от Апрель 06, 2015, 20:47
Помоему это первое, что пришло в голову испробовать. Однако почему то не прокатило. Пустые папки не оказывались таковыми.
Но попробую повнимательней, возможно какая нибудь мелочь типа "." и ".." не дала результат сразу.
Конечно. Папка не пуста, если count > 2.


Название: Re: QTreeView + QFileSystemModel - скрыть стрелку пустых папок
Отправлено: Serega от Апрель 06, 2015, 20:51
Спасибо! Перепроверить уже успел. Действительно парочку так же надо было прибавить.


Название: Re: QTreeView + QFileSystemModel - скрыть стрелку пустых папок
Отправлено: Serega от Апрель 06, 2015, 20:56
Вот так все просто:
Код
C++ (Qt)
bool managerModel::hasChildren( const QModelIndex & parent ) const
{
 return QDir(filePath(parent)).count() > 2;
}


Название: Re: QTreeView + QFileSystemModel - скрыть стрелку пустых папок
Отправлено: Serega от Апрель 06, 2015, 21:02
Проверка на  isDir даст ли прирост в скорости хоть сколько нибудь? Или это будет отказоустойчивее?


Название: Re: QTreeView + QFileSystemModel - скрыть стрелку пустых папок
Отправлено: Old от Апрель 06, 2015, 21:05
Проверка на  isDir даст ли прирост в скорости хоть сколько нибудь? Или это будет отказоустойчивее?
А сейчас у вас файлам плюсики не рисует? Как будто у них есть дети?


Название: Re: QTreeView + QFileSystemModel - скрыть стрелку пустых папок
Отправлено: Serega от Апрель 06, 2015, 21:10
Все в порядке. У файлов плюсиков (треугольники) нет.


Название: Re: QTreeView + QFileSystemModel - скрыть стрелку пустых папок
Отправлено: Old от Апрель 06, 2015, 21:17
Все в порядке. У файлов плюсиков (треугольники) нет.
Тогда hasChildren вызывается только для директорий и можно на isDir не проверять.


Название: Re: QTreeView + QFileSystemModel - скрыть стрелку пустых папок
Отправлено: Авварон от Апрель 06, 2015, 23:55
Тогда hasChildren вызывается только для директорий и можно на isDir не проверять.

У файлов гарантированно rowCount == 0.
ЗЫ: решение с rowCount > 2 будет самым быстрым, листинг директории - медленная штука (а в модели это уже закешировано)


Название: Re: QTreeView + QFileSystemModel - скрыть стрелку пустых папок
Отправлено: Serega от Апрель 07, 2015, 04:55
Тогда hasChildren вызывается только для директорий и можно на isDir не проверять.

У файлов гарантированно rowCount == 0.
ЗЫ: решение с rowCount > 2 будет самым быстрым, листинг директории - медленная штука (а в модели это уже закешировано)
Подобные варианты были испытаны еще до того как пришлось спросить здесь. При любых обстоятельствах не рисует дерево со стрелками. При запуске программы стрелки отсутствуют вообще и к внутренней структуре папки не доступиться. Наверное кеш строится по мере открытия папок.
На сколько помню проверка показала, что этот метод считает точное колличество элементов в папке без точек. Однако только после того как папка была расскрыта. Поэтому здесь http://www.prog.org.ru/topic_28658_0.html пришлось проверять на существование каталог после его удаения и таким способом выходить из положения. Причем как то странно работает, казалось бы зачем воообще считать колличество строк в таком случае? Но без такой проверки работать отказывалось. Не пустая папка как и положенно не удаляется, но не удалялась как не пустая и rowCount тут не причем поскольку qDebug() показывает что этот мето не считает количество детей если она ни разу не открывалась. И соответственно соответствующее окно предупреждения для пользователя я не мог вывести. К тому же после такой проверки эту папку не возможно было удалить из представления даже если я удаляю все ее содержимое.