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

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

Голосование
Вопрос: Нужен ли Вам QSqlTreeView
Нужен очень
Ну пригодился бы
Не нужен, фигня это
А что это такое ?

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: QSqlTreeViewModel всем миром.  (Прочитано 33037 раз)
-=QT=-
Гость
« : Март 30, 2007, 08:33 »

QSqlTreeViewModel всем миром. (или покажем торллям что нам нужно...)
Выкладываю начало своих размышлений о полете над гранатом или тому подобным изделием за минуту до взрыва..... Улыбающийся

Код:
#ifndef QSQLTREEVIEWMODEL_H
#define QSQLTREEVIEWMODEL_H
//
#include <QStandartItemModel>
#include <QSqlQuery>

//
class QSqlTreeViewModel : public QStandartItemModel
{
Q_OBJECT

public:
QSqlTreeViewModel( QString tableName, QString primaryFieldName, QString parentFieldName, int id = 0, QObject *parent = 0 );    
virtual ~QSqlTreeViewModel();
   
    void init( int id, QModelIndex parent = QModelIndex() );
       
private:  
    QString  primaryFieldName;
    QString  parentFieldName;
    QString  tableName;
    int primaryFieldNo;
};
#endif
#include "qsqltreeviewmodel.h"

//
QSqlTreeViewModel::QSqlTreeViewModel(QString tableName, QString primaryFieldName, QString parentFieldName, int id, QObject *parent)
        : QStandartItemModel()
{
    QSqlTreeViewModel::primaryFieldName.clear();
    QSqlTreeViewModel::primaryFieldName.append(primaryFieldName);

    QSqlTreeViewModel::parentFieldName.clear();
    QSqlTreeViewModel::parentFieldName.append(parentFieldName);

    QSqlTreeViewModel::tableName.clear();
    QSqlTreeViewModel::tableName.append(tableName);
   
    QModelIndex item=index(0,0);
    //
    QSqlQuery query;
    query.prepare( QString("SELECT %1 FROM %2 WHERE %3 = %4")
                   .arg(QSqlTreeViewModel::primaryFieldName)
                   .arg(QSqlTreeViewModel::tableName)
                   .arg(QSqlTreeViewModel::parentFieldName)
                   .arg(id) );
    query.exec();

    QSqlTreeViewModel::primaryFieldNo = query.record().indexOf(QSqlTreeViewModel::primaryFieldName);

    if (query.next())
        QSqlTreeViewModel::init(query.value(QSqlTreeViewModel::primaryFieldNo).toInt(), item);
    //
}
//
QSqlTreeViewModel::~QSqlTreeViewModel()
{}
//
void QSqlTreeViewModel::init(int id, QModelIndex parent)
{
    QSqlQuery query(QString("SELECT * FROM %1 WHERE %2 = %3")
                    .arg(QSqlTreeViewModel::tableName)
                    .arg(QSqlTreeViewModel::primaryFieldName)
                    .arg(id));
    query.exec();

    int fieldNo = query.record().indexOf(QSqlTreeViewModel::primaryFieldName);

    QModelIndex item;
    if (query.next())
    {


Сейчас пишу далее Все Ваши мнения будут очень полезны, не только мне но и сообществу QT тоже, заранее всем спасибо.
Записан
SABROG
Гость
« Ответ #1 : Март 30, 2007, 08:41 »

А в чем задача такой модели ? Как должна выглядеть структура таблицы/таблиц, чтобы выстроить дерево ?
Записан
-=QT=-
Гость
« Ответ #2 : Март 30, 2007, 08:53 »

ИТОГО
Таблица с данными имеющими древовидную структуру описывается следующей закономерностью:
ID- он же первичный ключ
P_ID - ключ указатель на родителя(если родитель отсутствует то это первичная ветвь в нашем случае по умолчанию id=0)
Все остальные поля таблицы произвольного типа и размера.

Этот класс (то есть модель) не должна иметь привязку к какойто определенной таблице а использоваться универсально.

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

 Задача модели:
1. Предоставлять реализацию отображения данных
2. Возможность редактирования данных
Записан
SABROG
Гость
« Ответ #3 : Март 30, 2007, 09:05 »

Это некий аналог QSqlRelationalTableModel ? Только вместо комбобоксиков с данными из другой таблицы будут дочерние узлы ?
Записан
-=QT=-
Гость
« Ответ #4 : Март 30, 2007, 12:31 »

Цитата: "SABROG"
Это некий аналог QSqlRelationalTableModel ? Только вместо комбобоксиков с данными из другой таблицы будут дочерние узлы ?
Ну типа да, только не QSqlRelationalTableModel а QSqlTableModel

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

 Добавляю код, полученный в результате спаривания клеток головного мозга вашего покорного слуги....

qsqltreeviewmodel.h
Код:
#ifndef QSQLTREEVIEWMODEL_H
#define QSQLTREEVIEWMODEL_H
//
#include <QStandartItemModel>
#include <QSqlQuery>

//
class QSqlTreeViewModel : public QStandartItemModel
{
Q_OBJECT

public:
QSqlTreeViewModel( QString tableName, QString primaryFieldName, QString parentFieldName, int id = 0, QObject *parent = 0 );    
virtual ~QSqlTreeViewModel();
   
    void init( int id, QModelIndex parent = QModelIndex() );
       
private:  
    QString  primaryFieldName;
    QString  parentFieldName;
    QString  tableName;
    int primaryFieldNo;
};
#endif

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

#define START_FIELD_SETDATA          2
#define NO_USED_SYSTEM_FIELD       2
//
QSqlTreeViewModel::QSqlTreeViewModel(QString tableName, QString primaryFieldName, QString parentFieldName, int id, QObject *parent)
        : QStandartItemModel()
{
    QSqlTreeViewModel::primaryFieldName.clear();
    QSqlTreeViewModel::primaryFieldName.append(primaryFieldName);

    QSqlTreeViewModel::parentFieldName.clear();
    QSqlTreeViewModel::parentFieldName.append(parentFieldName);

    QSqlTreeViewModel::tableName.clear();
    QSqlTreeViewModel::tableName.append(tableName);

    QModelIndex item=index(0,0);
    //
    QSqlQuery query;
    query.prepare( QString("SELECT %1 FROM %2 WHERE %3 = %4")
                   .arg(QSqlTreeViewModel::primaryFieldName)
                   .arg(QSqlTreeViewModel::tableName)
                   .arg(QSqlTreeViewModel::parentFieldName)
                   .arg(id) );
    query.exec();

    QSqlTreeViewModel::primaryFieldNo = query.record().indexOf(QSqlTreeViewModel::primaryFieldName);

    if (query.next())
        QSqlTreeViewModel::init(query.value(QSqlTreeViewModel::primaryFieldNo).toInt(), item);
    //
}
//
QSqlTreeViewModel::~QSqlTreeViewModel()
{}
//
void QSqlTreeViewModel::init(int id, QModelIndex parent)
{
    QSqlQuery query(QString("SELECT * FROM %1 WHERE %2 = %3")
                    .arg(QSqlTreeViewModel::tableName)
                    .arg(QSqlTreeViewModel::primaryFieldName)
                    .arg(id));
    query.exec();

    int fieldNo = query.record().indexOf(QSqlTreeViewModel::primaryFieldName);
    int countField = query.count();

    QSqlTreeViewModel::insertColumns(0, (countField-NO_USED_SYSTEM_FIELD), parent);

    QModelIndex item;
    if (query.next())
    {

        QSqlTreeViewModel::insertRow(QSqlTreeViewModel::rowCount(parent), parent);

        int fieldNoSetData = START_FIELD_SETDATA;
        while (fieldNoSetData <= countField)
        {
            item=index(rowCount(parent)-1, fieldNoSetData, parent);
            setData(item, query.value(fieldNoSetData-1));
            fieldNoSetData += 1;
        }
        QSqlQuery query;
        query.prepare( QString("SELECT %1 FROM %2 WHERE %3 = %4")
                       .arg(QSqlTreeViewModel::primaryFieldName)
                       .arg(QSqlTreeViewModel::tableName)
                       .arg(QSqlTreeViewModel::parentFieldName)
                       .arg(id) );
        query.exec();
        if (query.next())
        {
            QSqlTreeViewModel::insertColumns(0, (countField-NO_USED_SYSTEM_FIELD), item);
            do
            {
                init(query.value(QSqlTreeViewModel::primaryFieldNo).toInt(), item);
            }
            while (query.next());
        }
    }
}
//

Господа Товарищи и просто Друзья пробуйте пишите звоните бейте ногами начинается самое интересное доработка наполнение и прочие прелести программирования.
Если что не так пишите не стесняйтесь. Постараюсь всем уделить время.[/code]

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

 Кое что изменил скоро протестирую и выложу. Потому как предидущие версии не тестировались а сразу из текстового редактора...
НЕВИЖУОЖИВЛЕНИЯ (ведь тема на мой взгляд интересная)
Записан
Tonal
Гость
« Ответ #5 : Март 30, 2007, 16:27 »

Я вообще против примитивных дата-биндингов.
Нахлебался в delphi по самое нихочу!
ORM-ы рулят!
А по ним модельки лепятся на раз. ;-)
Записан
-=QT=-
Гость
« Ответ #6 : Март 31, 2007, 10:29 »

Цитата: "Tonal"
Я вообще против примитивных дата-биндингов.
Нахлебался в delphi по самое нихочу!
ORM-ы рулят!
А по ним модельки лепятся на раз. ;-)

