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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: модель представление для QTreeView  (Прочитано 8744 раз)
sektor
Самовар
**
Offline Offline

Сообщений: 100


Просмотр профиля
« : Январь 31, 2016, 00:07 »

Разбираюсь с моделью QStandartItemModel. Хочу создать древовидную иерархию TreeView, создал виджет с тремя кнопками, добавить родителья, добавить наследника, и удалить отмеченный item.  Все получается кроме удаления. Помогите реализовать удаление itema.
Код:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QStandardItemModel>
#include <QDebug>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

    QStandardItemModel* model;
    QList <QStandardItem*> item;
    QList <QStandardItem*> childItem;

private slots:
    void on_pushButton_clicked();

    void on_pushButton_2_clicked();

    void on_pushButton_3_clicked();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

Код:
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    model = new QStandardItemModel(this);
    ui->treeView->setModel(model);
}

MainWindow::~MainWindow()
{
    delete ui;
}
//--------добавить родителя
void MainWindow::on_pushButton_clicked()
{

   item.append(new QStandardItem ("animals"));
    model->appendRow(item.last());
}

//-------добавить наследника
void MainWindow::on_pushButton_2_clicked()
{
    childItem.append(new QStandardItem("dog"));
    QModelIndex index = ui->treeView->selectionModel()->currentIndex();
    item[index.row()]->appendRow(childItem.last());

}

//--------удалить итем
void MainWindow::on_pushButton_3_clicked()
{
    QModelIndex index = ui->treeView->selectionModel()->currentIndex();
    model-> removeRow(index.row(),index);
    qDebug() << index;
}

« Последнее редактирование: Январь 31, 2016, 00:09 от gasan_333 » Записан
kai666_73
Крякер
****
Offline Offline

Сообщений: 319


Просмотр профиля
« Ответ #1 : Январь 31, 2016, 00:42 »

Может так:
Код:
model->removeRows(index.row(), 1, index.parent());

я вообще метода removeRow в упор не вижу
Записан
sektor
Самовар
**
Offline Offline

Сообщений: 100


Просмотр профиля
« Ответ #2 : Январь 31, 2016, 00:53 »

Спасибо  Улыбающийся получилось, запарился.
Записан
sektor
Самовар
**
Offline Offline

Сообщений: 100


Просмотр профиля
« Ответ #3 : Январь 31, 2016, 15:28 »

Не подскажете как лучше все итемы хранить.  ? Чтобы, можно было все это сериализовать с помощью QSettings. Как можно зная наследник узнать родителя Непонимающий
Записан
kai666_73
Крякер
****
Offline Offline

Сообщений: 319


Просмотр профиля
« Ответ #4 : Январь 31, 2016, 23:23 »

Не подскажете как лучше все итемы хранить.  ? Чтобы, можно было все это сериализовать с помощью QSettings. Как можно зная наследник узнать родителя Непонимающий
Про сериализацию древовидной структуры: я бы читал/писал xml
Про родителя вопрос не совсем понял, имеется ввиду по индексу определить? Тогда
Код:
QModelIndex::internalPointer()
в помощь.

А вообще ассистант - лучший помошник.
Записан
sektor
Самовар
**
Offline Offline

Сообщений: 100


Просмотр профиля
« Ответ #5 : Февраль 01, 2016, 15:31 »

С этим разобрался. Для сериализации я смотрел примеры с сохронением в XML , для моего случая все таки я думаю QSetting лучше.  Столкнулся с проблемой записи итемов в файл.
Код:
void MainWindow::saveState(void)
{
    QSettings settings("TreeView", "settings_l");
    settings.beginGroup("MainWindow");

    for(int i=0; model->index(i,0).row()>-1; i++){
        QModelIndex index = model->index(i,0);     
        settings.setValue(QString::number(i), index);
            for(int ii=0; index.child(ii,0).row()>-1; ii++){
                QModelIndex indexChild = index.child(ii,0);
                settings.setValue(QString::number(i)+QString::number(ii), indexChild);
            }

    }
    settings.endGroup();
}

