С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 28.09.2023
Сообщений: 7
1

Формирование дерева из файла

18.12.2023, 16:09. Показов 1033. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте! Необходимо прочитать текстовый файл и на его основе сделать дерево TreeWidget. Перечитал доступную мне информацию по классу QTreeWidget, прочитал про QTextStream, но всё равно не могу понять каким способом решить задачу. В Qt новичок. Файл имеет вот такой вид:

#Факультет 1#
-Кафедра 1-
$ФИО студента$
$ФИО студента$
$ФИО студента$
-Кафедра 2-
$ФИО студента$
$ФИО студента$
$ФИО студента$
-Кафедра 3-
$ФИО студента$
$ФИО студента$
$ФИО студента$
#Факультет 2#
-Кафедра 1-
$ФИО студента$
$ФИО студента$
$ФИО студента$
-Кафедра 2-
$ФИО студента$
$ФИО студента$
$ФИО студента$
-Кафедра 3-
$ФИО студента$
$ФИО студента$
$ФИО студента$
#Факультет 3#
-Кафедра 1-
-Кафедра 2-
-Кафедра 3-

Не могу понять, как считать данные между символами и передать их в модель. Именно в такой иерархии. Ну или хотя бы какие-нибудь массивы сформировать, как дальше в модель подать может соображу. Буду очень признателен за помощь!

П.с. не получилось тут отступы (табуляция) сделать, нагляднее было бы.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.12.2023, 16:09
Ответы с готовыми решениями:

Формирование дерева TreeView по данным из текстового файла
Подскажите пожалуйста, есть текстовый файл "menu.txt" котрый можно редактирорвать вручную в виду...

Формирование единого файла, содержащего структуру указанных каталогов в виде дерева подкаталогов и файлов
Может кто-то сделать это в диалоговом режиме "Формирование единого файла, содержащего структуру...

Рекурсия: формирование дерева категорий
Задача сформировать дерево категорий. Не могу додуматься, как создать рекурсию данного кода: ...

Задача на формирование двоичного дерева
В общем есть код программы, который отслеживает правильность открывающих и закрывающих скобок. ...

Формирование дерева treeview из БД access
Добрый вечер, форумчане !) Бьюсь с одной проблемой и никак не решу.. Мне необходимо построить...

