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

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

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: Иерархическая модель  (Прочитано 21716 раз)
KlimichKartorgnusov
Гость
« : Апрель 07, 2016, 11:23 »

Здравствуйте! Изучаю Qt совсем не давно. С табличными и списковыми моделями разобраться проблем не составило, но на счет древовидной модели возник тяжелый для меня вопрос... Все примеры которые я нашел, только окончательно меня запутали.
Проблема следующая. Есть класс "Доставка" который включает в себя свой номер доставки, дату и список поставленных товаров(класс Product).


Код:
class Product 
{
public:
...

private:
QString name_;
double cost_;
int amount_;
}

Код:
class Delivery
{
public:
...

private:
int deliveryNumber_;
QDate deliveryDate_;
QList<Product> deliveredProducts_;
}
   

Нужно построить структуру такого типа:

-Доставка 1. Дата: 01.02.2016
--товар 1 || 500 руб. || 10 шт.
--товар 2 || 400 руб. || 20 шт.
--товар 3 || 300 руб. || 10 шт.
--товар 4 || 200 руб. || 30 шт.
-Доставка 2. Дата: 15.02.2016
--товар 1 || 500 руб. || 10 шт.
--товар 2 || 400 руб. || 20 шт.
--товар 3 || 300 руб. || 10 шт.

Две недели потратил на поиск нужного ответа, которого так и не нашел. Прошу вашей помощи!

DiliveriesModel.h
Код:
#ifndef DILIVERIESMODEL_H
#define DILIVERIESMODEL_H

#include <QAbstractItemModel>
#include "Delivery.h"

class DiliveriesModel : public QAbstractItemModel
{
    Q_OBJECT
public:
    explicit DiliveriesModel(QObject *parent = 0);

    QModelIndex index(int row, int column, const QModelIndex &parent) const;
    QModelIndex parent(const QModelIndex &child) const;
    int rowCount(const QModelIndex &parent) const;
    int columnCount(const QModelIndex &parent) const;
    QVariant data(const QModelIndex &index, int role) const;

private:
    QList<Delivery> deliveries_;
};

#endif // DILIVERIESMODEL_H

DiliveriesModel.cpp
Код:
#include "DiliveriesModel.h"

DiliveriesModel::DiliveriesModel(QObject *parent) : QAbstractItemModel(parent)
{

}

QModelIndex DiliveriesModel::index(int row, int column, const QModelIndex &parent) const
{
    if(!hasIndex(row, column, parent)) {
        return QModelIndex();
    }

    //Завернуть данные Delivery в QModelIndex() и вернуть???
}

QModelIndex DiliveriesModel::parent(const QModelIndex &child) const
{
    if (!index.isValid()) {
        return QModelIndex();
    }

    //А тут ???
}

int DiliveriesModel::rowCount(const QModelIndex &parent) const
{
    if(parent == QModelIndex()) { // rootIndex
        return deliveries_.count();
    }

    //Если индекс валидный, то получается он != rootIndex и соответсвует QList<Product> ???
    //Какой то бред.
    if(parent.isValid()) {
        return deliveries_.at(parent.column()).deliveredProducts().count();
    }
}

int DiliveriesModel::columnCount(const QModelIndex &parent) const
{
    Q_UNUSED ( parent )
    return 3;
}

QVariant DiliveriesModel::data(const QModelIndex &index, int role) const
{
    //Не понимаю как тут будут обстоять дела
}

« Последнее редактирование: Апрель 07, 2016, 15:44 от KlimichKartorgnusov » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Апрель 07, 2016, 11:27 »

Ну а почему не "по пути наименьшего сопротивления"? Т.е. QTreeWidget и все дела
Записан
KlimichKartorgnusov
Гость
« Ответ #2 : Апрель 07, 2016, 11:54 »

Ну а почему не "по пути наименьшего сопротивления"? Т.е. QTreeWidget и все дела

Если использовать QTreeWidget, то нужно будет каждый раз строить дерево с нуля, а мне одну модель нужно будет использовать во многих местах.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4746



Просмотр профиля WWW
« Ответ #3 : Апрель 07, 2016, 12:13 »

так а в чем проблема? наследуешься от QAbstractItemModel и определяешь обязательные методы:
Цитировать
When subclassing QAbstractItemModel, at the very least you must implement index(), parent(), rowCount(), columnCount(), and data(). These functions are used in all read-only models, and form the basis of editable models.
например, в rowCount() отдаешь количество для каждого уровня иерархии, т.е. для верхнего уровня — количество Delivery, для следующего — deliveredProducts_.size()
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #4 : Апрель 07, 2016, 12:15 »

QAbstractItemModel + QTreeView подойдёт? Simple Tree Model Example. Гуглить "qabstractitemmodel tree".
Записан

Пока сам не сделаешь...
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Апрель 07, 2016, 12:29 »

