Cancella elemento elenco selezionato (quindi non esiste un elemento elenco selezionato) in Python/Pyside

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

  •  27-10-2019
  •  | 
  •  

Domanda

Ho un'applicazione scritta in Python usando Pyside, l'interfaccia utente è stata creata con QT Designer.

Ho un elenco nella finestra, che ha una serie di elementi. Quando l'applicazione si carica, sembra afferrare l'ultimo elemento nell'elenco (anche se non c'è una riga "evidenziata" che mostra nell'elenco). Se rompo e controllo se in quel momento è presente un elemento selezionato, otterrò l'ultimo elemento nell'elenco.

Ho questo codice:

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

Che determina se è selezionato un elemento corrente. Quindi, al carico iniziale, mi aspetto che la corrente sia vuota, ma non lo è, indica l'ultimo elemento nell'elenco, anche se non è stato selezionato alcun elemento.

C'è qualcosa che mi manca? Oppure, in alternativa, come faccio a dire all'elenco di non avere una riga/deselezione selezionata tutte le righe?

Alla fine quello che sto cercando è (a) che quando il modulo si carica e l'elenco è originariamente mostrato senza alcun elemento selezionato, il pulsante di eliminazione è disabilitato e persino (b) se qualcuno deve eliminare un elemento attraverso questa azione, è vinto lì dopo essere un elemento selezionato (quindi non potevano semplicemente colpire eliminare due volte ed eliminare due righe in sequenza).

È stato utile?

Soluzione

L'articolo attuale e la selezione non sono necessariamente la stessa cosa. L'articolo corrente si riferisce all'articolo con il focus della tastiera; La selezione si riferisce agli articoli attualmente evidenziati. Quindi un widget ad albero senza selezione avrà comunque un elemento corrente (a meno che non abbia alcun elemento).

Quindi una soluzione potrebbe essere semplicemente verificare che sia selezionato anche l'elemento corrente:

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

MODIFICARE

Dopo aver dato un'occhiata al codice sorgente QT, sembra che il codice sopra non funzioni perché il currentItemChanged Il segnale viene emesso prima che la selezione venga ripristinata.

Quindi, invece, suggerirei di usare il itemSelectionChanged segnale e controllando il selectedItems:

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

NB: adottare questo approccio può anche comportare la sostituzione dell'uso di currentItem() insieme a selectedItems()[0] Altrove nel tuo codice.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top