Проект компилируется, но при сохранении настроек выдает ошибки:
QVariant::load: unable to load type 42.
QVariant::save: unable to save type 'QModelIndex' (type id: 42).
Чтобы это означало ??
Записан
VPS
Гость
« Ответ #6 : Февраль 01, 2016, 15:49 »

Из документации:

Note: Model indexes should be used immediately and then discarded. You should not rely on indexes to remain valid after calling model functions that change the structure of the model or delete items. If you need to keep a model index over time use a QPersistentModelIndex.
« Последнее редактирование: Февраль 01, 2016, 16:08 от vps » Записан
sektor
Самовар
**
Offline Offline

Сообщений: 100


Просмотр профиля
« Ответ #7 : Февраль 01, 2016, 16:07 »

Че-то не получается.   Непонимающий

Код:
void MainWindow::saveState(void)
{
    QSettings settings("TreeView", "settings_l");
    settings.beginGroup("MainWindow");

    for(int i=0; model->index(i,0).row()>-1; i++){
        QPersistentModelIndex index = model->index(i,0);
        settings.setValue(QString::number(i), index);

            //for(int ii=0; index.child(ii,0).row()>-1; ii++){
             //   settings.setValue(QString::number(i)+QString::number(ii), index.child(ii,0));
           // }

    }
    settings.endGroup();
}

QVariant::load: unable to load type 50.
QVariant::save: unable to save type 'QPersistentModelIndex' (type id: 50).

Версия у меня Qt 5.5
« Последнее редактирование: Февраль 01, 2016, 16:08 от gasan_333 » Записан
VPS
Гость
« Ответ #8 : Февраль 01, 2016, 16:25 »

Возможно у Вас такая же проблема, как здесь.
Записан
sektor
Самовар
**
Offline Offline

Сообщений: 100


Просмотр профиля
« Ответ #9 : Февраль 01, 2016, 16:44 »

Цитировать
Возможно у Вас такая же проблема, как здесь.

Да... читал я это. У него проблемы передачи структуры.
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #10 : Февраль 01, 2016, 17:16 »

Я не пойму, для чего использовать формат ini для сохранения дерева?
возьмите xml или json -- намного больше они подходят для сохранения структур данных любой вложенности
Записан

sektor
Самовар
**
Offline Offline

Сообщений: 100


Просмотр профиля
« Ответ #11 : Февраль 02, 2016, 09:46 »

Позволяет ли XML сохранять мета объекты к примеру QItemModel ? Если есть примеры можете привести ?
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #12 : Февраль 02, 2016, 11:46 »

Позволяет ли XML сохранять мета объекты к примеру QItemModel ? Если есть примеры можете привести ?

XML позволяет сохранить все, что угодно.
Набросал пример: https://github.com/gil9red/SimplePyScripts/tree/master/qt_tree_model_xml
Позволяет создавать дерево любой вложенности и сохранить/восстановить его из xml-файла.
Полностью с использованием Qt, но на питоне -- на нем быстрее писать чем на с++
Синтаксис не особо отличается от плюсов

И я вот не могу понять, а зачем создавать два списка и в них хранить элементы, если этим же занимается модель?
Да и с такими списками возможно только два уровня вложенности дерева сохранить... Можно же на уровне гуи ограничить
уровень вложенности, если в этом была задумка...
« Последнее редактирование: Февраль 02, 2016, 11:49 от gil9red » Записан

sektor
Самовар
**
Offline Offline

Сообщений: 100


Просмотр профиля
« Ответ #13 : Февраль 02, 2016, 13:33 »

Цитировать
И я вот не могу понять, а зачем создавать два списка и в них хранить элементы, если этим же занимается модель?
Я просто читаю учусь и это старый вариант был. Сейчас я все исправил  Улыбающийся

Спасибо большое за пример.
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #14 : Февраль 02, 2016, 13:41 »

Цитировать
И я вот не могу понять, а зачем создавать два списка и в них хранить элементы, если этим же занимается модель?
Я просто читаю учусь и это старый вариант был. Сейчас я все исправил  Улыбающийся

Спасибо большое за пример.

Да на здоровье Улыбающийся
Записан

Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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