Arrastrar una fila a su índice elimina la fila en PySide6 QListWidget.
import sys, os
from PySide6.QtCore import *
from PySide6.QtGui import *
from PySide6.QtWidgets import *
from ui_listitem import *
class miItem(QWidget):
def __init__(self, parent = None) -> None:
super().__init__(parent=parent)
self.ui = Ui_rootWidget() # esta ui solo tiene 2 labels de texto alineados horizontalmente
self.ui.setupUi(self)
class miLista(QListWidget):
def __init__(self, parent = None) -> None:
super().__init__(parent=parent)
self.resize(400, 400)
self.setDragDropMode(QAbstractItemView.DragDropMode.InternalMove)
for i in range(10):
wi = QListWidgetItem(self)
wi.widget = miItem(self)
wi.widget.ui.label1.setText(f'text{i}')
wi.widget.ui.label2.setText(f'text{i}')
wi.setSizeHint(wi.widget.sizeHint())
self.addItem(wi)
self.setItemWidget(wi, wi.widget)
if __name__ == '__main__':
app = QApplication(sys.argv)
w = miLista()
w.show()
sys.exit(app.exec())
Uh … no sé qué sucedió. ¿Qué debo hacer para que funcione?
Leí una publicación (https://stackoverflow.com/questions/30291628/internalmove-in-qlistwidget-makes-item-disappear). Intenté setDefaultDropAction(Qt.TargetMoveAction)
o setMovement(QListView.Free)
o ambos, pero no funcionó.
Estoy usando python 3.9.7, pyside 6.2.1, en Windows 10 Pro 20H2 19042.1348 build.
Añadido.
Ocurre una desaparición similar pero no idéntica en un QListView sin un widget personalizado.
import sys, os
from PySide6.QtCore import *
from PySide6.QtGui import *
from PySide6.QtWidgets import *
class myDelegate(QStyledItemDelegate):
def sizeHint(self, option, index):
return QSize(350, 35)
class myList(QListView):
def __init__(self, parent = None) -> None:
super().__init__(parent=parent)
self.resize(400, 400)
self.setDragDropMode(QAbstractItemView.DragDropMode.InternalMove)
self.model = QStandardItemModel(self)
self.setModel(self.model)
self.delegate = myDelegate(self)
self.setItemDelegate(self.delegate)
for i in range(10):
item = QStandardItem(f'text{i}')
self.model.appendRow(item)
self.setDragDropOverwriteMode(False)
if __name__ == '__main__':
app = QApplication(sys.argv)
w = myList()
w.show()
sys.exit(app.exec())
Intenté setDefaultDropAction
con Qt.MoveAction, Qt.CopyAction o Qt.TargetMoveAction
, pero ninguno funcionó.
¿Esto es todo lo que se pretendía originalmente? Por favor, háganme saber cómo mover elementos en listview o listwidget sin que desaparezcan. ¿O tal vez es imposible?
davy.ai
Parece que hay un fallo con el modo InternalMove en PySide6, ya que los elementos desaparecen al moverlos. Puedes probar las siguientes soluciones alternativas:
También sugiero que reportes este problema a los desarrolladores de PySide6 para que puedan solucionarlo en una futura versión.