2017-08-13 37 views
0

私は単にオブジェクトのリストを表示するQListWidgetを使用しています。私は、ユーザーが内部ドラッグアンドドロップでこれらの項目を並べ替えることを許可します。すべて機能しますが、ユーザーが削除(並べ替え)しようとすると、チェックを追加する必要があります。チェックが失敗した場合は、元の注文をプログラムで再設定します。ここで私が持っているものです:それはアイテムを複製することがあるのでQListWidgetのドラッグ・ドロップ操作からプログラムで戻って戻す方法は?

class SequenceControl(QListWidget): 
    def __init__(self, parent = None): 
     super(SequenceControl, self).__init__(parent) 

     self.initialIndex = 0 
     self.selectedObject = None 
     self.setAcceptDrops(True) 
     self.setDragEnabled(True) 
     self.setDragDropMode(QAbstractItemView.InternalMove) 


    def dragEnterEvent(self, event): 
     super(SequenceControl, self).dragEnterEvent(event) 

     self.selectedObject = self.currentItem() 
     self.initialIndex = self.currentRow() 

    def dropEvent(self, event): 
     super(SequenceControl, self).dropEvent(event) 

     # Some logic here (not shown) to see if the drop is not 
     # allowed. Assume it isn't: 
     warningDialog = MyWarningDialog(self.parent) 
     ProceedAnyway = warningDialog.exec_() 

     if ProceedAnyway: 
      # Do stuff... 
     else: 
      # Here's the problem. I need to place the item being dropped 
      # back in its initial pre-drag/drop location. The following 
      # naïve attempt doesn't work: 
      self.insertItem(self.initialIndex, self.selectedObject) 

上記は、(私は信じて)確かに間違っています。しかしそれとは別に、問題はそれが効果がないように見えるということです。私はドロップイベントが並べ替えの面で私がやっていることをオーバーライドしていると思います。しかし、それはただの理論です。誰でもこれを行う正しい方法を知っていますか?

答えて

1

変更を元に戻すには、まずターゲット項目を削除する必要があります。このためには、を使用すると、削除するだけで項目が返され、insertItem()関数の助けを借りてソース位置に挿入されます。

class SequenceControl(QListWidget): 
    def __init__(self, parent=None): 
     super(SequenceControl, self).__init__(parent) 

     self.fromPos = None 
     self.setAcceptDrops(True) 
     self.setDragEnabled(True) 
     self.setDragDropMode(QAbstractItemView.InternalMove) 

    def dragEnterEvent(self, event): 
     super(SequenceControl, self).dragEnterEvent(event) 
     self.fromPos = self.currentRow() 

    def dropEvent(self, event): 
     super(SequenceControl, self).dropEvent(event) 

     reply = QMessageBox.question(None, "Revert to Drag and Drop", 
            "Do you want to keep the change?", 
            QMessageBox.Yes | QMessageBox.No) 
     if reply == QMessageBox.Yes: 
      print("Do stuff...") 
     else: 
      currentItem = self.takeItem(self.currentRow()) 
      self.insertItem(self.fromPos, currentItem) 
関連する問題