2016-11-24 18 views
2

Я использую QTableView и подклассифицирован QAbstractTableModel. При редактировании ячейки я заметил, что QAbstractTableModel.setData проходит только через последнюю выбранную ячейку. Есть ли способ получить setData для работы с несколькими (выделенными) ячейками?PySide QTableView setData для нескольких ячеек

В качестве примера использования:

  • Выберите четыре ячейки из таблицы.
  • Начать редактирование на одной ячейке.
  • Введите значение и нажмите enter для фиксации.
  • имеет ценность изменить все четыре ячейки (в настоящее время он просто изменяет ячейку, выбранный последним)

Я попытался к югу от причислять closeEditor, затем пробегает по selectedIndexes называть их setData, но я не знаю, как получить входное значение пользователя от closeEditor.

Вот моя попытка, почти получившая ее, просто нужна входная величина.

def closeEditor(self, editor, hint): 
    is_cancelled = (hint == QtGui.QAbstractItemDelegate.RevertModelCache) 

    if not is_cancelled: 
     for index in self.selectedIndexes(): 
      if index == self.currentIndex(): 
       continue 

      input_value = ??? # Don't know how to get this from here! 

      self.model().setData(index, input_value, QtCore.Qt.EditRole) 

    return QtGui.QTableWidget.closeEditor(self, editor, hint) 

ответ

2

editor в closeEditor сигнала является виджет, который был использован для редактирования.

Если это, например, QLineEdit, вы можете прочитать его текст через свой text.

Один из способов, чтобы получить значение свойства через свойство API QObject в

value = editor.property("text") 
+0

Редактор является «QWidget», поэтому нет текстового свойства. –

+0

Как я писал: если виджет является 'QLineEdit', то он имеет свойство text. То есть это зависит от того, какой виджет используется в качестве редактора. Делегат по умолчанию использовал редактирование строк для текста, спиновых полей для чисел и т. Д. –

+0

Я использую значение по умолчанию, и он не использует ни один из них ... –

0

Изменить: Я использовал это в качестве обходного, как там была ошибка в PySide где editor был только возвращающая QWidget. Посмотрите на ответ Кевина Краммера!

Хотя это небольшая работа, решение, которое я до сих пор, кажется, работает нормально. Пожалуйста, дайте мне знать, если есть лучший способ, это немного затянуто.

В closeEditor Я делаю каждую ячейку через setData с None в качестве значения.

Тогда в QAbstractTableModel У меня есть переменная _input_value, которая будет хранить вход пользователя для остальной ячейки для захвата.

class TableView(QtGui.QTableView): 

    def __init__(self, parent=None): 
     super(TableView, self).__init__(parent) 

    def closeEditor(self, editor, hint): 
     is_cancelled = (hint == QtGui.QAbstractItemDelegate.RevertModelCache) 

     if not is_cancelled: 
      for index in self.selectedIndexes(): 
       if index == self.currentIndex(): 
        continue 

       # Supply None as the value 
       self.model().setData(index, None, QtCore.Qt.EditRole) 

     # Reset value for next input 
     if self.model()._input_value is not None: 
      self.model()._input_value = None 

     return QtGui.QTableWidget.closeEditor(self, editor, hint) 


class TableModel(QtCore.QAbstractTableModel): 

    def __init__(self, parent=None): 
     super(TableModel, self).__init__(parent) 

     self.main_widget = parent 

     self._input_value = None 

    def setData(self, index, value, role): 
     # Triggers if user cancelled input 
     if value is None and self._input_value is None: 
      return False 

     if self._input_value is None: 
      # The last selected cell will pass through here to store the value. 
      self._input_value = value 
     else: 
      # All other cells will pass None, so just grab our stored value. 
      value = self._input_value 

     # Do whatever you want with value now 

     return True