2015-07-06 8 views
1

Я использую Python 3.4.3 и PyQt 5.4.2 и имею некоторые проблемы при попытке получить данные из строкиInserted signal.Не удается получить данные из rowsInserted signal

Я хочу получить данные из всех элементов, находящихся рядом с отброшенным элементом после операции сброса.

Вот некоторые из моего кода (весь класс модель слишком большой, надеюсь, что эта часть достаточно):

class PlModel(QtGui.QStandardItemModel): 
    def __init__(self): 
     self.rowsInserted.connect(self.printSomeData) 

    def supportedDragActions(self): 
     return QtCore.Qt.MoveAction 

    def supportedDropActions(self): 
     return QtCore.Qt.CopyAction | QtCore.Qt.MoveAction 

    def canDropMimeData(self, QMimeData, Qt_DropAction, p_int, p_int_1, QModelIndex): 
     if not self.itemFromIndex(QModelIndex) and p_int_1 == p_int == -1: 
      return False 
     elif QModelIndex.isValid(): 
      if self.item(self.itemFromIndex(QModelIndex).row(), 0) is None: 
       return False 
      else: 
       return QtGui.QStandardItemModel.canDropMimeData(self, QMimeData, Qt_DropAction, p_int, p_int_1, QModelIndex) 
     else: 
      return QtGui.QStandardItemModel.canDropMimeData(self, QMimeData, Qt_DropAction, p_int, p_int_1, QModelIndex) 

    def dropMimeData(self, mimedata, dropaction, row, col, modelindex): 
     if not self.itemFromIndex(modelindex): 
      if row == col == -1: 
       return False  
      else: 
       return QtGui.QStandardItemModel.dropMimeData(self, mimedata, dropaction, row, 0, self.index(row, 0)) 
     elif self.itemFromIndex(modelindex).isDragEnabled(): 
      if row == col == -1: 
       crow = self.item(modelindex.row(), 0).rowCount() 
       return QtGui.QStandardItemModel.dropMimeData(self, mimedata, dropaction, crow, 0, self.indexFromItem(self.item(modelindex.row(), 0))) 
      else: 
       return QtGui.QStandardItemModel.dropMimeData(self, mimedata, dropaction, row, 0, modelindex) 
     elif self.itemFromIndex(modelindex).isDropEnabled(): 
      if col != -1: 
       return False 
      else: 
       return QtGui.QStandardItemModel.dropMimeData(self, mimedata, dropaction, row, 0, modelindex) 
     else: 
      return QtGui.QStandardItemModel.dropMimeData(self, mimedata, dropaction, row, 0, modelindex) 

    def printSomeData(self, ind: QtCore.QModelIndex, first, last): 
     row = ind.row() 
     item = self.itemFromIndex(ind) 
     for i in range(0, item.rowCount()): 
      print(self.index(i, 0, ind).data(QtCore.Qt.DisplayRole)) 

Этот код печатает достоверные данные по всем пунктам, за исключением пункта упал. Для сброшенного объекта он выводит «Нет». После сброса в QTreeView все данные в порядке. Что с этим не так?

Извините за мой плохой английский.

+0

Как операцию работы падение? Это помогло бы иметь [MCVE] (http://stackoverflow.com/help/mcve). – Mel

+0

@tmoreau Я пытался расширить свой пример кода. К сожалению, класс модели слишком велик и зависит от некоторых других частей моей программы. – lermont

ответ

1

Кажется, что строкиInserted сигнал испускает после того, как строки были вставлены, но до того, как модель заполнит данные в вставленных строках. Таким образом, я вызываю функцию printSomeData из функции dropMimeData (после удаления данных), и она работает.

Вот исправленный код:

class PlModel(QtGui.QStandardItemModel): 
    def __init__(self): 
     QtGui.QStandardItemModel.__init__(self) 
     # no need for connect 
     #self.rowsInserted.connect(self.printSomeData) 

    def supportedDragActions(self): 
     return QtCore.Qt.MoveAction 

    def supportedDropActions(self): 
     return QtCore.Qt.CopyAction | QtCore.Qt.MoveAction 

    def canDropMimeData(self, QMimeData, Qt_DropAction, p_int, p_int_1, QModelIndex): 
     if not self.itemFromIndex(QModelIndex) and p_int_1 == p_int == -1: 
      return False 
     elif QModelIndex.isValid(): 
      if self.item(self.itemFromIndex(QModelIndex).row(), 0) is None: 
       return False 
      else: 
       return QtGui.QStandardItemModel.canDropMimeData(self, QMimeData, Qt_DropAction, p_int, p_int_1, QModelIndex) 
     else: 
      return QtGui.QStandardItemModel.canDropMimeData(self, QMimeData, Qt_DropAction, p_int, p_int_1, QModelIndex) 

    def dropMimeData(self, mimedata, dropaction, row, col, modelindex): 
     if not self.itemFromIndex(modelindex): 
      if row == col == -1: 
       return False  
      else: 
       result = QtGui.QStandardItemModel.dropMimeData(self, mimedata, dropaction, row, 0, self.index(row, 0)) 
       if result: 
        self.printSomeData(self.index(row, 0)) 
       return result 
     elif self.itemFromIndex(modelindex).isDragEnabled(): 
      if row == col == -1: 
       crow = self.item(modelindex.row(), 0).rowCount() 
       result = QtGui.QStandardItemModel.dropMimeData(self, mimedata, dropaction, crow, 0, self.indexFromItem(self.item(modelindex.row(), 0))) 
       if result: 
        self.printSomeData(self.indexFromItem(self.item(modelindex.row(), 0))) 
       return result 
      else: 
       result = QtGui.QStandardItemModel.dropMimeData(self, mimedata, dropaction, row, 0, modelindex) 
       if result: 
        self.printSomeData(modelindex) 
       return result 
     elif self.itemFromIndex(modelindex).isDropEnabled(): 
      if col != -1: 
       return False 
      else: 
       result = QtGui.QStandardItemModel.dropMimeData(self, mimedata, dropaction, row, 0, modelindex) 
       if result: 
        self.printSomeData(modelindex) 
       return result 
     else: 
      result = QtGui.QStandardItemModel.dropMimeData(self, mimedata, dropaction, row, 0, modelindex) 
       if result: 
        self.printSomeData(modelindex) 
       return result 

    def printSomeData(self, ind: QtCore.QModelIndex): 
     row = ind.row() 
     item = self.itemFromIndex(ind) 
     for i in range(0, item.rowCount()): 
      print(self.index(i, 0, ind).data(QtCore.Qt.DisplayRole)) 
Смежные вопросы