crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

Rocky
  опции профиля:
сообщение 14.12.2010, 11:42
Сообщение #1


Старейший участник
****

Группа: Участник
Сообщений: 530
Регистрация: 22.12.2008
Из: Санкт-Петербург
Пользователь №: 463

Спасибо сказали: 22 раз(а)




Репутация:   7  


Вроде бы внимательно изучил документацию, примеры simple и edit tree model. Начал сам делать и совсем запутался... Помогите распутаться плиз... Хочу сделать 3-х уровневую модель дерева. В примерах есть класс TreeItem который содержит указатель на родителя и список чайлдов. Но этот родитель и элементы списка сами являются TreeItem. С этим вроде бы ясно... А как развернуть эту структуру? Чтобы данные как бы отделить друг от друга?
Например превратить ее в 4 класса:
1. Класс самой модели.
2. Класс с данными верхенго уровня (содержит список данных и список чайлдов 3)
3. Класс с данными среднего уровня (содержит список данных и список чайлдов 4 и указатель на парента 2)
4. Класс с данными нижнего уровня (содержит список данных и указатель на парента 3)
А как при таком раскладе написать тела виртуальных функций QAbstractItemModel (index и parent и rowCount)?

3-й день сижу и ниче не получается (

Или этот подход неверен?

Сама задача такая. Есть список имен. Каждому элементу из этого списка соответсвует список других имен. Каждому элементу из последнего списка соответсвует набор данных. Как это все представить для модели? ((

Спасибо если кто-нибудь что-нибудь подскажет...

Сообщение отредактировал Rocky - 14.12.2010, 11:47
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Rocky
  опции профиля:
сообщение 14.12.2010, 14:27
Сообщение #2


Старейший участник
****

Группа: Участник
Сообщений: 530
Регистрация: 22.12.2008
Из: Санкт-Петербург
Пользователь №: 463

Спасибо сказали: 22 раз(а)




Репутация:   7  


Цитата(kuzulis @ 14.12.2010, 14:58) *
Вместо списка данных TreeItem типа QList<QVariant>, можно испоотзовать любые структуры данных. QList<QVariant> в примере (ИМХО) приведен чисто чтобы показать как оно работает, т.е. общий случай. Тем более, что в QList<QVariant> можно впихнуть любые данные, поэтому такое решение универсально.

Да, любые... но если нужна иерархическая структура данных? Так вот мне совершенно не понятно, что возвращать из функций класса-наследника от QAbstractItemModel index/parent/rowCount. Вот например:
Раскрывающийся текст
//ResultTableItem.h
class CResultTableChild
{
    QString m_sName1;
    QString m_sName2;
    QString m_sIntAn;
    QString m_sIntCm;
    QString m_sIntRel;
    QString m_sConc;

public:
    QVariant data(int nColumn) const;
    bool setData(int nColumn, const QVariant &oData);
};

class CResultTableParent
{
    QList<CResultTableChild*> childItems;

public:
    CResultTableChild *child(int number);
    int childCount() const;
    bool insertChild(int position);
};

class CResultTableItem
{
    QList<CResultTableParent*> childItems;
    CResultTableParent *parentItem;

public:
    CResultTableItem(CResultTableParent *parent = 0);
    ~CResultTableItem();

    CResultTableParent *child(int number);
    int childCount() const;    
    bool insertChild(int position);
    CResultTableParent *parent();
    int childNumber() const;

};


Раскрывающийся текст
//ResultTableModel.h
class CResultTableItem;
class CResultTableParent;
class CResultTableModel : public QAbstractItemModel
{
    Q_OBJECT

    //CResultTableItem *getItem(const QModelIndex &index) const;
    CResultTableParent *rootItem;

public:
    CResultTableModel(QObject *parent = 0);
    virtual ~CResultTableModel();

    virtual  QVariant data(const QModelIndex &index, int role) const;
    virtual QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;
    virtual QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const;
    virtual QModelIndex parent(const QModelIndex &index) const;
    virtual int rowCount(const QModelIndex &parent = QModelIndex()) const;
    virtual int columnCount(const QModelIndex &parent = QModelIndex()) const;
    virtual  Qt::ItemFlags flags(const QModelIndex &index) const;
    virtual bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::DisplayRole);
    virtual bool insertRows(int position, int rows, const QModelIndex &parent = QModelIndex());
};


Раскрывающийся текст
//ResultTableModel.cpp
#include <QtGui>

#include "./ResultTableItem.h"
#include "./ResultTableModel.h"

//---------------------------------------------------------------------------------------------------------//
CResultTableModel::CResultTableModel(QObject *parent) : QAbstractItemModel(parent)
{
    rootItem = new CResultTableParent();

    rootItem->insertChild(0);
    rootItem->child(0)->setData(0, "Ni1_Fe1");
    rootItem->child(0)->setData(1, "");
    rootItem->child(0)->setData(2, "");

//    CResultTableChild *pChild1 = rootItem->child(0);
//    pChild1->insertChild(0);
//    pChild1->child(0)->setData(1, "bvdr");
//    pChild1->child(0)->setData(2, "");
//    pChild1->child(0)->setData(3, "");

//    CResultTableChild *pChild2 = pChild1->child(0);
//    pChild2->insertChild(0);
//    pChild2->child(0)->setData(2, "10");
//    pChild2->child(0)->setData(3, "20");
}
//---------------------------------------------------------------------------------------------------------//
CResultTableModel::~CResultTableModel()
{
    delete rootItem;
}
//---------------------------------------------------------------------------------------------------------//
int CResultTableModel::columnCount(const QModelIndex & /* parent */) const
{
    return 6;
}
//---------------------------------------------------------------------------------------------------------//
QVariant CResultTableModel::data(const QModelIndex &index, int role) const
{
    if (!index.isValid() || role != Qt::DisplayRole) return QVariant();

    CResultTableItem *item = getItem(index);

    return item->data(index.column());
}
//---------------------------------------------------------------------------------------------------------//
Qt::ItemFlags CResultTableModel::flags(const QModelIndex &index) const
{
    if (!index.isValid()) return 0;
    return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
}
//---------------------------------------------------------------------------------------------------------//
//CResultTableItem *CResultTableModel::getItem(const QModelIndex &index) const
//{
///    if (index.isValid())
//    {
//        CResultTableItem *item = static_cast<CResultTableItem*>(index.internalPointer());
  //      if (item) return item;
//    }
//    return rootItem;
//}
//---------------------------------------------------------------------------------------------------------//
QVariant CResultTableModel::headerData(int nSection, Qt::Orientation orientation, int role) const
{
    if (orientation == Qt::Horizontal && role == Qt::DisplayRole)
    {
        switch (nSection)
        {
        case 0: return "Analitical pair";
        case 1: return "Spectr name";
        case 2: return "Int A";
        case 3: return "Int C";
        case 4: return "Int rel";
        case 5: return "C, %";;
        }
    }
    return QVariant();
}
//---------------------------------------------------------------------------------------------------------//
bool CResultTableModel::insertRows(int position, int /*rows*/, const QModelIndex &parent)
{
//    CResultTableItem *parentItem = getItem(parent);
//    bool success;

//    beginInsertRows(parent, position, position);
//    success = parentItem->insertChild(position);
//    endInsertRows();

   // return success;
}
//---------------------------------------------------------------------------------------------------------//
QModelIndex CResultTableModel::index(int row, int column, const QModelIndex &parent) const
{
//    if (parent.isValid() && parent.column() != 0)  return QModelIndex();

//    CResultTableParent *parentItem = getItem(parent);

    //CResultTableChild *childItem = parentItem->child(row);
    //if (childItem) return createIndex(row, column, childItem);

    //return QModelIndex();
}
//---------------------------------------------------------------------------------------------------------//
QModelIndex CResultTableModel::parent(const QModelIndex &index) const
{
//    if (!index.isValid()) return QModelIndex();

//    CResultTableItem *childItem = getItem(index);
//    CResultTableParent *parentItem = childItem->parent();

//    if (parentItem == rootItem) return QModelIndex();

 //   return createIndex(parentItem->childNumber(), 0, parentItem);
}
//---------------------------------------------------------------------------------------------------------//
int CResultTableModel::rowCount(const QModelIndex &parent) const
{
    //CResultTableItem *parentItem = getItem(parent);

   // return parentItem->childCount();
}
//---------------------------------------------------------------------------------------------------------//
bool CResultTableModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
    //if (role != Qt::DisplayRole) return false;

    //CResultTableItem *item = getItem(index);
    //return item->setData(index.column(), value);
}
//---------------------------------------------------------------------------------------------------------//

Вобщем, вообще ничего не понятно, кроме функций columnCount, flags, headerData....

Я уже начал сомневаться, можно ли построить иерархическое дерево через модель?

Их примеры (edit tree model) можно адаптировать конечно... Т.е. вместо списка QVariant сделать 6 переменных - на 6 столбцов. Но тогда будет лишнее дублирование данных. Потому что, например, строка 1 таблицы-дерева должна содержать только одно имя (Имя_1) - в 1-м столбце. Строка 2 - должна содеражть только Имя_2 - другую переменную (во 2-м столбце). Соответсвенно остальные столбцы - (4 штуки) - переменные - должны быть пустыми... А память под них во-первых выделяется, а во-вторых это только запутывает, т.к. они не используются... Короче бред какой-то..... В случае модели таблицы - списка все полностью понятно... А тут какая-то фигня... (

Еще более непонятно, что писать в функции insertRows(...).
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 8.5.2025, 13:47