9
489 / 382 / 74
Регистрация: 29.05.2018
Сообщений: 1,178
18.12.2023, 16:24 2
Посмотрите в примерах Qt Creator-а Simple Tree Model Example (или на сайте https://doc.qt.io/qt-6/qtwidge... ample.html).
0
0 / 0 / 0
Регистрация: 28.09.2023
Сообщений: 7
18.12.2023, 16:40  [ТС] 3
Цитата Сообщение от Ender Che Посмотреть сообщение
Посмотрите в примерах Qt Creator-а Simple Tree Model Example (или на сайте https://doc.qt.io/qt-6/qtwidge... ample.html).
Как раз с моделью и представлением думаю, что смогу справится, в том числе благодаря таким примерам. А вот как считать данные из файла и, учитывая специальные знаки, правильно расфасовать данные не понимаю.
0
1081 / 685 / 184
Регистрация: 30.03.2021
Сообщений: 2,138
18.12.2023, 17:17 4
ну хотя бы вывести попробуй
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
        QFile file("путь к файлу");
        if(!file.open(QFile::ReadOnly))qDebug()<<"error";
        QString str=file.readAll();
        QStringList lst=str.split("\n");
        for(const auto& word : lst){
            if(word.startsWith("$") && word.endsWith("$"))
                qDebug()<<"фио"<<word.simplified();
            else if(word.startsWith("#") && word.endsWith("#"))
                qDebug()<<"факультет"<<word.simplified();
            else 
                qDebug()<<"кафедра"<<word.simplified();
        }
Добавлено через 7 минут
подправил чуток
0
489 / 382 / 74
Регистрация: 29.05.2018
Сообщений: 1,178
18.12.2023, 19:44 5
Цитата Сообщение от Smith716 Посмотреть сообщение
А вот как считать данные из файла и, учитывая специальные знаки, правильно расфасовать данные не понимаю.
Так вы найдите пример в Qt Creator-e по ключевым словам, откройте его и разбирайтесь, как всё там устроено.
0
0 / 0 / 0
Регистрация: 28.09.2023
Сообщений: 7
19.12.2023, 11:20  [ТС] 6
Цитата Сообщение от sdf45 Посмотреть сообщение
word.startsWith("$") && word.endsWith("$")
Не работает такая конструкция, сразу в else проваливается.

Добавлено через 1 минуту
Со всем разобрался, вроде. Кроме того, как вытаскивать слово между определёнными символами. Я правильно понимаю, что это проще всего сделать с помощью QRegExp? Если так, не могли бы подсказать, как может выглядеть такая конструкция?
0
7803 / 6567 / 2988
Регистрация: 14.04.2014
Сообщений: 28,706
19.12.2023, 11:24 7
C++ (Qt)
1
word.mid(1, word.size() - 2)
1
1081 / 685 / 184
Регистрация: 30.03.2021
Сообщений: 2,138
19.12.2023, 15:24 8
Цитата Сообщение от Smith716 Посмотреть сообщение
как вытаскивать слово между определёнными символами
Вариантов множество-смотри класс QString (добавил в код вариант nmcf)
QRegExp можно, но не проще. Думаю, лучше разобраться пока с этим.
А вообще, для таких вещей есть более продвинутые штуки - QSettings, JSON, XML (QSettings- очень легкий в использовании)

Заполнение QTreeWidget:
Кликните здесь для просмотра всего текста

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
#include <QTreeWidget>
#include <QVBoxLayout>
#include <QFile>
#include <QDebug>
 
class W : public QWidget
{
private:
    QTreeWidget *tree;
 
public:
    W(QWidget *parent=nullptr):QWidget(parent){
        tree=new QTreeWidget;
        tree->setColumnCount(3);
        tree->setHeaderLabels({"Факультет", "Кафедра", "Ф.И.О."});
        tree->setSizeAdjustPolicy(QAbstractScrollArea::AdjustToContents);
 
        auto layout=new QVBoxLayout;
        setLayout(layout);
        layout->addWidget(tree);
 
        QFile file("путь к файлу");
        if(!file.open(QFile::ReadOnly))
            qDebug()<<"error";
 
        QString str=file.readAll();
        file.close();
        QStringList lst=str.split("\n");
 
        QTreeWidgetItem *root=tree->invisibleRootItem();
        QTreeWidgetItem *faculty=nullptr, *department=nullptr;
 
        for(auto& word : lst){
            word=word.simplified();
            QString tag=word.first(1);
            if(tag != word.last(1))
                continue;
            word=word.mid(1, word.size() - 2);
            //еще варианты
            //word.remove(tag);
            //word=word.section(tag,1,-2);
 
            if(tag=="#" && root)
                faculty=new QTreeWidgetItem(root, {word});//добавить факультет
            else if(tag=="-" && faculty)
                department=new QTreeWidgetItem(faculty, {"", word});//кафедру
            else if(tag=="$" && department)
                new QTreeWidgetItem(department, {"", "", word});//фио
        }
    }
};
0
1552 / 727 / 316
Регистрация: 02.05.2020
Сообщений: 1,617
19.12.2023, 23:15 9
Лучший ответ Сообщение было отмечено nikulin_artyom1 как решение

Решение

Цитата Сообщение от sdf45 Посмотреть сообщение
Заполнение QTreeWidget
поигрался с регулярками, както оно компактнее не стало:
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#include <QApplication>
#include <QWidget>
#include <QTreeWidget>
#include <QVBoxLayout>
 
class Window: public QWidget
{
  QTreeWidget* treeWidget;
public:
  Window(): QWidget()
  {
    treeWidget = new QTreeWidget;
    treeWidget->setColumnCount(3);
    treeWidget->setHeaderLabels({"Факультет", "Кафедра", "Ф.И.О."});
    treeWidget->setSizeAdjustPolicy(QAbstractScrollArea::AdjustToContents);
    auto layout=new QVBoxLayout;
    setLayout(layout);
    layout->addWidget(treeWidget);
    QString tree = //ну- текст из файла сможете прочитать, надеюсь :)
      "#Факультет 1#\n"
      "-Кафедра 1-\n"
      "$ФИО студента$\n"
      "$ФИО студента$\n"
      "$ФИО студента$\n"
      "-Кафедра 2-\n"
      "$ФИО студента$\n"
      "$ФИО студента$\n"
      "$ФИО студента$\n"
      "-Кафедра 3-\n"
      "$ФИО студента$\n"
      "$ФИО студента$\n"
      "$ФИО студента$\n"
      "#Факультет 2#\n"
      "-Кафедра 1-\n"
      "$ФИО студента$\n"
      "$ФИО студента$\n"
      "$ФИО студента$\n"
      "-Кафедра 2-\n"
      "$ФИО студента$\n"
      "$ФИО студента$\n"
      "$ФИО студента$\n"
      "-Кафедра 3-\n"
      "$ФИО студента$\n"
      "$ФИО студента$\n"
      "$ФИО студента$\n"
      "#Факультет 3#\n"
      "-Кафедра 1-\n"
      "-Кафедра 2-\n"
      "-Кафедра 3-";
    QRegularExpression r1("#([^#]*)#[^#]*");
    QRegularExpression r2("-([^-]*)-[^-]*");
    QRegularExpression r3("\\$([^\\$]*)\\$");
    QTreeWidgetItem* root = treeWidget->invisibleRootItem();
    auto i1 = r1.globalMatch(tree);
    while (i1.hasNext()) {
      auto m1 = i1.next();
      auto faculty = m1.captured(0);
      auto facultyItem = new QTreeWidgetItem(root);//добавить факультет
      facultyItem->setText(0, m1.captured(1));
      auto i2 = r2.globalMatch(faculty);
      while (i2.hasNext()) {
        auto m2 = i2.next();
        auto department = m2.captured(0);
        auto departmentItem = new QTreeWidgetItem(facultyItem);//кафедру
        departmentItem->setText(1, m2.captured(1));
        auto i3 = r3.globalMatch(department);
        while (i3.hasNext()) {
          auto m3 = i3.next();
          auto studentItem = new QTreeWidgetItem(departmentItem);//фио
          studentItem->setText(2, m3.captured(1));
        }
      }
    }
  }
};
 
int main(int argc, char** argv)
{
  QApplication app(argc, argv);
  Window window;
  window.show();
  return app.exec();
}
3
1081 / 685 / 184
Регистрация: 30.03.2021
Сообщений: 2,138
19.12.2023, 23:24 10
kapbepucm,
0
19.12.2023, 23:24
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.12.2023, 23:24
Помогаю со студенческими работами здесь

Формирование дерева TreeView по ключам БД
привет, у меня есть таблица Categories, в которой 3 поля:| Id | Name | CategoryId |. В поле Name -...

Автоматическое формирование структуры дерева в Acces
Всем Привет! Ребята помоги в такой теме: я хочу создать в Acces древовидную структуру в которой...

Формирование бинарного дерева из списка имен.
Написать правило, формирующее бинарное дерево из списка имен с обозначением номера узла дерева, в...

Формирование бинарного дерева по скобочной записи
Я думаю тема не раз поднималась, но толкового ничего не нарыл. Суть задачи такова: на вход...

Формирование бинарного дерева и нахождение его высоты
Не знаю правильно ли работает программа. Вроде бы что-то не то с вводом дерева. Посмотрите плиз,...

Рекурсивный обход реестра и формирование дерева Treeview
Недавно видел код на обход реестра и добавления его в TreeView. Проблема в том, что просматривается...


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

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