Вот я и не хочу примитивизма, хочу универсальности и расширяемости и если Вы имеете собственный взгляд на эту проблему с конкретным направлением решени то я с большим удовольствием выслушаю Ваше мнение, мои познания в QT на сегодняшний день небольшие, а С++ изучал еще в институте, а после этого ним не пользовался до последнего времени.

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

 Кстати, вчера попытался ЭТО запустить, после некоторого шуршания напильником и уборку багов :mrgreen: получил работоспособную версию с небольшими недоделками, сегодня выложу файлы на www::webfile->ru.

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

 В догонку (Tonal):
ORM — (англ. Object-relational mapping) технология в программировании, которая связывает базы данных с концепциями объектно-ориентированных языков программирования, создавая (как результат) «виртуальную объектную базу данных». Существуют как коммерческие, так и бесплатные реализации этой технологии.
А чем наша идея отличается от вышенаписанного?
Записан
SABROG
Гость
« Ответ #7 : Март 31, 2007, 11:01 »

А почему бы просто не унаследоваться от QSqlRelationalDelegate или модифицировать его для троллей, чтобы поддерживал представление treeview ?
Записан
-=QT=-
Гость
« Ответ #8 : Март 31, 2007, 11:17 »

Исхдный текст:
The QSqlRelationalDelegate class provides a delegate that is used to display and edit data from a QSqlRelationalTableModel.
Перевод:
Класс QSqlRelationalDelegate обеспечивает делегата, который используется, чтобы показать и редактировать данные из QSqlRelationalTableModel.
А в итоге нуден класс подобный QSqlTableModel, но только для древовидной структуры отображения. Крутой

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

 Хотя я могу ошибаться,  Веселый .
