44 / 44 / 24
Регистрация: 01.05.2012
Сообщений: 178
1

TreeView и QAbstractItemModel

13.04.2016, 12:55. Показов 2418. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте форумчане. Можете помочь создать свою модель для следующего xml-файла (программу для генерации xml-файла я написал):
XML
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
<root>
 <element name="name1">
  <element name="name11">
   <element name="name111"/>
   <element name="name111"/>
   <element name="name111"/>
   <element name="name111"/>
   <element name="name111"/>
  </element>
  <element name="name12">
   <element name="name122"/>
   <element name="name122"/>
   <element name="name122"/>
   <element name="name122"/>
   <element name="name122"/>
  </element>
  <element name="name13">
   <element name="name133"/>
   <element name="name133"/>
   <element name="name133"/>
   <element name="name133"/>
   <element name="name133"/>
  </element>
 </element>
</root>
Взял пример из документации QT, навыдовало кучу ошибок, и я не увидел в каком там месте есть момент подгрузки xml-файла, чтобы потом строить древовидную структуру.

Через AbstractItemModel более-менее работает. Но в задании к лабораторной работе написано так:

Разработать программу, позволяющую просматривать древовидную структуру сгенерированного xml-файла. Для отображения древовидной структуры использовать компонент QTreeView. Соответственно необходимо написать свою модель, унаследованную от QAbstractItemModel.
Помогите пожалуйста, мне сдавать завтра. А я протарахтел уже 3 дня так ничего написать не смог.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.04.2016, 12:55
Ответы с готовыми решениями:

Музыкальная коллекция. taglib treeview QAbstractItemModel
Добрый день! Нашел в сети такой вот редактор тегов - http://code.google.com/p/qtagger/ Десять...

QSortFilterProxyModel + QAbstractItemModel + treeview qml
реализовал свою древовидную модель. потом для сортировки создал класс от QSortFilterProxyModel....

QItemSelectionModel и указатель на QAbstractItemModel
Добрый вечер уважаемые программисты. На официальном сайте Qt, имеется пример, редактируемой...

QAbstractItemModel checkbox disabled
Всем трям. Использую QAbstractItemModel c QTableView. Хочу сделать колонку с checkbox-ами. ...

6
487 / 365 / 93
Регистрация: 10.03.2011
Сообщений: 1,513
Записей в блоге: 5
13.04.2016, 13:37 2
http://doc.qt.io/qt-5/qtwidget... ample.html
0
44 / 44 / 24
Регистрация: 01.05.2012
Сообщений: 178
13.04.2016, 13:49  [ТС] 3
icpu, вот по нему и пытался сделать, но там в примере нету момента как подгрузить xml-файл.

Добавлено через 9 минут
или всё же использовать QStandartItemModel? Просто препод у нас такой, ничего толком не объясняет, и заставляет писать такие финтифлюшки.
0
487 / 365 / 93
Регистрация: 10.03.2011
Сообщений: 1,513
Записей в блоге: 5
13.04.2016, 13:58 4
http://doc.qt.io/qt-5/QXmlStreamReader.html
http://doc.qt.io/qt-4.8/qt-xml... ample.html

Добавлено через 8 минут
А, вообще, стоило спросить вчера, а не сегодня.
0
44 / 44 / 24
Регистрация: 01.05.2012
Сообщений: 178
13.04.2016, 14:32  [ТС] 5
icpu, можете посмотреть, что у меня может быть не так с циклами

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
#include "mainwindow.h"
#include "ui_mainwindow.h"
 
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
 
    //создать модель
    Filename = "D:/tree.xml";
 
    model = new QStandardItemModel(0,1,this);
 
    readFile();
 
    ui->treeView->setModel(model);
}
 
MainWindow::~MainWindow()
{
    delete ui;
}
 
void MainWindow::readFile()
{
    QStandardItem *root = new QStandardItem("root");
 
    model->appendRow(root);
 
    QDomDocument document;
 
    QFile file(Filename);
 
    if (file.open(QIODevice::ReadOnly))
    {
        document.setContent(&file);
 
        file.close();
    }
 
    QDomElement xmlroot = document.firstChildElement();
 
    QDomNodeList elem1 = xmlroot.elementsByTagName("element");
 
    for (int i=0; i < elem1.count(); i++)
        {
            QDomElement name1 = elem1.at(i).toElement();
 
            QStandardItem *elem2 = new QStandardItem(name1.attribute("name"));
 
           QDomNodeList elem3 = xmlroot.elementsByTagName("element");
 
           for (int j=0; j < elem3.count(); j++)
            {
               QDomElement name2 = elem3.at(j).toElement();
 
               QStandardItem *lem2 = new QStandardItem(name2.attribute("name"));
 
               QDomNodeList elem4 = xmlroot.elementsByTagName("element");
 
               for (int z=0; z < elem4.count(); z++)
               {
                   QDomElement name3 = elem4.at(z).toElement();
 
                   QStandardItem *lem3 = new QStandardItem(name3.attribute("name"));
 
                   lem2->appendRow(lem3);
               }
 
               elem2->appendRow(lem2);
            }
 
            root->appendRow(elem2);
        }
   // root->appendRow(elem2);
}
у меня не получается вывести вот так:

root
-----name1
--------name11
--------name111
....
--------name12
--------...
Миниатюры
TreeView и QAbstractItemModel  
0
44 / 44 / 24
Регистрация: 01.05.2012
Сообщений: 178
13.04.2016, 14:34  [ТС] 6
Сделал через StandartItemModel.

Добавлено через 1 минуту
pushbutton ничего не делает. не помню зачем его прилепил.
0
487 / 365 / 93
Регистрация: 10.03.2011
Сообщений: 1,513
Записей в блоге: 5
14.04.2016, 07:41 7
Во-первых, ошибка обхода. Вы ищите элементы, хотя должны просто идти вдоль, опускаясь на уровень выше при вхождении в группу, и возвращаясь вверх при выходе из неё.
Во-вторых, ошибка добавления элементов в дерево. Вы всё добавляете в столбик. А нужно в дерево.
Если грубо:
C++ (Qt)
1
2
3
4
5
6
7
8
9
QStandardItem * current = model.rootElement();
QXmlStreamReader::TokenType type
while (type = xmlStream.readNext() && !xmlStream.atEnd())
{
  if (type == StartElement)
    current = (new QStandardItem(xmlStream.name(),current).
  if (type == EndElement)
    current = current .parent();
}
Хотя я не пользовался ими напрямую, могу соврать. Ну, и QAbstractItemModel практически ничем не отличается от той, что в примере из Qt, просто добавьте в неё правильный обход и построение элементов.
0
14.04.2016, 07:41
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.04.2016, 07:41
Помогаю со студенческими работами здесь

Освобождение памяти в QAbstractItemModel
Есть в Qt такой класс, как QAbstractItemModel, в котором есть функции index и fetchMore. index надо...

Дерево, классы и QAbstractItemModel
Доброго времени. Есть xml файл с вот такой структурой: Корень --Тэг1 ----Тэг2 ------Тэг5...

Модель QAbstractItemModel: вставка строки
Ищу ответа на свой вопрос. Помогите разобраться: Моя модель ModulesModel унаследована от *модели...

QAbstractItemModel Неправильное выделение итема
Здравствуйте, собрал из шары некое подобие QAbstractItemModel для QTreeViev. Возникла проблема:...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

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