Faites glisser et déposez les lignes à l'intérieur de QTableWidget

Objectif

Mon but est d'avoir un QTableWidget dans laquelle l'utilisateur peut glisser/déposer les lignes en interne. Qui est, l'utilisateur peut faire glisser et de déposer une ligne entière, en le déplaçant vers le haut ou vers le bas dans le tableau à un autre emplacement dans l'entre deux autres lignes. Le but est illustré dans cette figure:

Faites glisser et déposez les lignes à l'intérieur de QTableWidget

Ce que j'ai essayé, et ce qui se passe

Une fois que j'ai rempli un QTableWidget avec les données, je définissez ses propriétés comme suit:

table.setDragDropMode(QtGui.QAbstractItemView.InternalMove)   
#select one row at a time
table.setSelectionMode(QtGui.QAbstractItemView.SingleSelection) 
table.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)

Même code rend QListWidget se comportent bien: lorsque vous déplacez un élément interne, il est tombé entre deux éléments de la liste, et le reste des éléments arrangent d'elles-mêmes, d'une manière raisonnable, en l'absence de données écrasées (en d'autres termes, le point de vue des actes comme la figure ci-dessus, mais c'est une liste).

En revanche, dans un tableau modifié avec le code ci-dessus, les choses ne fonctionnent pas comme prévu. La figure suivante montre ce qui se passe réellement:

Faites glisser et déposez les lignes à l'intérieur de QTableWidget

Dans les mots: lors de la ligne je est tombé, cette ligne devient vide dans le tableau. De plus, si je tombe accidentellement ligne je sur la ligne j (au lieu de l'espace entre deux lignes), les données à partir de la ligne je remplace les données dans la ligne j. C'est, dans ce cas malheureux, en plus de la ligne je devenir vide, ligne j est écrasé.

Remarque j'ai aussi essayé d'ajouter table.setDragDropOverwriteMode(False) mais il n'a pas changé le comportement.

Une voie à suivre?

Ce rapport de bug peut inclure une solution possible en C++: il semble qu'ils réimplémentée dropEvent pour QTableWidget, mais je ne suis pas sûr de savoir comment proprement port de Python.

Contenu connexe:

qt-project.org est mort, bug maintenant à bugreports.qt.io/parcourir/QTBUG-13873

OriginalL'auteur neuronet | 2014-10-07