Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > C++ > C/C++ Базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Ответ
 
Опции темы
Старый 20.05.2018, 20:12   #1
JUDAS
фонатик DELPHI
Участник клуба
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Адрес: Украина
Сообщений: 703
Репутация: 166
По умолчанию Qt базы данных (связь master-detail)

Приветствую господа ГУРУ среды разработки QT

Имеется 2 таблицы в базе данных связаны между собой по ключевому полю (reference) , есть среда разрабтки QT5 визуальной примочкой QT Creator
Нужно создать простейшие 2 DbGrid-а на форме (Виджете) чтобы данные в них отображались так же, как в основной и подчинённой таблице, то есть основной записи соответствует выборка из подчинённой таблицы.

Перелопатив кучу материала по интернету, кроме как оргназиацию выпадающих списков (ComboBox в ячейке) ничего путного не нашёл.
Использую следующие компоненты и классы

Код:

    QSqlQueryModel  * qmaster = new QSqlQueryModel(0);
    qmaster.setQuery("SELECT id, name, parm1 FROM master_table");
    qmaster.setHeaderData(0, Qt::Horizontal, QObject::trUtf8("ID"));
    qmaster.setHeaderData(1, Qt::Horizontal, QObject::trUtf8("колонка2"));
    qmaster.setHeaderData(2, Qt::Horizontal, QObject::trUtf8("колонка3"));
    qmastertable->setModel(&qmaster);

    QSqlQueryModel  * qdetail  = new QSqlQueryModel(0);
    qdetail.setQuery("SELECT id, reference, parm1 FROM detail_table");
    qdetail.setHeaderData(0, Qt::Horizontal, QObject::trUtf8("ID"));
    qdetail.setHeaderData(1, Qt::Horizontal, QObject::trUtf8("reference"));
    qdetail.setHeaderData(2, Qt::Horizontal, QObject::trUtf8("колонка1"));
    qdetailtable->setModel(&qdetail);

где
qmastertable И qdetailtable - компоненты QTableView

Всё отображается красиво в двух разных окошках но связи нет.
__________________
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума   Ответить с цитированием
Старый 23.05.2018, 14:08   #2
SAMOUCHKA
Участник клуба
 
Регистрация: 07.08.2011
Адрес: Димитровград
Сообщений: 539
Репутация: 111

skype: ilya10009
По умолчанию

а код точно работает? смущают вот эти строки
Код:

QSqlQueryModel  * qmaster = new QSqlQueryModel(0);
// ...
qmastertable->setModel(&qmaster);

Код:

QSqlQueryModel  * qdetail  = new QSqlQueryModel(0);
// ...
qdetailtable->setModel(&qdetail);

на сколько помню setModel, принимает указатель. для чего &

Вообще не совсем понятно что вы хотите и что у вас не получается. Вы не можете сформировать запрос? или что?
__________________
eremeew.ilya@yandex.ru
SAMOUCHKA вне форума   Ответить с цитированием
Старый 23.05.2018, 15:59   #3
alexzk
Участник клуба
 
Регистрация: 12.04.2017
Сообщений: 889
Репутация: 172
По умолчанию

Нету там никаких мастер-дитал.
Там есть model-view-delegate. И есть модель, которая основана на SQL запросе. Как из это собрать, че нада - читайте теорию model-view-delegate.
P.S. сам ее терпеть не могу - ужасная вещь.
alexzk вне форума   Ответить с цитированием
Старый 27.05.2018, 11:04   #4
JUDAS
фонатик DELPHI
Участник клуба
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Адрес: Украина
Сообщений: 703
Репутация: 166
По умолчанию

alexzk SAMOUCHKA
код я действительно переделывал с рабочего в котором обхекты у меня создаются статически (это по поводу &)
По поводу зачем всё нужно и что я вообще хочу... А хочу я ответа на простейший вопрос - "Разве в Qt под Linux невозможно создать обычное нормальное приложение с master-detail связью"

Задача до такой степени примитивна и решается в других средах обработке, что я даже не знаю как её пояснить, но попробую.
Допустим, есть таблица с городами и есть таблица с улицами. В каждой таблице с улицей есть ссылка на таблицу с городом.
Нужно на форме отобразить 2 таблички, причём если я стою на строчке с городом "Москва" я должен во второй табличке видеть улицы города Москва, а есть я перехожу на строчку Казань, то в таблице "detail" должны отображаться все улицы города Казань. То есть отображение обычной master-detail связи в компонентах Qt
__________________
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума   Ответить с цитированием
Старый 28.05.2018, 15:44   #5
SAMOUCHKA
Участник клуба
 
Регистрация: 07.08.2011
Адрес: Димитровград
Сообщений: 539
Репутация: 111

skype: ilya10009
По умолчанию

Цитата:
Сообщение от JUDAS Посмотреть сообщение
код я действительно переделывал с рабочего в котором обхекты у меня создаются статически (это по поводу &)
а это что?
Цитата:
Сообщение от JUDAS Посмотреть сообщение
QSqlQueryModel * qmaster = new QSqlQueryModel(0);
тут все просто
У тебя есть SQL база данных с таблицей города и с таблицей улицы. У города есть id. в таблице улиц, есть поле id_города.

В UI у тебя так-же две таблицы, объекты QTableView- города и улицы.
у QTableView есть сигнал clicked(QModelIndex). он испускается при кликанье, по нему мышью. Свяжи этот сигнал со своим слотом.
В этом слоте из QModelIndex получаешь id_города. И исходя из этого строишь SQL запрос для таблицы улиц.

Как то так
__________________
eremeew.ilya@yandex.ru
SAMOUCHKA вне форума   Ответить с цитированием
Старый 28.05.2018, 21:38   #6
JUDAS
фонатик DELPHI
Участник клуба
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Адрес: Украина
Сообщений: 703
Репутация: 166
По умолчанию

Цитата:
Сообщение от SAMOUCHKA Посмотреть сообщение
у QTableView есть сигнал clicked(QModelIndex)
то есть банальное байторочерство.. Теперь мне ясно почему линукс системы пользуются авторитетом в очень узкого круга лиц с особым устройством черепа =)))
Ладно Самоучка, а если я (оконечный пользователь) не люблю пользоваться мышкой, и всё набираю с помощью клавиатуры в том числе кнопки вверх и вниз ?
__________________
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума   Ответить с цитированием
Старый 29.05.2018, 01:56   #7
alexzk
Участник клуба
 
Регистрация: 12.04.2017
Сообщений: 889
Репутация: 172
По умолчанию

Цитата:
Сообщение от JUDAS Посмотреть сообщение
то есть банальное байторочерство.. Теперь мне ясно почему линукс системы пользуются авторитетом в очень узкого круга лиц с особым устройством черепа =)))
Ладно Самоучка, а если я (оконечный пользователь) не люблю пользоваться мышкой, и всё набираю с помощью клавиатуры в том числе кнопки вверх и вниз ?
Линукс тут совершенно не причем. В вебе, скажем, совершенно аналогично. Это у вас от дельфи травма Как вы хотите - было ток в дельфи и мс аксесс. Это не правильно, т.к. ... плохо ложится на скл и отдельный сервер БД, а если там 3 звена (типа броузер - апач/пхп-сервер БД), то такая связь вообще тихий ужас.

Upd...думаю погорячился. Такое не только в дельфи было, а в любых средах, где не было сервера sql БД - foxpro/clipper/etc.


А на qt там ...вам нужен делегат поля. Делегат будет отображат, скажем QComboBox, у которого будет еще 1 своя модель, которая будет уже "detail".

Вот, внизу делегат. Не скажу, что там все верно и академично (скорее наоборот), но контрол в таблице оно делает нужный.
https://github.com/alexzk1/astroed/b...viewsmodel.cpp

