Effacer élément de la liste sélectionnée (donc il n'y a pas d'élément de liste sélectionné) en Python / PySide

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

  •  27-10-2019
  •  | 
  •  

Question

J'ai une demande écrite en Python en utilisant PySide, l'interface utilisateur a été créé avec QT Designer.

J'ai une liste dans la fenêtre qui a un ensemble d'éléments. Lorsque les charges d'application, il semble saisir le dernier élément dans la liste (même si il n'y a pas « mis en évidence » montrant la ligne dans la liste). Si je pause et vérifier s'il y a un élément sélectionné à ce moment-là, je vais obtenir le dernier élément de la liste.

J'ai ce code:

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

Ce qui détermine s'il y a un élément sélectionné. Donc, lors de la charge initiale, je pense être vide actuel, mais ce n'est pas, il pointe vers le dernier élément de la liste, même si aucun élément n'a été sélectionné.

Y at-il quelque chose que je suis absent? Ou, encore, comment puis-je dire la liste de ne pas avoir une ligne sélectionnée / désélectionner toutes les lignes?

En fin de compte ce que je cherche est (a) que lorsque les charges de formulaire et la liste est à l'origine présentés sans élément sélectionné, que le bouton de suppression est désactivée et même (b) si quelqu'un doit supprimer un élément dans cette action , il n'y aura pas un élément sélectionné après (afin qu'ils puissent non seulement frapper deux fois et suppression supprimer deux lignes dans l'ordre).

Était-ce utile?

La solution

L'élément en cours et la sélection ne sont pas nécessairement la même chose. L'élément en cours fait référence à l'élément avec le focus du clavier; la sélection se réfère aux éléments mis en surbrillance. Ainsi, un widget arbre sans sélection sera toujours un élément en cours (à moins qu'il ne dispose d'aucun élément du tout).

Une solution pourrait être de vérifier simplement que l'élément en cours est également sélectionné:

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

EDIT

Après avoir pris un coup d'oeil au code source Qt, il semble que le code ci-dessus ne fonctionnera pas parce que le signal de currentItemChanged est émis avant la sélection est remis à zéro.

Ainsi, au lieu, je suggère d'utiliser le signal de itemSelectionChanged, et vérifier la selectedItems:

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

NB:. Cette approche peut également entraîner le remplacement de l'utilisation de currentItem() avec selectedItems()[0] ailleurs dans votre code

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top