![]() |
|
|
![]()
|
|
| olegkuzn |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 84 Регистрация: 1.10.2007 Репутация: нет Всего: нет |
Здраствуйте.
Помогите решить проблему. 1. Есть класс модели производный от QAbstractItemModel 2. Есть класс отображения данныйх модели производный от QTreeView 3. Есть класс Delegate производный от QItemDelegate В классе делегата есть перегруженная ф-ция createEditor. В одном из вариантов работы она возвращает указатель на объект класса QSpinBox и устанавливается связь с моделью данных по изменению значений в виджете.
В SLOTE модели должно произойти изменение данных с родительским индексом и отображение данных в классе отображения модели.
В ф-ции PropertyModel::ValueChanged пытаюсь "прорисовать" данные родительского индекса в отображении. Результат - 0. Хотя после окончания работы виджета данные "перерисовываются". Как сделать так, чтобы данные изменялись в отоборажении по сигналу виджета valueChanged(int i). Если есть примеры с подобной задачей то не могли уприслать или указать - где их найти. Заранее спасибо. |
||||
|
|||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
Логичнее разместить слот в делегате, а не нагружать модель не свойственными ей функциями. Модель можно использовать в двух QTreeView,
Именно в этом случае имеет смысл обновлять модель до окончания редактирования.
|
|||
|
||||
| olegkuzn |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 84 Регистрация: 1.10.2007 Репутация: нет Всего: нет |
Да. Действиельно так как вы предложили выглядит лучше.
Но к сожалению не решена проблема - как при редактировании данных по одному индексу происходила перерисовка данных по другому индексу. Думал сделать так :
Результата нет. |
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
А зачем ты делаешь emit dataChanged(parent, parent); ? Ты же не значение родительского индекса меняшь:
Добавлено через 3 минуты и 49 секунд судя по комментарию, emit dataChanged(parent, parent); тоже нужен, но каких-то emit не хватает. Как у тебя устроена модель? |
|||
|
||||
| olegkuzn |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 84 Регистрация: 1.10.2007 Репутация: нет Всего: нет |
Мне необходимо сделать так, чтобы после изменения данных индекса index по сигналу valueChanged(int i)
изменялось отображение данных родительского индекса index.parent(). При изменении данных в дочерних объектах данные в родительском объекте тоже изменяются (так реализована ф-ция QVariant PropertyModel::data). выражение emit dataChanged(parent, parent); должно (по идее) произвести эти изменения. (Например в рабочей среде Qt Creator в редакторе форм в окне свойств объекта при при редактировании подсвойства "Ширина" свойства "geometry" данные изменяютcя как в редакторе св-ва "Ширина" так и в родительском объекте "geometry") |
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
Возможно, у тебя неправильно реализована:
QVariant PropertyModel::data(const QModelIndex &index, int role = Qt::DisplayRole) const; Обрати внимание на различие Qt::EditRole и Qt::DisplayRole. Как правило, они должны возвращать одно и тоже, но могут быть различия (например, Qt::EditRole возвращает число, Qt::DisplayRole - строку) Редактор работает с Qt::EditRole, при отображении нередактирующегося значения используется Qt::DisplayRole. |
|||
|
||||
| olegkuzn |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 84 Регистрация: 1.10.2007 Репутация: нет Всего: нет |
Проверил работу с помощью консоли приложения.
Пока ничего не нашел. Хотя. При начале редактирования в помощью виджета выскакивает сообщение : Can't select indexes from different model or with different parents Из-за чего такое сообщение может появляться. Может здесь ошибка. |
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
Такая ошибка возникает, когда одной модели передаёшь индекс от другой модели (different model).
У тебя скорее всего different parents. Возникнет, например при
|
|||
|
||||
| olegkuzn |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 84 Регистрация: 1.10.2007 Репутация: нет Всего: нет |
Методом околонаучного тыка изменил выражение "emit dataChanged(parent, parent);" на выражение "emit dataChanged(index, parent);"
И... Заработало. Непонятно почему но заработало. (Хотя это и страшно.) Спасибо вам за помощь. |
|||
|
||||
![]()
|
| Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |