Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/15: Рейтинг темы: голосов - 15, средняя оценка - 4.60
8 / 8 / 1
Регистрация: 21.12.2008
Сообщений: 36
1

QFileSystemModel + QTreeView, не удаётся получить доступ начиная со второго уровня вложенности

02.04.2013, 16:19. Показов 3038. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Создаю модель QFileSystemModel, назначаю её на QTreeView.

Пример на скриншоте:

Хочу получить имена файлов и каталогов. На нулевом уровне всё нормально:
C++ (Qt)
1
2
3
QModelIndex index0;
index0 = ui->treeView_dirTree->rootIndex();
qDebug() << ui->treeView_dirTree->model()->data(index0).toString();
Выведет имя корневой папки, то есть movies.

На первом уровне тоже:
C++ (Qt)
1
2
3
4
QModelIndex index0, index1;
index0 = ui->treeView_dirTree->rootIndex();
index1 = index0.child(0, 0);
qDebug() << ui->treeView_dirTree->model()->data(index1).toString();
Выведет имя каталога !tv series.

Но на втором уже начинается непонятное:
C++ (Qt)
1
2
3
4
5
QModelIndex index0, index1, index2;
index0 = ui->treeView_dirTree->rootIndex();
index1 = index0.child(0, 0);
index2 = index1.child(0, 0);
qDebug() << ui->treeView_dirTree->model()->data(index2).toString();
Не выводит ничего, то есть пустую строку, хотя должен Breaking Bad.

Почему так?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.04.2013, 16:19
Ответы с готовыми решениями:

Сделать страницу второго уровня вложенности
Всем привет ни как не могу найти решение. Есть такая структура, каталог - подкаталог и страница...

QTreeView и QFileSystemModel
у меня есть модель QFileSystemModel для отображения каталога проекта в QTreeView, как можно...

Домен второго уровня, static ip, доступ к сетевым ресурсам
Доброго дня! Собственно, такой вопрос: есть домен второго уровня, например domain.ru, есть белый ip...

Как в запросе получить родителя второго уровня
Добрый день! Есть иерархия групп и элементов. Я через запрос обращаюсь к справочнику и получаю...

12
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
06.04.2013, 04:46 2
Может стоит прежде проверять получаемый индекс на валидность
C++ (Qt)
1
if( index.isValid() ) //...
Если не валиден, то по идее может возвращать пустой QVariant;
0
8 / 8 / 1
Регистрация: 21.12.2008
Сообщений: 36
06.04.2013, 10:00  [ТС] 3
Хорошо, если индексы не валидные, значит я неправильно к ним обращаюсь. Значит, не понял теорию работы с моделью дерева.

Как будет верно обратиться к элементам второй (третьей и так далее) глубины вложенности? То есть, в моём примере это каталог Breaking Bad - как получить его имя?

Добавлено через 11 минут
Я вижу иерархию индексов так (см. приложенную схему). Выходит, она устроена иначе?

Добавлено через 12 минут
Не приложилась схема. Тогда опять на внешнем хостинге: . Зелёным цветом я выделил то, к чему мне удалось обратиться, красным - к чему не удалось.

Добавлено через 6 минут
Простите, не так нарисовал. Вот верная схема: .
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
06.04.2013, 16:58 4
Цитата Сообщение от RetiF Посмотреть сообщение
index2 = index1.child(0, 0);
Если не валидны - значит ты строк и столбец неправильно указал или роль.

Добавлено через 1 минуту
Цитата Сообщение от RetiF Посмотреть сообщение
Я вижу иерархию индексов так (см. приложенную схему). Выходит, она устроена иначе?
Я сам не уверен ... только начал учить Qt и разбираться с моделями...
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
06.04.2013, 17:52 5
Для того что бы посмотреть индексы можно написать такой код вывода в label
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
void MainWindow::on_pushButton_clicked()
{
    ui->treeView->setModel(&model);
    model.setRootPath("/");
}
 
