crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> QStandardModel и сигнал rowsInserted()
Анна
  опции профиля:
сообщение 26.12.2014, 11:12
Сообщение #1


Активный участник
***

Группа: Участник
Сообщений: 276
Регистрация: 22.5.2008
Из: Зеленоград
Пользователь №: 181

Спасибо сказали: 30 раз(а)




Репутация:   4  


Столкнулась с таким фактом:
Если QStandardModel использую как таблицу и добавляю ряды непосредственно в саму модель с помощью QStandardModel::appendRow(), то в слоте, присоединённом к сигналу rowsInserted( const QModelIndex & parent, int start, int end) нет возможности добраться до данных, которые вставлены. parent не валидный, его указатель на модель равен нулю. Теоретически можно выловить модель из sender(), но где гарантия, что мой слот подсоединён к сигналу непоспедственно от модели, а не через какого-нибудь посредника?
Кто может посоветовать что-нибудь , как решить проблему доставания данных из этого сигнала?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 27.12.2014, 20:10
Сообщение #2


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


Можно сохранять ссылку на модель внутри получателя сигнала. Тем более если есть некие посредники.
Либо как раз использовать посредника, который связан с моделью и выдает сигнал (QAbstractItemModel*, int, int) например.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Анна
  опции профиля:
сообщение 29.12.2014, 14:19
Сообщение #3


Активный участник
***

Группа: Участник
Сообщений: 276
Регистрация: 22.5.2008
Из: Зеленоград
Пользователь №: 181

Спасибо сказали: 30 раз(а)




Репутация:   4  


Цитата(lanz @ 27.12.2014, 20:10) *
Можно сохранять ссылку на модель внутри получателя сигнала. Тем более если есть некие посредники.
Либо как раз использовать посредника, который связан с моделью и выдает сигнал (QAbstractItemModel*, int, int) например.

Можно, конечно.
Собственно, покопавшись и в QStandardModel и в прокси-модели для сортировки и во вьюверах, я обнаружила, что они не прльзуются данными этого сигнала, потому что имеют указатель на модель, и "танцуют"уже от неё. Хотя, в идеале указатель на модель должен приходить в индексе parent. Если бы авторы в parent, который указывает на рутовый (скрытый внутри модели) элемент, передавали бы модель, было бы гораздо легче.
В общем, моё резюме такое, QStandardModel можно исподьзовать только в самых примитивных случаях или применять какие-то искусственные приёмы. Например, для двумерной таблицы или списка сперва вставлять рутовый элемен, а на нём уже городить список или таблицу. Тогда parent в сигнале всегда будет валидным.
Лучший выход - писать свою модель.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
wiz29
  опции профиля:
сообщение 29.12.2014, 17:10
Сообщение #4


Старейший участник
****

Группа: Участник
Сообщений: 600
Регистрация: 7.7.2010
Из: Санкт-Петербург
Пользователь №: 1866

Спасибо сказали: 94 раз(а)




Репутация:   12  


просто если добавляется строка верхнего уровня у нее естественно не будет валидного предка, тк это просто QModelIndex(). Можно конечно сделать фиктивный элемент дерева и настроить представления относительно этого элемента, если очень не хочется хранить данные на модель. Но на мой взгляд было бы правильней иметь все же данные об объекте в "приемнике" сообщения либо брать его через sender в этом нет ничего неприличного.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Анна
  опции профиля:
сообщение 13.1.2015, 14:54
Сообщение #5


Активный участник
***

Группа: Участник
Сообщений: 276
Регистрация: 22.5.2008
Из: Зеленоград
Пользователь №: 181

Спасибо сказали: 30 раз(а)




Репутация:   4  


Цитата(wiz29 @ 29.12.2014, 17:10) *
просто если добавляется строка верхнего уровня у нее естественно не будет валидного предка, тк это просто QModelIndex(). Можно конечно сделать фиктивный элемент дерева и настроить представления относительно этого элемента, если очень не хочется хранить данные на модель. Но на мой взгляд было бы правильней иметь все же данные об объекте в "приемнике" сообщения либо брать его через sender в этом нет ничего неприличного.

Так и я ж об этом. В том-то и дело, что приходится мудрить.

Цитата(wiz29 @ 29.12.2014, 17:10) *
Но на мой взгляд было бы правильней иметь все же данные об объекте в "приемнике" сообщения либо брать его через sender в этом нет ничего неприличного.

Что-то во мне протестует против этого "правильнее". Моему приёмнику правилнее было бы абсолютно наплевать, откуда его известили о новом элементе, а так, ему нужно держать указатели на модели, от которых может прийти сигнал, да ещё и иметь отдельный слот для каждой модели. А если использовать sender, то слотом уже невозможно воспользоваться как обычной функцией.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 13.1.2015, 19:59
Сообщение #6


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


Для такого есть QSignalMapper.
http://qt-project.org/doc/qt-4.8/qsignalmapper.html
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 29.11.2024, 15:23