es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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())

resultado:
enter image description here

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())

resultado:
enter image description here

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?

Tags:  ,

Answer

  1. Avatar for 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:

    1. Utiliza el modo DragDrop en lugar de InternalMove, que parece funcionar bien:
      self.setDragDropMode(QAbstractItemView.DragDropMode.DragDrop)
      self.setDefaultDropAction(Qt.MoveAction)
      
    2. Implementa tu propia funcionalidad de arrastrar y soltar utilizando eventos del ratón, como se sugiere en el post de StackOverflow que mencionaste.

    También sugiero que reportes este problema a los desarrolladores de PySide6 para que puedan solucionarlo en una futura versión.

Comments are closed.