Russian Qt Forum

Qt => Model-View (MV) => Тема начата: nvek от Февраль 12, 2017, 17:02



Название: модель для таблицы и дерева
Отправлено: nvek от Февраль 12, 2017, 17:02
Знаю вопросы не новые, но как быть если отобразить в таблицу из дерева то, что не видно в дереве, сейчас постараюсь обьяснить.данные получены из xml файла. B дереве мы видим лишь "A", "B", "C". остальные дынные не будут показываться, но зато по клику на на B Например показать его виток.

+---+                                  +-----+------+-----+
| A  |                                   | B1   |        |       |
+---+                                  +-----+------+-----+
  |                                       | B2   |        |       |
  |   +----+            ==>        +-----+------+-----+
  +--| B   |                            | B3   |        |       |
  |   +----+                           +-----+------+-----+
  |     |                               
  |     |   +-----+                 
  |     +--| B1   |                 
  |     |   +-----+               
  |     |
  |     |   +-----+
  |     +--| B2   |
  |     |   +-----+
  |     |
  |     |   +-----+
  |     +--| B3   |
  |         +-----+
  |                                     
  |   +----+           
  +--| C   |                         
      +----+                       
        |                               
        |   +-----+                 
        +--| C1   |                 
        |   +-----+                 
        |
        |   +-----+
        +--| C2   |
        |   +-----+
        |
        |   +-----+
        +--| C3   |
            +-----+


Название: Re: модель для таблицы и дерева
Отправлено: panAlexey от Февраль 13, 2017, 12:03
Сколько?


Название: Re: модель для таблицы и дерева
Отправлено: ssoft от Февраль 13, 2017, 13:11
Знаю вопросы не новые, но как быть если отобразить в таблицу из дерева то, что не видно в дереве, сейчас постараюсь обьяснить.данные получены из xml файла. B дереве мы видим лишь "A", "B", "C". остальные дынные не будут показываться, но зато по клику на на B Например показать его виток.

Задача не сложная. Необходимо сформировать прокси модель (например, на основе QAbstractProxyModel), которая из исходной будет предоставлять только необходимые для отображения данные.


Название: Re: модель для таблицы и дерева
Отправлено: nvek от Март 10, 2017, 09:44
я правильно понял? мне надо создать модель (самую главную) унаследованную от абстрактной модели
затем я пишу модель для дерева уже наследованную от прокси, куда загружаю данные главной модели.
????
 и еще, если мне надо задать иконки как это сделать?


Название: Re: модель для таблицы и дерева
Отправлено: __Heaven__ от Март 10, 2017, 11:38
http://doc.qt.io/qt-5/qt.html#ItemDataRole-enum


Название: Re: модель для таблицы и дерева
Отправлено: lit-uriy от Март 10, 2017, 13:22
чёто с этой аватаркой уже не первый человек встречается на этом форуме


Название: Re: модель для таблицы и дерева
Отправлено: nvek от Март 11, 2017, 11:47
чёто с этой аватаркой уже не первый человек встречается на этом форуме
они стандартные :)


Название: Re: модель для таблицы и дерева
Отправлено: nvek от Март 13, 2017, 14:13
пока у меня как то покриворукому:
есть класс модель, есть класс модельИтем. на мое удивление данными заполняет вьюшку.
хочу создать промежуточную модель
ТреМодель, унаследованную от QSortFilterProxyModel
и уже вывести ее. Опять придется делать деревянную структуру? и нужна ли деревянная структура в главной модели?
или можно использовать одну и туже деревянную структуру? (МодельИтем)
пока все из симплов.
Ps новичек в этой теме.



Название: Re: модель для таблицы и дерева
Отправлено: nvek от Март 16, 2017, 13:24
Я думаю продолжать эту тему.
Вопрос такой, вернее не вопрос, а небольшое затруднение
есть абстрактная модель (все стандартно)
Код:
class ModelItem;

class BaseModel : public QAbstractItemModel
{
Q_OBJECT

private:
ModelItem* displayRootItem;
ModelItem* rootItem;

protected:
void setDisplayRootItem(ModelItem*);
ModelItem* const getDisplayRootItem() const;
void setRootItem(ModelItem*);
//ModelItem* getRootItem() const;

public:
ModelItem* getRootItem() const;
explicit BaseModel(QObject *parent = 0);
virtual ~BaseModel();

QModelIndex index(int row, int column, const QModelIndex& parent = QModelIndex()) const;
QModelIndex parent(const QModelIndex& child) const;
int rowCount(const QModelIndex& parent = QModelIndex()) const;

int columnCount(const QModelIndex & parent) const;

QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const;
bool setData(const QModelIndex& index, const QVariant& value, int role = Qt::EditRole);

};
mpdelItem:
Код:
class BaseModel;

class ModelItem : public QObject
{
Q_OBJECT

public:

private:
ModelItem * parentItem;
QList < ModelItem * > childrenList;

public:
ModelItem();
~ModelItem();

public:
virtual QVariant data(int role) const;
virtual bool setData(const QVariant& value, int role);
virtual ModelItem* parent() const;
virtual Qt::ItemFlags flags() const;

virtual void AddChild(ModelItem* n);
virtual void AddChildTo(ModelItem* n, int position);
virtual int IndexOfChild(ModelItem*) const;
virtual int ChildrenCount() const;

virtual ModelItem* ChildAt(int index) const;
void ClearChildrenList();
};
treeViewModel:
Код:
class TreeViewModel : public BaseModel
{
Q_OBJECT

public:

explicit TreeViewModel(QObject * parent = 0);

private:

};

treeViewModelItem:
Код:
class TreeViewModelItem : public ModelItem
{

public:
enum IconType
{
folderNode,
treeNode,
archiveNode,
fileNode,
folderNodeDisabled,
treeNodeDisabled,
rootNode,
rootNodeDisabled
};

TreeViewModelItem();

QVariant data(int role);
bool setData(const QVariant& value, int role);

void setIcon();
void setText();
//
QString text;
IconType iconType;
};

я например хочу занести данные в модель
читаю xml
вот ридер в другом отдельном классе, не унаследованном ни от кого.
в него подается строка xml
Код:
bool StatXmlReader::read(const QString & source, const QString & nameFile)
{
TreeViewModelItem * tItem = new TreeViewModelItem();
BaseModel* bModel = new BaseModel();
ModelItem * rootItem = bModel->getRootItem();

rootItem->AddChild(tItem);
//xmlReader = new QXmlStreamReader(source);
        //.....
return true;
}
в тот момент когда я хочу добавить рутовый элемент у меня вылетает.
вопрос, как заносить в эту модель данные?????