crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> вопрос по QDataWidgetMapper
Гость_Гость_asket_*_*
сообщение 31.5.2013, 8:25
Сообщение #1





Гости








    


вопрос по QDataWidgetMapper, я создал свою модель-наследника QAbstractTableModel , привязал к полям данной модели GUI-виджеты (lineEdit, spinBox и прочее ) с помощью QDataWidgetMapper, но значения полей меняются в случае потери фокуса виджета, как сделать чтобы значения полей менялись при изменении значении параметров виджета? Например, spinBox прокручивается, а значение поля модели не меняется, оно изменится в случае, если spinBox потеряет фокус или нажата Enter, что нежелательно. Спасибо.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 31.5.2013, 17:21
Сообщение #2


фрилансер
******

Группа: Участник
Сообщений: 2890
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

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




Репутация:   34  


а вызов метода модели reset() не помогает ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 31.5.2013, 19:09
Сообщение #3


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


так и не понял как должно работать, а как - нет
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
asket
  опции профиля:
сообщение 3.6.2013, 8:28
Сообщение #4


Студент
*

Группа: Новичок
Сообщений: 15
Регистрация: 18.1.2012
Пользователь №: 3139

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




Репутация:   0  


Litkevich Yuriy, предположим на форме висит spinBox, когда мышкой прокручиваете параметры-счетчик, в соответствующем поле модели значение не меняется, а поменяется значение тогла когда spinBox или потеряет фокус (когда tab клавищей перейдете на другой виджет) или нажмете enter. Мне надо, чтобы соответствующее поле в модели менялось при прокручивании spinBox, крутите мышкой - синхронно меняется значение поля в модели, а не в случае потери фокуса или нажатия enter. Такое впечатление что QDataWidgetMapper ждет сигнала editFinished() а не textChanged или valueChanged(int) чтобы изменить параметры полей в модели.

  QSpinBox *spinBox = new spinBox(this);
  ....

  model = new TableModel(this);
  widgetMapper = new QDataWidgetMapper(this);
  widgetMapper->setModel(model);
  widgetMapper->addMapping(lineEdit_1, 0);
  widgetMapper->addMapping(lineEdit_2, 1);
  widgetMapper->addMapping(lineEdit_3, 2);
  widgetMapper->addMapping(spinBox, 3);
  widgetMapper->toFirst();




Алексей1153, reset() вызывается в самом модели и является protected-функцией, модель работает, синхронизировал с TreeView проблем нет.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Анна
  опции профиля:
сообщение 3.6.2013, 12:35
Сообщение #5


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

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

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




Репутация:   4  


Подсуньте вместо спинбокса какого-нибудь посредника, который будет по каждому сигналу от спинбокса слать мапперу editFinished(), ну и значение из спинбокса возвращать.
В конце концов, вы хотите добиться несколько нестандартного (по замыслу авторов) поведения от пары спинбокс-маппер, так реализуйте его своими силами с помощью перегрузки спинбокса, например.

Это чисто общие соображения. Просто именно с изменением поведения спинбокса уже приходилось иметь дело.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
asket
  опции профиля:
сообщение 5.6.2013, 9:47
Сообщение #6


Студент
*

Группа: Новичок
Сообщений: 15
Регистрация: 18.1.2012
Пользователь №: 3139

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




Репутация:   0  


Я немного по другому сделал, с использованием QSignalMapper, соединил сигналы textChanged() и valueChanged() со всех виджетов с одним слотом, который вызывает функцию обновления модели submit, но почему то заработало только тогда, когда я в функции добавления виджета addMapping указал свойства "value" и "text", хотя во всех примерах свойства не используются и прекрасно работают, ну и ладно. Теперь очередная проблема как заставить QDataWidgetMapper обновлять содержимое виджетов по изменению содержимого модели?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Анна
  опции профиля:
сообщение 5.6.2013, 14:52
Сообщение #7


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

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

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




Репутация:   4  


Я поглядела на функцию addMapping().
Там, насколько я поняла после беглого взгляда, маппер пользуется eventFilter() от делегата QItemDelegat. может, стоит делегата перегрузить, а не спинБокс..

Гость_Гость_asket_*_*,
Цитата(Гость_Гость_asket_*_* @ 31.5.2013, 9:25) *
создал свою модель-наследника QAbstractTableModel

Цитата(asket @ 5.6.2013, 10:47) *
Теперь очередная проблема как заставить QDataWidgetMapper обновлять содержимое виджетов по изменению содержимого модели?


Ну, наверное, ваша модель должна где-то посылать сигнал dataChanged ( const QModelIndex & topLeft, const QModelIndex & bottomRight ), и , скорей всего, это "где-то" функция setData() у модели.

Я бы начала исследования этого вопроса с исходника QDataWidgetMapper, конкретно - функции setModel().
...
и там, действительно происходит connect(model, SIGNAL(dataChanged ...),...);

Сообщение отредактировал Анна - 5.6.2013, 16:03
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 23.2.2020, 13:50