Последний раз редактировалось alexzk; 29.05.2018 в 02:06.
alexzk вне форума   Ответить с цитированием
Старый 29.05.2018, 17:15   #8
SAMOUCHKA
Участник клуба
 
Регистрация: 07.08.2011
Адрес: Димитровград
Сообщений: 539
Репутация: 111

skype: ilya10009
По умолчанию

Цитата:
Сообщение от JUDAS Посмотреть сообщение
Теперь мне ясно почему линукс системы пользуются авторитетом в очень узкого круга лиц с особым устройством черепа =)))
при чем тут Linux? Qt кроссплатформенный фреймворк.
Цитата:
Сообщение от JUDAS Посмотреть сообщение
а если я (оконечный пользователь) не люблю пользоваться мышкой, и всё набираю с помощью клавиатуры в том числе кнопки вверх и вниз ?
Qt и это умеет.

В чем собственно у вас проблема? Для создания двух связаных таблиц фреймворке все нужные компоненты уже есть, ни чего дописывать не надо.
Как связать две таблицы объяснил выше.
__________________
eremeew.ilya@yandex.ru
SAMOUCHKA вне форума   Ответить с цитированием
Старый 31.05.2018, 22:11   #9
JUDAS
фонатик DELPHI
Участник клуба
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Адрес: Украина
Сообщений: 703
Репутация: 166
По умолчанию

Цитата:
Сообщение от alexzk Посмотреть сообщение
Это у вас от дельфи травм
alexzk. Во первых спасибо за ответы.
Во вторых, я по жизни практический человек. Если заказчик просит меня создать приложение которое отображает в табличке фамилии сотрудников компании, а во второй табличке из зароботные платы по месяцам, то 90% своих усилий я бросаю на то, чтобы создать структуру БД и написать приложение удобное для пользователя... В среде QT мне приходится 90% своего времени работать с какими то не нужными мне свойствами и моделями, чтобы создать примитивный аналог компоненты DbGrid и 10% времени остаётся на саму предметную область задачи.
Считаю что допиливанием компонент и перманетной пересборкой ядра должны заниматься люди, которые без этих деяний не могут прожить и дня своей жизни.
К сожалению, я к таим людям не отношусь.... травма говорите - можете так называть готовую компоненту, которая позволяет программисту думать о поставленной задаче а не о прелестях допиливания Линукс.

п.с. Qt4 под Windows это жесть жестяная. Очень жалею тех людей, которые занимаются изобретением велосипеда в Винде изобретённого лет 20 назад.
__________________
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума   Ответить с цитированием
Старый 31.05.2018, 22:43   #10
Alex11223
Модератор
Заслуженный модератор
 
Регистрация: 12.01.2011
Сообщений: 16,499
Репутация: 3242

icq: 512-765
skype: alexp.frl
По умолчанию

Ну ДбГрид в Дельфи-то может и хорош для стандартного CRUD, но примерно на этом преимущества и кончаются.

Например с Layout в VCL все плохо.
А если старая Дельфи, то вообще кучи полезных вещей не завозили (аж до 2009). Ни Дженериков, ни хеш-сетов/мапов, ни лямбд.
Ну и всякие красивости в GUI тоже намного проще в Qt делать (даже в стандартном Widgets без QtQuick/QML из 5+), даже без сторонних компонентов.
Alex11223 на форуме   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Связь Master - Detail vVladislav Помощь студентам 0 31.12.2016 15:46
fibplus master-detail условие в detail tarakan1983 БД в Delphi 15 02.11.2014 17:10
Combobox и Master-Detail Максим1818 БД в Delphi 4 13.02.2014 10:10
Master Detail. добавление редактирование t.baychorov БД в Delphi 1 10.12.2011 14:23
Master-detail DELPHI+FIREBIRD Liones БД в Delphi 1 30.11.2010 14:27


15:56.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru