Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.64/25: Рейтинг темы: голосов - 25, средняя оценка - 4.64
 Аватар для Andrey_Programm
12 / 12 / 10
Регистрация: 08.04.2016
Сообщений: 206

QTreeWidget - вывод файловой системы

03.11.2016, 11:56. Показов 5831. Ответов 37
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!
Пытаюсь уже пару дней вывести дерево файловой системы в QTreeWidget. Проблема в том что работает нестабильно.
то есть при выборе одних папок всё прекрасно выводится, а при выборе других всегда падает.
особенно при выборе папок с кучей мелких файлов, и тем более при выборе самих дисков С и D.
ничего не пишет. просто зависает.

в MainWIndow.h
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include "file_system.h"
 
class My_MainWindow : public QMainWindow
{
    Q_OBJECT
 
................................
private:
    File_System *directory;
    QAction *actAllDirectory;
 
protected slots:
 
 void slAllDirectory();
 
}
в MainWindow.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
//Конструктор
{
     QAction *A = actAllDirectory = new QAction(this);
     A->setText(tr("All Directory"));
     A->setShortcut(tr("Ctrl+A+D"));
     ActionGroup->addAction(A);//так как будем менять центральный виджет
     connect(A,SIGNAL(triggered(bool)),this,SLOT(slAllDirectory()));
 
 }
 
void My_MainWindow::slAllDirectory()
{
 
    qDebug() << "Слот slAllDirectory сработал";
    QString path = QDir::current().absolutePath();//Прописываем путь по умолчанию
    QString str = QFileDialog::getExistingDirectory(0,tr("Select a Directory"), path);//Получаем путь из Browse
    if(!str.isEmpty()) path = str;//если выбранная строка не пуста, то устанавливаем выбранный путь.
 
 
 
    {//  Стандартная смена центрального виджета
    QWidget *S = centralWidget();
    setCentralWidget(0);
    delete S;
 
    QWidget *W = directory = new File_System(str,this);
    setCentralWidget(W);
    actAllDirectory->setCheckable(true);
    actAllDirectory->setChecked(true);
    }
}
в File_System.h
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#ifndef FILE_SYSTEM_H
#define FILE_SYSTEM_H
#include <QTreeWidget>
#include <QWidget>
 
 
namespace WINDOW {
 
class File_System : public QTreeWidget
{
    Q_OBJECT
 
private:
    QTreeWidgetItem *twgIt;
 
public:
    File_System(const QString &path, QWidget *parent = 0);
    virtual ~File_System();
 
    QTreeWidgetItem* All_Directory(const QString &path, QTreeWidgetItem *itm);
};
 
}
 
#endif // FILE_SYSTEM_H

в File_System.cpp // скорее всего ошибка где то здесь

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include "file_system.h"
#include <QDir>
#include <QFileInfo>
#include <QDebug>
 
namespace WINDOW {
 
File_System::File_System(const QString &path, QWidget *parent ):
    QTreeWidget(parent)
{
    twgIt = new QTreeWidgetItem(this);
    addTopLevelItem(All_Directory(path,twgIt));
    QStringList header;
    header << tr("Directory") << tr("Size");
    setHeaderLabels(header);
 
}
 
 
QTreeWidgetItem* File_System::All_Directory(const QString &path, QTreeWidgetItem *itm)
{
    QDir dir(path);
 
    int check = 1;//счетчик директорий
    foreach (QFileInfo temp, dir.entryInfoList()) {
        if(check > 2)
        {
          qDebug() << "сработал перебор файлов";
            QTreeWidgetItem *itm2 = new QTreeWidgetItem(itm);
            itm2->setText(0,temp.fileName());
            itm->addChild(itm2);
            if(temp.isDir())
                {
                   itm2->setIcon(0,QIcon(":/icons/folder"));
                   All_Directory(temp.absoluteFilePath(),itm2);
                }
            else
            {
                itm2->setIcon(0,QIcon(":/icons/File+"));
                {//Метод для вывода размера кбт,Мбт и тд...
                qint64 i=0;
                int sizefile = temp.size();
                for(;sizefile>1023; sizefile /= 1024, ++i){ }
                 itm2->setText(1,QString().setNum(sizefile)+"BKMGT"[i]);//Выводим размер
                }
            }
 
 
        }
        check++;
    }
    return itm;
}
 
File_System::~File_System()
{
 
}
}
Добавлено через 4 минуты
2) и ещё маленький вопросик: как задать ширину столбцов по умолчанию, а то у меня очень узкими открываются
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.11.2016, 11:56
Ответы с готовыми решениями:

