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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Теоретический вопрос по Model View  (Прочитано 6071 раз)
troorl
Гость
« : Июль 01, 2007, 17:38 »

Есть две таблицы SQL. Одна содержит такие поля (имя, индекс, описание), вторая такие (индекс, имя). Связь между ними идёт по этому индексу, причём записи во второй таблице уникальны, а в первой индексы могут повторятся. То есть к записи из второй таблицы могут относится сразу несколько записей первой.

Получается древовидная структура. Хотелось бы её засунуть в QTreeView с помощью QSqlQueryModel. Но как это сделать, как предусмотреть вложённость, я не знаю. Нужно ли наследовать модель или можно обойтись стандартной?
Записан
Steven_Orko
Гость
« Ответ #1 : Июль 02, 2007, 08:41 »

Здесь на форме один человек пытался решить такой вопрос. Поищи по форуму. Кажется, там даже к какому-то определенному решению пришли...
Записан
troorl
Гость
« Ответ #2 : Июль 02, 2007, 09:46 »

Цитата: "Steven_Orko"
Здесь на форме один человек пытался решить такой вопрос. Поищи по форуму. Кажется, там даже к какому-то определенному решению пришли...

Да, я видел ту тему. Но если честно, мало что понял. Кода там не было, конкретных ответов тоже. Я даже не понимаю, что нужно наследовать, так как Model View для меня пока загадка :oops:
Записан
Tonal
Гость
« Ответ #3 : Июль 02, 2007, 10:05 »

2troorl
А причём здесь дерево?
Ты же описал тривиальный справочник...
Опиши что тебе получить-то хочиться.
Если тебе просто нужно отобразить имя соответствующее индексу - делай join по этому полю в select-е и  не парься. ;-)
Записан
troorl
Гость
« Ответ #4 : Июль 02, 2007, 13:27 »

Цитата: "Tonal"
2troorl
А причём здесь дерево?
Ты же описал тривиальный справочник...
Опиши что тебе получить-то хочиться.
Если тебе просто нужно отобразить имя соответствующее индексу - делай join по этому полю в select-е и  не парься. ;-)

Мне нужно сделать нечто вроде такого:
Код:
|_[]
|  |_[]
|  |_[]
|
|_[]
|  |_[]
|  |_[]
|  |_[]
|
|
|_[]
|  |_[]
|  |_[]

То есть уровень вложенности - 1. Запрос то сделать не проблема. Вопрос только в том, как это засунуть в QTreeView...
Записан
-=QT=-
Гость
« Ответ #5 : Июль 02, 2007, 15:29 »

Если хотите использовать TreeView - то нужно наследовать несколько классов.
При работе необходимо использовать QAbstractItemModel
если использовать QAbstractItemModel  необходимо определить собственную реализацию итема :

Код:
#ifndef TREEITEM_H
#define TREEITEM_H

#include <QList>
#include <QVariant>

class TreeItem
{
public:
    TreeItem(const QList<QVariant> &data, TreeItem *parent = 0);
    ~TreeItem();

    void appendChild(TreeItem *child);

    TreeItem *child(int row);
    int childCount() const;
    int columnCount() const;
    QVariant data(int column) const;
    int row() const;
    TreeItem *parent();

private:
    QList<TreeItem*> childItems;
    QList<QVariant> itemData;
    TreeItem *parentItem;
};
#endif


Код:
#ifndef TREEMODEL_H
#define TREEMODEL_H

#include <QAbstractItemModel>
#include <QModelIndex>
#include <QVariant>

class TreeItem;

class TreeModel : public QAbstractItemModel
{
    Q_OBJECT

public:
    TreeModel(QObject *parent = 0);
    ~TreeModel();

    QVariant data(const QModelIndex &index, int role) const;
    //    ЭТО ДЛЯ РЕДАКТИРОВАНИЯ   Qt::ItemFlags flags(const QModelIndex &index) const;
    QVariant headerData(int section, Qt::Orientation orientation,
                        int role = Qt::DisplayRole) const;
    QModelIndex index(int row, int column,
                      const QModelIndex &parent = QModelIndex()) const;
    QModelIndex parent(const QModelIndex &index) const;
    int rowCount(const QModelIndex &parent = QModelIndex()) const;
    int columnCount(const QModelIndex &parent = QModelIndex()) const;
 
   
private:
    void init(int id = 0,  TreeItem *parent = 0);
    TreeItem *rootItem;
};

#endif



Цитировать
Read-Only Access
To provide read-only access to data provided by a model, the following functions must be implemented in the model's subclass:

flags()
Used by other components to obtain information about each item provided by the model. In many models, the combination of flags should include Qt::ItemIsEnabled and Qt::ItemIsSelectable.
data()
Used to supply item data to views and delegates. Generally, models only need to supply data for Qt::DisplayRole and any application-specific user roles, but it is also good practice to provide data for Qt::ToolTipRole, Qt::AccessibleTextRole, and Qt::AccessibleDescriptionRole.
headerData()
Provides views with information to show in their headers. The information is only retrieved by views that can display header information.
rowCount()
Provides the number of rows of data exposed by the model.

These four functions must be implemented in all types of model, including list models (QAbstractListModel subclasses) and table models (QAbstractTableModel subclasses).
Additionally, the following functions must be implemented in direct subclasses of QAbstractTableModel and QAbstractItemModel:

columnCount()
Provides the number of columns of data exposed by the model. List models do not provide this function because it is already implemented in QAbstractListModel.


Тоесть определить :
При использовании ТОЛЬКО ДЛЯ ЧТЕНИЯ
void setRootNode(Node *node),
QmodelIndex index(int row, int column, const QmodelIndex &parent ) const,
QmodelIndex parent(const QmodelIndex &parent ) const,
int rowCount(const QmodelIndex &parent) const,
int columnCount(const QmodelIndex &parent) const,
QVariant data(const QmodelIndex &index, int role) const,
QVariant headerData(int section, Qt:Orientation orientation, int role) const,

и в приватных объявить:
Node *nodeFromIndex(const QmodelIndex &index) const;
Node *rootNode;

При редактировании : - сначала попробуй только чтение потом само
пойдет. (Только если трава хорошая ) Веселый  Крутой  :wink:

добавлено спустя 1 минуту:

 Фуууух ............ даже вспотел пока набирал
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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