Russian Qt Forum
Март 29, 2023, 19:58
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Базы данных
>
QSqlTreeViewModel всем миром.
Голосование
Вопрос:
Нужен ли Вам QSqlTreeView
Нужен очень
Ну пригодился бы
Не нужен, фигня это
А что это такое ?
Страниц: [
1
]
2
3
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: QSqlTreeViewModel всем миром. (Прочитано 29554 раз)
-=QT=-
Гость
QSqlTreeViewModel всем миром.
«
:
Март 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
Гость
QSqlTreeViewModel всем миром.
«
Ответ #1 :
Март 30, 2007, 08:41 »
А в чем задача такой модели ? Как должна выглядеть структура таблицы/таблиц, чтобы выстроить дерево ?
Записан
-=QT=-
Гость
QSqlTreeViewModel всем миром.
«
Ответ #2 :
Март 30, 2007, 08:53 »
ИТОГО
Таблица с данными имеющими древовидную структуру описывается следующей закономерностью:
ID- он же первичный ключ
P_ID - ключ указатель на родителя(если родитель отсутствует то это первичная ветвь в нашем случае по умолчанию id=0)
Все остальные поля таблицы произвольного типа и размера.
Этот класс (то есть модель) не должна иметь привязку к какойто определенной таблице а использоваться универсально.
добавлено спустя 2 минуты:
Задача модели:
1. Предоставлять реализацию отображения данных
2. Возможность редактирования данных
Записан
SABROG
Гость
QSqlTreeViewModel всем миром.
«
Ответ #3 :
Март 30, 2007, 09:05 »
Это некий аналог QSqlRelationalTableModel ? Только вместо комбобоксиков с данными из другой таблицы будут дочерние узлы ?
Записан
-=QT=-
Гость
QSqlTreeViewModel всем миром.
«
Ответ #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
Гость
QSqlTreeViewModel всем миром.
«
Ответ #5 :
Март 30, 2007, 16:27 »
Я вообще против примитивных дата-биндингов.
Нахлебался в delphi по самое нихочу!
ORM-ы рулят!
А по ним модельки лепятся на раз. ;-)
Записан
-=QT=-
Гость
QSqlTreeViewModel всем миром.
«
Ответ #6 :
Март 31, 2007, 10:29 »
Цитата: "Tonal"
Я вообще против примитивных дата-биндингов.
Нахлебался в delphi по самое нихочу!
ORM-ы рулят!
А по ним модельки лепятся на раз. ;-)
Вот я и не хочу примитивизма, хочу универсальности и расширяемости и если Вы имеете собственный взгляд на эту проблему с конкретным направлением решени то я с большим удовольствием выслушаю Ваше мнение, мои познания в QT на сегодняшний день небольшие, а С++ изучал еще в институте, а после этого ним не пользовался до последнего времени.
добавлено спустя 5 минут:
Кстати, вчера попытался ЭТО запустить, после некоторого шуршания напильником и уборку багов :mrgreen: получил работоспособную версию с небольшими недоделками, сегодня выложу файлы на www::webfile->ru.
добавлено спустя 3 минуты:
В догонку (Tonal):
ORM — (англ. Object-relational mapping) технология в программировании, которая связывает базы данных с концепциями объектно-ориентированных языков программирования, создавая (как результат) «виртуальную объектную базу данных». Существуют как коммерческие, так и бесплатные реализации этой технологии.
А чем наша идея отличается от вышенаписанного?
Записан
SABROG
Гость
QSqlTreeViewModel всем миром.
«
Ответ #7 :
Март 31, 2007, 11:01 »
А почему бы просто не унаследоваться от QSqlRelationalDelegate или модифицировать его для троллей, чтобы поддерживал представление treeview ?
Записан
-=QT=-
Гость
QSqlTreeViewModel всем миром.
«
Ответ #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
Гость
QSqlTreeViewModel всем миром.
«
Ответ #9 :
Март 31, 2007, 11:18 »
А можно скрины как это вообще выглядит ?
Записан
-=QT=-
Гость
QSqlTreeViewModel всем миром.
«
Ответ #10 :
Март 31, 2007, 11:42 »
Скрины в студию:
Тут что загрузки файлов нет класно да понимаеш....
http://slil.ru/24163349
Записан
SABROG
Гость
QSqlTreeViewModel всем миром.
«
Ответ #11 :
Март 31, 2007, 11:56 »
О, так будет поинтереснее
А как выглядит таблица для такого дерева ?
Записан
-=QT=-
Гость
QSqlTreeViewModel всем миром.
«
Ответ #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
Гость
QSqlTreeViewModel всем миром.
«
Ответ #13 :
Март 31, 2007, 14:58 »
А так будет выглядить дерево из 3 веток ?
Код:
1
0
Parent
2
1
Child
3
2
Child of child
Соответственно, чтобы найти корневой элемент ребенка в базе надо будет сделать запрос по каждому предыдущему элементу выцепляя родительские индексы, пока он не станет 0 ?
Записан
-=QT=-
Гость
QSqlTreeViewModel всем миром.
«
Ответ #14 :
Март 31, 2007, 15:10 »
Ну да. Так и есть.
Записан
Страниц: [
1
]
2
3
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...