void MainWindow::on_treeView_clicked(const QModelIndex &index)
{
    QString coord= QString::number(index.row())+" "+QString::number(index.column());
    ui->label->setText(coord);
}
QFileSystemModel + QTreeView, не удаётся получить доступ начиная со второго уровня вложенности
0
8 / 8 / 1
Регистрация: 21.12.2008
Сообщений: 36
06.04.2013, 18:16  [ТС] 6
Так это не индексы будут выводиться, а номер строк и столбцов. Вернее, это ещё не весь индекс - не хватает родительского индекса.

То, что у вас в коде, я и так понимаю.
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
06.04.2013, 18:20 7
Так индекс модели - представляет собой строку + колонку + "внутренний" платформозависимый индекс.
0
8 / 8 / 1
Регистрация: 21.12.2008
Сообщений: 36
06.04.2013, 18:23  [ТС] 8
Ну да. А что?
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
06.04.2013, 18:25 9
Цитата Сообщение от RetiF Посмотреть сообщение
Вернее, это ещё не весь индекс - не хватает родительского индекса.
При чем тут родительский индекс?
0
8 / 8 / 1
Регистрация: 21.12.2008
Сообщений: 36
06.04.2013, 18:32  [ТС] 10
Чтобы обратиться к каталогу с вашей картинки .Trash-1000 нужно знать его строку(0), столбец(0) и родительский индекс(индекс элемент Data (D: )).

Добавлено через 3 минуты
Я тем временем неожиданно нашёл решение своей проблемы. Я всё правильно делал с самого начала, но немного не дочитал теорию. Доступ к элементу даётся только если выполнить expand(раскрытие) соответствующей ветки.
1
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
06.04.2013, 18:39 11
Цитата Сообщение от RetiF Посмотреть сообщение
Я тем временем неожиданно нашёл решение своей проблемы. Я всё правильно делал с самого начала, но немного не дочитал теорию. Доступ к элементу даётся только если выполнить expand(раскрытие) соответствующей ветки.
Да действительно, только я не пойму почему так мы ведь обращаемся напрямую к данным ...
Хотя наверное суть во флагах или роли ячейки.
0
8 / 8 / 1
Регистрация: 21.12.2008
Сообщений: 36
06.04.2013, 18:45  [ТС] 12
Вот и я несколько недоумеваю. Хотя, конечно, глядя как он долго экспандит всего лишь до 4 уровня вложенности, я думаю, что дело в производительности.
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
06.04.2013, 19:58 13
Цитата Сообщение от RetiF Посмотреть сообщение
Вот и я несколько недоумеваю. Хотя, конечно, глядя как он долго экспандит всего лишь до 4 уровня вложенности, я думаю, что дело в производительности.
Так вроде производительность изначально лажовая, видел даже в интернете наброски реализации модели на основании boost::filesystem,
которая вроде как словам автора выигрыш дает в 3..4 раза.


Но что касается доступности тут скорее всего поведение заложено в самой модели.
Поэтому возможно нужно наследоваться и переопределять метод data и/или flags

Добавлено через 3 минуты
Подозреваю что там меняется флаг ItemIsEnabled.

Добавлено через 12 минут
Блин я чет не догнал еще такой вариант - доступа нет потому как элементов попросту на этот момент может не быть ибо они появляются только при разворачивании...
Т.е. только при разворачивании выполняется поиск файлов на диске и добавление их как элементов.

Добавлено через 2 минуты
По идее можно проверить это предположение на обычной модели ( не файловой )

Добавлено через 51 минуту
Попробовал пример из книге Шлее "Иерархическая модель" на основе QStandardItemModel,
так вот там есть доступ к не раскрытым элементам.
1
06.04.2013, 19:58
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.04.2013, 19:58
Помогаю со студенческими работами здесь

Превышение уровня вложенности
написал запрос выбрать ИмяРеквизитаОбъектаПотребителя, ВариантПравилаЗаполненияРеквизитов,...

Не удается получить доступ к сайту
Здравствуйте, делаю регистрацию на php, и вот когда заполняю поля и нажимаю зарегистрироваться...

3 уровня вложенности в меню bootstrap
Пытаюсь реализовать 3 уровня вложенности в меню (меню вертикальное) . На сайте...

Определение уровня вложенности подсписка
Помогите пожалуйста написать функцию для CLISP, на вход которой задаётся список вида ( a b ( c d e...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru