Russian Qt Forum

Qt => Вопросы новичков => Тема начата: sektor от Январь 31, 2016, 00:07



Название: модель представление для QTreeView
Отправлено: sektor от Январь 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;
}



Название: Re: модель представление для QTreeView
Отправлено: kai666_73 от Январь 31, 2016, 00:42
Может так:
Код:
model->removeRows(index.row(), 1, index.parent());

я вообще метода removeRow в упор не вижу


Название: Re: модель представление для QTreeView
Отправлено: sektor от Январь 31, 2016, 00:53
Спасибо  :) получилось, запарился.


Название: Re: модель представление для QTreeView
Отправлено: sektor от Январь 31, 2016, 15:28
Не подскажете как лучше все итемы хранить.  ? Чтобы, можно было все это сериализовать с помощью QSettings. Как можно зная наследник узнать родителя ???


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

А вообще ассистант - лучший помошник.


Название: Re: модель представление для QTreeView
Отправлено: sektor от Февраль 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).
Чтобы это означало ??


Название: Re: модель представление для QTreeView
Отправлено: VPS от Февраль 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.


Название: Re: модель представление для QTreeView
Отправлено: sektor от Февраль 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


Название: Re: модель представление для QTreeView
Отправлено: VPS от Февраль 01, 2016, 16:25
Возможно у Вас такая же проблема, как здесь (http://www.forum.crossplatform.ru/index.php?showtopic=981&view=findpost&p=38417).


Название: Re: модель представление для QTreeView
Отправлено: sektor от Февраль 01, 2016, 16:44
Цитировать
Возможно у Вас такая же проблема, как здесь.

Да... читал я это. У него проблемы передачи структуры.


Название: Re: модель представление для QTreeView
Отправлено: gil9red от Февраль 01, 2016, 17:16
Я не пойму, для чего использовать формат ini для сохранения дерева?
возьмите xml или json -- намного больше они подходят для сохранения структур данных любой вложенности


Название: Re: модель представление для QTreeView
Отправлено: sektor от Февраль 02, 2016, 09:46
Позволяет ли XML сохранять мета объекты к примеру QItemModel ? Если есть примеры можете привести ?


Название: Re: модель представление для QTreeView
Отправлено: gil9red от Февраль 02, 2016, 11:46
Позволяет ли XML сохранять мета объекты к примеру QItemModel ? Если есть примеры можете привести ?

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

И я вот не могу понять, а зачем создавать два списка и в них хранить элементы, если этим же занимается модель?
Да и с такими списками возможно только два уровня вложенности дерева сохранить... Можно же на уровне гуи ограничить
уровень вложенности, если в этом была задумка...


Название: Re: модель представление для QTreeView
Отправлено: sektor от Февраль 02, 2016, 13:33
Цитировать
И я вот не могу понять, а зачем создавать два списка и в них хранить элементы, если этим же занимается модель?
Я просто читаю учусь и это старый вариант был. Сейчас я все исправил  :)

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


Название: Re: модель представление для QTreeView
Отправлено: gil9red от Февраль 02, 2016, 13:41
Цитировать
И я вот не могу понять, а зачем создавать два списка и в них хранить элементы, если этим же занимается модель?
Я просто читаю учусь и это старый вариант был. Сейчас я все исправил  :)

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

Да на здоровье :)