Russian Qt Forum
Мая 02, 2025, 00:13 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: модель представление для QTreeView  (Прочитано 9167 раз)
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.052 секунд. Запросов: 23.