Russian Qt Forum
Ноябрь 23, 2024, 07:53 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как widget mapper'у подсунуть собственный виджет? Язык Питон.  (Прочитано 2407 раз)
Пытон
Гость
« : Январь 19, 2014, 16:11 »

Создал свой класс на основе QComboBox, пусть он называется MyCombo
Как теперь его привязать к QtGui.QDataWidgetMapper()?
Дело в том, что значение, которое должен взять маппер вовсе не то, что отображается в комбобоксе. Там описание некоего кода. Ну, к примеру, комбобокс показывает нам табличку в которой два поля: код (123), описание кода (сто двадцать третий). Так вот, в комбобоксе фигурирует описание, понятное пользователю, а в таблицу SQLite, которая связана с маппером, должно попасть значение кода, а не описания.

Вот такой вот у меня комбобокс. При клике на него появляется указанная таблица со всеми её полями, поиск происходит по указанному столбцу, а взять итоговое значение нужно из другого столбца. А потом ещё это значение заВиджетМапперить в таблицу в БД.
Код
Python
Class MyCombo
   def __init__(sf, connection, table, field_for_search, field_for_result)
       QtGui.QComboBox.__init__()
       sf.value = None
       sf.view = QtGui.QTableView()
       sf.model = QtSqlTableModel(None, connection)
       sf.model.setTable(table)
       sf.model.select()
       sf.view.setModel(sf.view)
 
       sf.setModel(sf.model)
       sf.setModelColumn(sf.model.fieldIndex(field_for_search))
       sf.setView(sf.view)
 
       sf.activated.connect(sf.onSelect)
 
   def onSelect(sf):
       sf.value = sf.model.record(sf.currentIndex().value(sf.field_for_result))
 
То значение, что должно попасть в таблицу связанную с виджетмаппером получается в sf.value. Как его подсунуть мапперу?
Или вообще я делаю всё не так как надо бы?
Записан
Пытон
Гость
« Ответ #1 : Март 15, 2014, 09:25 »

Сделал sf.value в классе MyCombo вот таким.
sf.value = QtGui.QLineEdit()
Теперь его можно привязать к мапперу типа так:
Создать комбобокс из моего класса:
combo = MyCombo(someConnection, "someTable", "fieldForSearch", "fieldForResult")
Затем организовать маппер так:
mapper = QtGui.QWidgerMapper()
mapper.setModel(someModel)
mapper.addMapping(combo.value, someModel.fieldIndex("someField"))

Теперь маппер реагирует на данные в MyCombo.value
Но, проблема: реагирует он только после того, как пользователь что-нибудь выберет в комбобоксе. Если пользователь ничего не выбирал (не кликал мышкой, не крутил колёсиком, сменяя пункты), то маппер никак не отреагирует, и то значение, которое появляется в комбобоксе по-умолчанию при его появлении не будет маппером записано в таблицу БД.
Короче, маппер среагирует только при щелчке/выборе значения в комбобоксе пользователем.
Но ведь я же связал, вроде бы, маппер не с комбобоксом, а с lineEdit'ом, который стал частью комбобокса. Почему он реагирует на события комбобокса, а не lineEdit'а?
Я пытался напрямую в __init__ вызвать процедуру OnSelect() - ноль эмоций у маппера.

Код
Python
Class MyCombo(QtGui.QComboBox)
   def __init__(sf, connection, table, field_for_search, field_for_result)
       QtGui.QComboBox.__init__()
       #sf.value = None
       sf.value = QtGui.QLineEdit()
 
       sf.view = QtGui.QTableView()
       sf.model = QtSqlTableModel(None, connection)
       sf.model.setTable(table)
       sf.model.select()
       sf.view.setModel(sf.view)
 
       sf.setModel(sf.model)
       sf.setModelColumn(sf.model.fieldIndex(field_for_search))
       sf.setView(sf.view)
 
       sf.activated.connect(sf.onSelect)
 
   def onSelect(sf):
       sf.value.setText(sf.model.record(sf.currentIndex().value(sf.field_for_result)))

Подскажите, как заставить маппер реагировать на лайнэдит?
Записан
vregess
Гость
« Ответ #2 : Март 16, 2014, 09:32 »

Может быть стоит посмотреть на QDataWidgetMapper::setItemDelegate()?
Напиши свой делегат, который будет преобразовывать значение модели в значение для combobox (и обратно).
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.071 секунд. Запросов: 20.