Borrar elemento de lista seleccionado (por lo que no hay un elemento de lista seleccionado) en Python/Pyside

StackOverflow https://stackoverflow.com/questions/8363064

  •  27-10-2019
  •  | 
  •  

Pregunta

Tengo una aplicación escrita en Python usando Pyside, la UI fue creada con QT Designer.

Tengo una lista en la ventana, que tiene un conjunto de elementos. Cuando la aplicación se carga, parece obtener el último elemento en la lista (aunque no hay una fila 'resaltada' que se muestre en la lista). Si rompe y verifico si hay un elemento seleccionado en ese momento, obtendré el último elemento en la lista.

Tengo este código:

    @QtCore.Slot(QTreeWidgetItem,QTreeWidgetItem)
    def on_list_currentItemChanged(self,current=None,previous=None):
        if current:
            self.ui.actionDelete_Task.setEnabled(True)
        else:
            self.ui.actionDelete_Task.setEnabled(False)

Que determina si hay un elemento actual seleccionado. Entonces, tras la carga inicial, espero que la corriente esté vacía, pero no lo está, apunta al último elemento de la lista, a pesar de que no se ha seleccionado ningún elemento.

¿Hay algo que me falta? O, alternativamente, ¿cómo le digo a la lista que no tenga una fila seleccionada/deseleccione todas las filas?

En última instancia, lo que estoy buscando es (a) que cuando se carga el formulario y la lista se muestra originalmente sin elemento seleccionado, que el botón Eliminar está deshabilitado e incluso (b) si alguien debe eliminar un elemento a través de esta acción, hay ganado. Es un elemento seleccionado después de eso (por lo que no pudieron solo presionar eliminar dos veces y eliminar dos filas en secuencia).

¿Fue útil?

Solución

El elemento actual y la selección no son necesariamente lo mismo. El elemento actual se refiere al elemento con el enfoque del teclado; La selección se refiere a los elementos resaltados actualmente. Por lo tanto, un widget de árbol sin selección aún tendrá un elemento actual (a menos que no tenga elementos en absoluto).

Entonces, una solución podría ser simplemente verificar que el elemento actual también esté seleccionado:

@QtCore.Slot(QTreeWidgetItem, QTreeWidgetItem)
def on_list_currentItemChanged(self, current=None, previous=None):
    if current is not None and current.isSelected():
        self.ui.actionDelete_Task.setEnabled(True)
    else:
        self.ui.actionDelete_Task.setEnabled(False)

EDITAR

Después de echar un vistazo al código fuente de QT, parece que el código anterior no funcionará porque el currentItemChanged La señal se emite antes de que la selección se reinicie.

Entonces, en cambio, sugeriría usar el itemSelectionChanged señal y verificar el selectedItems:

def on_list_ItemSelectionChanged(self):
    if self.list.selectedItems():
        self.ui.actionDelete_Task.setEnabled(True)
    else:
        self.ui.actionDelete_Task.setEnabled(False)

NB: Tomar este enfoque también puede implicar reemplazar el uso de currentItem() con selectedItems()[0] en otra parte de su código.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top