QStandardModel и сигнал rowsInserted() |
Здравствуйте, гость ( Вход | Регистрация )
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 |
Можно сохранять ссылку на модель внутри получателя сигнала. Тем более если есть некие посредники. Либо как раз использовать посредника, который связан с моделью и выдает сигнал (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 |
просто если добавляется строка верхнего уровня у нее естественно не будет валидного предка, тк это просто QModelIndex(). Можно конечно сделать фиктивный элемент дерева и настроить представления относительно этого элемента, если очень не хочется хранить данные на модель. Но на мой взгляд было бы правильней иметь все же данные об объекте в "приемнике" сообщения либо брать его через sender в этом нет ничего неприличного. Так и я ж об этом. В том-то и дело, что приходится мудрить. Но на мой взгляд было бы правильней иметь все же данные об объекте в "приемнике" сообщения либо брать его через 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 |
|
|
Текстовая версия | Сейчас: 26.11.2024, 1:07 |