Если использовать QTreeWidget, то нужно будет каждый раз строить дерево с нуля, а мне одну модель нужно будет использовать во многих местах.
Использовать или отображать? Если хочется "по всем канонам" - есть QTreeView. Но необязательно делать Вашу структуру данных моделью, можно напр задействовать QTreeWidgetItem::setData/data и/или хранить указатели на QTreeWidgetItem.                                                                        
Записан
KlimichKartorgnusov
Гость
« Ответ #6 : Апрель 07, 2016, 12:43 »

так а в чем проблема? наследуешься от QAbstractItemModel и определяешь обязательные методы:
Цитировать
When subclassing QAbstractItemModel, at the very least you must implement index(), parent(), rowCount(), columnCount(), and data(). These functions are used in all read-only models, and form the basis of editable models.
например, в rowCount() отдаешь количество для каждого уровня иерархии, т.е. для верхнего уровня — количество Delivery, для следующего — deliveredProducts_.size()

Проблема в том что я не понимаю как реализовать index() и parent(). Не понятно какого родителя будет возвращать parent(), как бы все данные уже есть в листе дерева и из родителей остается только верхушка - пустой root index. index() должен создавать валидный QModelIndex() и возвращать его. Опять же не понимаю как образом это будет происходить в моем случае, как мне добираться до данных о Product.

В примерах видно что лист дерева содержит информацию о своем родителе, свои данные и информацию о своих дочерних листах. У меня же все в одном классе Delivery.
Записан
KlimichKartorgnusov
Гость
« Ответ #7 : Апрель 07, 2016, 12:45 »

Если использовать QTreeWidget, то нужно будет каждый раз строить дерево с нуля, а мне одну модель нужно будет использовать во многих местах.
Использовать или отображать? Если хочется "по всем канонам" - есть QTreeView. Но необязательно делать Вашу структуру данных моделью, можно напр задействовать QTreeWidgetItem::setData/data и/или хранить указатели на QTreeWidgetItem.                                                                        

Для этого созданы Q(Tree\Table\List)Widget. Q(Tree\Table\List)View разве можно использовать без модели?
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #8 : Апрель 07, 2016, 14:28 »

Если использовать QTreeWidget, то нужно будет каждый раз строить дерево с нуля, а мне одну модель нужно будет использовать во многих местах.
Почему тогда не использовать QStandardItemModel?
Записан

Qt 5.11/4.8.7 (X11/Win)
KlimichKartorgnusov
Гость
« Ответ #9 : Апрель 07, 2016, 14:43 »

Если использовать QTreeWidget, то нужно будет каждый раз строить дерево с нуля, а мне одну модель нужно будет использовать во многих местах.
Почему тогда не использовать QStandardItemModel?

Мне для задания нужно разобраться c QAbstract(Table/List/Item)Model. С первыми двумя разобрался в легкую, а как организовать дерево, я не понимаю. Не понимаю как будет работать data(), rowCount() и прочие обязательные для переопределения функции.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #10 : Апрель 07, 2016, 14:47 »

Мне для задания нужно разобраться c QAbstract(Table/List/Item)Model. С первыми двумя разобрался в легкую, а как организовать дерево, я не понимаю. Не понимаю как будет работать data(), rowCount() и прочие обязательные для переопределения функции.
Вы вот это читали?
http://doc.qt.io/qt-5.6/model-view-programming.html

Вроде по картинкам все должно быть понятно.
Записан
KlimichKartorgnusov
Гость
« Ответ #11 : Апрель 07, 2016, 14:55 »

Мне для задания нужно разобраться c QAbstract(Table/List/Item)Model. С первыми двумя разобрался в легкую, а как организовать дерево, я не понимаю. Не понимаю как будет работать data(), rowCount() и прочие обязательные для переопределения функции.
Вы вот это читали?
http://doc.qt.io/qt-5.6/model-view-programming.html

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

Ну да. С табличными и списковыми моделями понял. А с деревом к сожалению нет...
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #12 : Апрель 07, 2016, 14:59 »

Там же ссылка на простой пример
Записан
KlimichKartorgnusov
Гость
« Ответ #13 : Апрель 07, 2016, 15:04 »

Там же ссылка на простой пример

В примере фигурирует TreeItem. Он имеет родителя и дочернее элементы. Я не понимаю как свою структуру в которой все уже уложено применить. Мне нужно по другому организовать узел дерева?
Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #14 : Апрель 07, 2016, 15:07 »

Там же ссылка на простой пример

Для одних это может и простой пример, а для других не очень Улыбающийся.

Мне для задания нужно разобраться c QAbstract(Table/List/Item)Model. С первыми двумя разобрался в легкую, а как организовать дерево, я не понимаю. Не понимаю как будет работать data(), rowCount() и прочие обязательные для переопределения функции.

Если сразу не понятно, то на пальцах тоже может не получится просто объяснить. Тут могут помочь в решении, но в "пустоту" трудно код писать. Рекомендую сделать простой проект, аналогично пример, с вашими структурами данных, и всеми необходимыми методами, которые надо переопределить. Чтобы можно было его взять и туда код вписать. И помогающим будет проще, и помогаемым понятней Улыбающийся.
Записан

Пока сам не сделаешь...
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


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