Russian Qt Forum
Ноябрь 22, 2024, 23:06 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QTreeView + QFileSystemModel - скрыть стрелку пустых папок  (Прочитано 8311 раз)
Serega
Самовар
**
Offline Offline

Сообщений: 127


Просмотр профиля
« : Апрель 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;
}
Не дает должного результата.

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

Сообщений: 127


Просмотр профиля
« Ответ #1 : Апрель 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();
}

Работает как часы. Однако хотелось бы спросить на сколько все плохо? Почему приходится итератор пару раз передвигать и почему его вообще надо двигать?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #2 : Апрель 06, 2015, 19:48 »

Это специальные элементы директория "." и ".."
Записан
Serega
Самовар
**
Offline Offline

Сообщений: 127


Просмотр профиля
« Ответ #3 : Апрель 06, 2015, 20:17 »

Да действительно. Спасибо! Сам не догадался проверить Улыбающийся
qDebug() << it.next();
А как само решение? Не слишком грубо и какой вариант предпочесть?
Спрашиваю, поскольку практического опыта не много и не могу оценить решение.
« Последнее редактирование: Апрель 06, 2015, 20:18 от Serega » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #4 : Апрель 06, 2015, 20:30 »

Я бы проверил на isDir, получил из fileInfo объект QDir и смотрел на количество файлов QDir::count.
Записан
Serega
Самовар
**
Offline Offline

Сообщений: 127


Просмотр профиля
« Ответ #5 : Апрель 06, 2015, 20:44 »

Помоему это первое, что пришло в голову испробовать. Однако почему то не прокатило. Пустые папки не оказывались таковыми.
Но попробую повнимательней, возможно какая нибудь мелочь типа "." и ".." не дала результат сразу.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #6 : Апрель 06, 2015, 20:47 »

Помоему это первое, что пришло в голову испробовать. Однако почему то не прокатило. Пустые папки не оказывались таковыми.
Но попробую повнимательней, возможно какая нибудь мелочь типа "." и ".." не дала результат сразу.
Конечно. Папка не пуста, если count > 2.
Записан
Serega
Самовар
**
Offline Offline

Сообщений: 127


Просмотр профиля
« Ответ #7 : Апрель 06, 2015, 20:51 »

Спасибо! Перепроверить уже успел. Действительно парочку так же надо было прибавить.
Записан
Serega
Самовар
**
Offline Offline

Сообщений: 127


Просмотр профиля
« Ответ #8 : Апрель 06, 2015, 20:56 »

Вот так все просто:
Код
C++ (Qt)
bool managerModel::hasChildren( const QModelIndex & parent ) const
{
 return QDir(filePath(parent)).count() > 2;
}
Записан
Serega
Самовар
**
Offline Offline

Сообщений: 127


Просмотр профиля
« Ответ #9 : Апрель 06, 2015, 21:02 »

Проверка на  isDir даст ли прирост в скорости хоть сколько нибудь? Или это будет отказоустойчивее?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #10 : Апрель 06, 2015, 21:05 »

Проверка на  isDir даст ли прирост в скорости хоть сколько нибудь? Или это будет отказоустойчивее?
А сейчас у вас файлам плюсики не рисует? Как будто у них есть дети?
Записан
Serega
Самовар
**
Offline Offline

Сообщений: 127


Просмотр профиля
« Ответ #11 : Апрель 06, 2015, 21:10 »

Все в порядке. У файлов плюсиков (треугольники) нет.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #12 : Апрель 06, 2015, 21:17 »

Все в порядке. У файлов плюсиков (треугольники) нет.
Тогда hasChildren вызывается только для директорий и можно на isDir не проверять.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #13 : Апрель 06, 2015, 23:55 »

Тогда hasChildren вызывается только для директорий и можно на isDir не проверять.

У файлов гарантированно rowCount == 0.
ЗЫ: решение с rowCount > 2 будет самым быстрым, листинг директории - медленная штука (а в модели это уже закешировано)
« Последнее редактирование: Апрель 06, 2015, 23:58 от Авварон » Записан
Serega
Самовар
**
Offline Offline

Сообщений: 127


Просмотр профиля
« Ответ #14 : Апрель 07, 2015, 04:55 »

Тогда hasChildren вызывается только для директорий и можно на isDir не проверять.

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


Страница сгенерирована за 0.18 секунд. Запросов: 22.