Разрешением наших проблем может стать только работающий пример в данной области.
Записан
SABROG
Гость
« Ответ #9 : Март 31, 2007, 11:18 »

А можно скрины как это вообще выглядит ?
Записан
-=QT=-
Гость
« Ответ #10 : Март 31, 2007, 11:42 »

Скрины в студию:
Тут что загрузки файлов нет класно да понимаеш....

http://slil.ru/24163349
Записан
SABROG
Гость
« Ответ #11 : Март 31, 2007, 11:56 »

О,  так будет поинтереснее Подмигивающий

А как выглядит таблица для такого дерева ?
Записан
-=QT=-
Гость
« Ответ #12 : Март 31, 2007, 13:14 »

Таблица типа так:

ID      P_ID         NAMEJOB                  NUMJOB       TIMEJOB
1         0          Переноска воды              1                0,03
2         1          Взять емкость...               1                0,01
3         1          Принести.....                    1                0,02
4         0          Утрамбовка воздуха       10               456,00

ID       - первичны индекс (автоинкремент)
P_ID   - ссылка на родительсский индекс у начальных ветвей он - 0
Записан
SABROG
Гость
« Ответ #13 : Март 31, 2007, 14:58 »

А так будет выглядить дерево из 3 веток ?

Код:

1 0 Parent
2 1 Child
3 2 Child of child


Соответственно, чтобы найти корневой элемент ребенка в базе надо будет сделать запрос по каждому предыдущему элементу выцепляя родительские индексы, пока он не станет 0 ?
Записан
-=QT=-
Гость
« Ответ #14 : Март 31, 2007, 15:10 »

Ну да. Так и есть.
Записан
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


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