LINUX.ORG.RU

Предметная голосовая беседа по Qt Model-View для OpenSource проекта по Skype/SIP/Viber

 ,


1

3

Все, я дошел до предела.

Не могу осилить очередную ступеньку в доработке проекта MyTetra. Релиза небыло уже 4 года. Я застрял, и дальше двигаться не могу. Проблема в том, что мне не с кем посоветоваться. В моем окружении нет ни одного программиста, который бы писал на C++ и тем более знал Qt4/5. Черт возьми, да в моем окружении вообще нет ни одного программиста! Я живу в полной профессиональной изоляции.

Сейчас мне нужно переделать в MyTetra пару моделей и вид так, чтобы вид смог показывать сортированные данные. Я собрался это делать через proxy модель. Этот вопрос я уже поднимал здесь и здесь и здесь. Но если использовать proxy модель, то нужно, чтобы source модель была чистая, с реализациями только стандартных методов QAbstractTableModel. Но из-за этого полностью ломается вся концепция моделей.

В моем понимании модель - это такой класс, который позволяет сделать с данными все что ты хочешь, используя удобный для конкретных данных интерфейс. Хочешь удалить данные по списку индексов - пожалуйста! Хочешь добавить сразу несколько строк с данными в любое место? На тебе метод. Хочешь по номеру строки или по QModelIndex получить всю строку - да не вопрос.

Но в Qt получается, что в модели можно только читать/менять данные в ячейках (data/setData), добавлять/удалять строчки и столбцы (insertRows/removeRows) и... все! Конечно, этими базовыми методами можно полностью управлять данными, но тогда всю логику по работе с данными придется реализовывать в виде, который использует такую примитивную модель. Но это же неправильно. Вид должен давать модели простые и емкие команды управления данными, а уж модель сама с ними разбираться. И к тому же, с моделью может взаимодействовать не только вид, но и например объект буфера обмена, со своими требованиями и закидонами. В общем, имеем взаимоисключающие параграфы.

Я уже понял, что обсуждением в текстовом виде (переписка) много чего не решишь. Текст - это медленно, и то что можно сказать за минуту, пишется за десять. Мне нужно пообщаться со знающим человеком голосом.

Исходники: https://github.com/xintrea/mytetra_dev
Лютое бесцельное безумие начиная с коммита 4f9d3ce.

Прошу отписаться на емайл xintrea[сцобакка]gmail.com или в асю 115519OOO (заменить три буквы О на нули) идейных товарищей, которые готовы пообщаться по вышеприведенным вопросам голосом. Напишите в письме время, когда вы готовы поговорить (на рабочей неделе могу только вечером, после 18:00 по Москве, в выходные - по договоренности), напишите предпочитаемые средства связи. Для оперативной координации звонка по Skype/SIP/Viber не помешал бы номер мобильного телефона.


PS:

Что я штудировал, но просветление не пришло:

1. Официальная документация

2. Qt4: Программирование моделей и представлений. Подробное объяснение на русском языке.
http://webhamster.ru/mytetrashare/index/mtb0/1392580691nchkxju7yz

3. Программирование моделей в Qt - рекомендации по использованию, неочевидные моменты
http://webhamster.ru/mytetrashare/index/mtb0/14259955927q5bhzmfbg

4. Беседы о Qt: Парадигма Model-View
http://webhamster.ru/mytetrashare/index/mtb0/14064861764k4dumxivg

5. Модели-Посредники в Qt
http://webhamster.ru/mytetrashare/index/mtb0/1432497788j6rq3ufits

★★★★★

Последнее исправление: Xintrea (всего исправлений: 1)

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

MikeDM ★★★★★
()

я кстати могу в гуглаче конфу устроить для страждущих по моделям вьюхам в кьюте

MikeDM ★★★★★
()
Ответ на: комментарий от MikeDM

«мимо крокодил» по большей части.

dib2 ★★★★★
()

Вот смотри, сделав небольшую доработку можно получить сортировку в RecordTableView: смотри тут. Как-то так навскидку.

Прокси модель используется только для сортировки, данные берет из data(..., Qt::DisplayRole, ...) от твоей модели RecordTableModel. А модель ты сам как хочешь, так и заполняй.

В эту же прокси модель можно и фильтр прикрутить.

grondek
()
Последнее исправление: grondek (всего исправлений: 2)

Немного оффтопа по вашей проге - не думали запилить клиенты под смартфоны и запилить синхронизацию через облачные сервисы?

RiseOfDeath ★★★★
()
Ответ на: комментарий от RiseOfDeath

Конечно, такая возможность есть. В файле проекта в самом начале есть настройка на целевую платформу, и там есть Андроид. И даже работает, вот только интерфейс надо допиливать именно под мобильное использование. Там все подготовлпнно, надо методично сидеть и допиливать.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

Вот смотри, сделав небольшую доработку можно получить сортировку в RecordTableView: смотри тут. Как-то так навскидку.
Прокси модель используется только для сортировки, данные берет из data(..., Qt::DisplayRole, ...) от твоей модели RecordTableModel. А модель ты сам как хочешь, так и заполняй.

Посмотрел. Именно так я и пытался сделать. Делаем прокси-модель proxyRecordModel, ставим ей в качестве source-модели нашу recordModel. Но теперь вопрос - далее везде в коде вида RecordTableView.cpp ты предлагаешь работать с recordModel или с proxyRecordModel?

Если начнем работать с proxyRecordModel, то не сможем вызвать самописные методы работы с данными, которые есть у recordModel (ибо proxy-модель может через себя вызывать только стандартные методы source-модели1).

Если начнем работать с recordModel, то то у нас пойдет несоответствие числовых индексов записей, ибо recordModel работает с несортированными данными, а вид показывает записи в порядке сортировки proxyRecordModel и вызывает методы модели с числовыми индексами текущего вида.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

у нас пойдет несоответствие числовых индексов записей

virtual QModelIndex QAbstractProxyModel::mapToSource(const QModelIndex & proxyIndex) const
virtual QModelIndex QAbstractProxyModel::mapFromSource(const QModelIndex & sourceIndex) const

dib2 ★★★★★
()
Ответ на: комментарий от dib2

Да, есть такое. Только я говорил про числовые индексы. Но их можно преобразовать в QModelIndex. Неудобно конечно но что поделаешь.

Вопрос в том, каким образом организовать в коде Контроллер, чтобы пользователь взаимодействовал с Контроллером, как того требует MVC, а не с видом.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

Вид будет работать с QModelIndex из прокси-модели. Получив индекс ты преобразуешь его mapToSource в индекс твоей модели и далее у тебя должен быть метод получения твоих данных по индексу, что-то типа RecordTableData *getTableData(const QModelIndex&).

В идеале тебе бы организовать все через стандартный метод data( index, role ), возвращая указатель на нужные тебе данные в QVariant.

С другой стороны, работать извне модели с ее данными по указателю - способ несколько небезопасный (особенно в потоках). Лучше было бы возвращать копию данных, модифицировать их и записывать обратно, ИМХО.

grondek
()

Выкинь Qt, перенеси на GTK + gobject + vala.

так и польза будет и заняться есть чем.

еще больше пользы будет в помощи какому-нибудь linphone, sflphone и т.д.

mos ★★☆☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.