Кодировкой адресов файловой системы
в функции int main получаю стартовый адрес к самому себе и если программа находиться в каталоге с русским адресом то получаю вопросительные...

конвертация файловой системы
Пытаюсь изменить файловую систему. Возникает ошибка &quot;Указана не допустимая метка диска&quot;. Что я пробовала сделать: 1) пробовала не...

Мониториг файловой системы
Хотелость бы организовать листинг файловой системы. В плане отслеживания изменений в директориях. Т.е. сделать снимок файловой системы...

37
Эксперт С++
 Аватар для Maxim Prishchepa
1936 / 1048 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
08.11.2016, 11:54
Студворк — интернет-сервис помощи студентам
ну... пробуйте решить эту непосильную проблему :-)
0
 Аватар для Andrey_Programm
12 / 12 / 10
Регистрация: 08.04.2016
Сообщений: 206
08.11.2016, 13:03  [ТС]
Вообще оказалось проще чем я думал. и перебор дерева не нужен былб
Если кому надо:
C++ (Qt)
1
QDesktopServices::openUrl(QUrl::fromLocalFile(item->data(0,Qt::UserRole).toString()));
1
Эксперт С++
 Аватар для Maxim Prishchepa
1936 / 1048 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
08.11.2016, 13:06
ну... если item содержит в себе уже полный путь, а не "часть" - то да... ничего обходить не нужно...

Добавлено через 44 секунды
но вряд-ли это кому-то поможет, т.к. это узкоспецифическая задача, и что вы в UserRole-и храните, зависит только от вас..
1
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
08.11.2016, 13:17
Цитата Сообщение от Andrey_Programm Посмотреть сообщение
Qt::UserRole).toString())
Что ж, если вы храните полный путь в UrerRole (а это не лишено логики, ведь в момент создания узла путь прекрасно известен), то ничего больше и не надо
0
 Аватар для Andrey_Programm
12 / 12 / 10
Регистрация: 08.04.2016
Сообщений: 206
08.11.2016, 15:53  [ТС]
Байт, извините я не оч понимаю это сарказм или правда одобрение? я просто про роли не оч понимаю я хотел сначала использовать Qt::DisplayRole но потом передумал так как это используется для отображения а мне отображение не нужно
0
Эксперт С++
 Аватар для Maxim Prishchepa
1936 / 1048 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
08.11.2016, 15:55
Цитата Сообщение от Andrey_Programm Посмотреть сообщение
извините я не оч понимаю это сарказм или правда одобрение?
чуть более чем: "правда одобрение", UserRole в принципе именно для этого и нужна... другое дело, что вы об этом не сказали, ну или было лень читать
0
 Аватар для Andrey_Programm
12 / 12 / 10
Регистрация: 08.04.2016
Сообщений: 206
08.11.2016, 16:00  [ТС]
Maxim Prishchepa, Maxim Prishchepa, я просто сам не знал как эту задачу решить и что можно хранить данные в самом итеме. поэтому и решил перебирать дерево. а как только просвятился, то вбил просто эти данные в момент создания)
Поймите мои знания пока что очень узкие) и поэтому когда я пишу задачу целиком и способ её решения, если есть более удобный и менее громоздкий способ, то стоит написать мне об этом и предложить его) тогда я либо рассматриваю оба варианта либо вариант предложенный опытным программистом)
0
Эксперт С++
 Аватар для Maxim Prishchepa
1936 / 1048 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
08.11.2016, 16:14
Лучший ответ Сообщение было отмечено Andrey_Programm как решение

Решение

я ж писал выше - выкиньте TreeWidget )) это гораздо более простой и более правильный способ, но вы ж решили дальше его колупать, ну ок подождем еще чучуть, когда проект разрастется до такого состояния, что его невозможно будет сопровождать, потом вспомните меня, поматеритесь, что сразу не сделали, а дальше видно будет... я считаю, каждый должен "пройти свой путь" )
1
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
08.11.2016, 18:28
Цитата Сообщение от Andrey_Programm Посмотреть сообщение
это сарказм или правда одобрение?
Дык. я сам так часто поступаю. Какой же тут сарказм? Что, я сам над собой буду зубоскалить?
А метод data действительно очень мощный и позволяет делать чудеса. По крайней мере частенько он освобождает от необходимости создания своих наследуемых классов ради пары дата-членов.
Для классов, наследуемых от QObject, с тем же результатом можно использовать механизм свойств.

Добавлено через 4 минуты
Цитата Сообщение от Maxim Prishchepa Посмотреть сообщение
каждый должен "пройти свой путь"
Золотые слова! Я, видимо, тоже нахожусь в начале пути, ибо использую Widget до упора, пока уж совсем не приспичит перейти к View. Хотя прекрасно понимаю, что каждый уважающий себя Qt-программер должен предпочитать View. Но я пока в этом смысле уважаю себя недостаточно

Добавлено через 1 минуту
Andrey_Programm, надеюсь, известно, что есть еще UserRole+1 и так далее...
2
Эксперт С++
 Аватар для Maxim Prishchepa
1936 / 1048 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
08.11.2016, 18:31
Цитата Сообщение от Байт Посмотреть сообщение
что каждый уважающий себя Qt-программер должен
ну тут я не совсем согласен, каждый инструментарий сделан для опеределенных задач, мое сугубо субъективное мнение - виджеты для прототипирование и наговнякать, что бы заказчик "зашел", а в продакшен только Model+View
0
 Аватар для Andrey_Programm
12 / 12 / 10
Регистрация: 08.04.2016
Сообщений: 206
08.11.2016, 23:55  [ТС]
Цитата Сообщение от Байт Посмотреть сообщение
Andrey_Programm, надеюсь, известно, что есть еще UserRole+1 и так далее...
нет не очень известно) мне советовали пока так глубоко не копать хотя такие буквы я видел))))
Цитата Сообщение от Байт Посмотреть сообщение
ибо использую Widget до упора,
может тогда подскажете по первому посту в этой теме ?) я до сих пор не понимаю почему в одних папках у меня дерево работает а в других валится....
Цитата Сообщение от Maxim Prishchepa Посмотреть сообщение
я ж писал выше - выкиньте TreeWidget ))
может я его и не буду использовать просто я думаю с прочими "ДЕРЕВЯННЫМИ" виджетами у меня будут такие же проблемы поэтому хотелось бы понять что не так) но обход был явно лишним для получения пути) это напоминает мне как я вначале при использовании контейнеров вручную писал метод сортировки.
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
09.11.2016, 00:20
Цитата Сообщение от Andrey_Programm Посмотреть сообщение
нет не очень известно
В самом деле все очень просто. Некоторые Qt-классы
(в том числе Item) обладают "хранилищами". Хранится там может все, чем может быть QVariant. Элементы хранилища имеют номера (роли). Некоторые номера задействованы самим Кутей и имеют enum-обозначения (DisplayRole, FontRole ...) А начиная с номера UserRole Qt разрешает пользоваться номерами нам. Соответственно, и UserRole+1, +2 ...
При этом, как я понимаю, лишнего объема памяти не занимается. Есть роль - память выделяется. Нету - и памяти не надо.
Примерно таков же механизм добавления собственных свойств в экземпляры классов, наследуемых от QObject.
Возможно, в каких-то деталях я и ошибаюсь, я им свечку не держал, но представляю все это таким образом...

Добавлено через 5 минут
Цитата Сообщение от Andrey_Programm Посмотреть сообщение
может тогда подскажете по первому посту
А тут я, простите, вам помочь не смогу. Я так думаю, какой-то косяк у вас. Такое бывает. Тем более "некоторые" - самая большая неприятность для программиста.
Но может быть дело в пробелах и/или русских буквах в именах папок и файлов? Слышал я, что Кутя их не очень жалует. Правда, не понял, за что. где и почему. Но вы посмотрите ваши "аварийные" папки на этот предмет.
2
 Аватар для Andrey_Programm
12 / 12 / 10
Регистрация: 08.04.2016
Сообщений: 206
11.11.2016, 15:37  [ТС]
Делюсь своей находкой)
Дело в том что в искомых файлах имя файла не должно начинаться с "-,#,(,)" ну остальное я не проверял, тильду вроде бы пропускает. У меня было много файлов скачанных с инета название которых начиналось с минуса или решётки . поэтому при переборе дерево падало и странным образом цикл зацикливался)))
1
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
11.11.2016, 16:07
Andrey_Programm, Имена файлов - одна из бед наших. Я пытался тут выяснить, какие есть в этой области правила и законы, но результат меня не обнадежил. Допустимые имена, а также их преобразование и эквивалентность, зависят не только от ОС (так, для винды "A", "a" - одинаковые имена файлов, для никсов - разные), но и от файловой системы, те. если у тебя на компе один диск FAT32, а другой NTFS, то для них могут разные законы. Лично я стараюсь своим файлам давать латинские 8-буквенные имена с 3-х буквенными расширениями. От греха подальше...
Но у тебя ситуация, конечно, иная, файлы - чужие.
Какие имена файлов считаются различными?
0
693 / 465 / 162
Регистрация: 01.10.2015
Сообщений: 1,274
11.11.2016, 16:16
Andrey_Programm, раз уж ваши изыскания дошли до финальной стадии, так поделитесь результатом, интересно же код посмотреть...
0
 Аватар для Andrey_Programm
12 / 12 / 10
Регистрация: 08.04.2016
Сообщений: 206
11.11.2016, 16:20  [ТС]
Байт, не думал что количество букв в расширении тоже играют значение)
ну ладно) лень так глубоко рыться) главное понятно что именно с именами связано) найти точную политику работы с именами уже второй вопрос )

Добавлено через 2 минуты
0x90h, до финальной нет ) я же говорю что только несколько символов перебрал) перебирать всю клавиатуру лень)
советую начинать имена либо с цифр либо с букв)))
Код приведён выше ) я не делал систему обхода слов с запретными символами. просто в папках переименовал всё чтобы с букв начиналось а не с символов) и терь всё работает
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
11.11.2016, 16:22
Цитата Сообщение от Andrey_Programm Посмотреть сообщение
не думал что количество букв в расширении тоже играют значение
Для ДОС - играют. А специфика моей работы такова, что мне и с досовскими программами приходится иметь дело...
1
693 / 465 / 162
Регистрация: 01.10.2015
Сообщений: 1,274
11.11.2016, 16:30
Цитата Сообщение от Байт Посмотреть сообщение
что мне и с досовскими программами приходится иметь дело...

Не по теме:

На днях общался с одним интересным человеком из Сбера, он утверждает, что в его конторе до сих пор используется (sic!) несколько программно-аппаратных комплексов с DOS'ом на борту, и которые "живее всех живых"... всех устраивают и будут выведены из эксплуатации только по причине "смерти" аппаратной составляющей.

1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.11.2016, 16:30

Разделы файловой системы
Всем привет. У меня ЖД (500gb) разбит на три тома по 155gb. На одном томе стоит винда, на втором хранятся файлы, а вот третий свободный, на...

Тормоз файловой системы
При последнем запуске компа любая программа начала подвисать на 5сек когда записывает/читает файлы (файрфокс, sjboy, тот же проводник при...

События файловой системы
Есть такая задача: реагировать на изменения в указанных файлах. Всё, что я нашёл - это класс WatchService из пакета java.nio.file. С его...

Шаблон файловой системы
В общем, задание такое: Разработать файловую систем, за жёсткий диск принять бинарный файл. Реализовать создание/редактирование/удаление...

Повреждение файловой системы!
Ребята! Срочно! Доживаю последние минуты в Vista! Был в интернете, и из лотка сообщение - диск С повреждён! Все поля чёрные! Сейчас солью...


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

Или воспользуйтесь поиском по форуму:
38
Ответ Создать тему
Новые блоги и статьи
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru