2010-02-10 12 views
3

Dans l'exemple ci-dessous:PyQt beginremoverows

from PyQt4 import QtCore, QtGui 

class Ui_Dialog(QtGui.QDialog): 

    def __init__(self,parent=None): 
     QtGui.QDialog.__init__(self,parent) 
     self.setObjectName("Dialog") 
     self.resize(600, 500) 

     self.model = QtGui.QDirModel() 
     self.tree = QtGui.QTreeView() 
     self.tree.setModel(self.model) 
     print(self.model.flags(self.model.index("c:\Program Files"))) 
     self.model.setFilter(QtCore.QDir.Dirs|QtCore.QDir.NoDotAndDotDot) 

     self.tree.setSortingEnabled(True) 

     self.tree.setRootIndex(self.model.index("c:\Program Files")) 

     #self.tree.hideColumn(1) 
     #self.tree.hideColumn(2) 
     #self.tree.hideColumn(3) 
     self.tree.setWindowTitle("Dir View") 
     self.tree.resize(400, 480) 
     self.tree.setColumnWidth(0,200) 

     self.tree.show() 
     QtCore.QObject.connect(self.tree, QtCore.SIGNAL("clicked(QModelIndex)"), self.test) 
     QtCore.QMetaObject.connectSlotsByName(self) 

     self.setWindowTitle(QtGui.QApplication.translate("Dialog", "Dialog", None, QtGui.QApplication.UnicodeUTF8)) 

    def test(self,index): 

     print(self.model.filePath(index)) 

     print(self.model.rowCount(index)) 
     #self.model.beginRemoveRows(index.parent(),index.row(),self.model.rowCount(index)) 
     #self.model.endRemoveRows() 

     print("Row of the index =",index.row()) 

     print("Parent = ",self.model.data(index.parent())) 

if __name__ == "__main__": 
    import sys 
    app = QtGui.QApplication(sys.argv) 
    ui = Ui_Dialog() 
    #ui.show() 
    sys.exit(app.exec_()) 

Je veux supprimer la ligne et de ses enfants (le cas échéant) quand je clique dessus.
(Le dossier sous clic et les enfants de celle-ci doivent être enlevés.)

Je sais que je fais erreur sur cette ligne:

self.model.beginRemoveRows(index.parent(),index.row(),self.model.rowCount(index)) 

Merci pour votre temps.

+0

Pouvez-vous expliquer le contexte? Est-ce que vous supprimez des fichiers, etc. – PedroMorgan

Répondre

3

Je sais que je fais erreur sur cette ligne :

self.model.beginRemoveRows(index.parent(),index.row(),self.model.rowCount(index)) 

Oui, vous avez raison. Regardons ce que vous passez dans:

index.parent() - the parent of index 
index.row() - the row number of index, the row you want deleted 
self.model.rowCount(index) - the number of total children had by index 

Maintenant, jetez un oeil à l'image dans la documentation sur beginRemoveRows:

que vous le précisiez que vous voulez supprimer de index.row() à la ligne égale à le nombre d'enfants avait par index. Votre mise en correspondance avec vos indices parent-enfant.

Qu'est-ce que tu voulais vraiment était:

beginRemoveRows(index.parent(), index.row(), index.row()) 

Si vous supprimez la ligne à index.row(), tous ses enfants seront automatiquement supprimés.

MAIS, il y a un problème plus grave: beginRemoveRows() ne fait pas enlever toutes les lignes. Il alerte simplement votre modèle que vous allez supprimer des lignes. Lorsque vous appelez le endRemoveRows(), le modèle laisse alors savoir à quiconque écoute qu'il a été mis à jour pour qu'il puisse être correctement redessiné.

En C++, vous ne pouvez pas appeler beginRemoveRows() car ce sont des méthodes protégées que seul le modèle est appelé à appeler.

Pour filtrer comme vous le souhaitez, vous devez créer un modèle de proxy personnalisé (c'est-à-dire QSortFilterProxyModel) qui effectue le filtrage souhaité. Vous allez ensuite manipuler le modèle QSortFilterProxy en réponse dans votre gestionnaire de signal.

+0

Merci pour votre réponse kaleb. Cela ne fonctionne pas .. Les dossiers (dans le modèle) ne sont pas supprimés comme il doit être .. (Il est supprimé dans un autre ordre) .. Pouvez-vous s'il vous plaît vérifier ce code dans votre système .. Je ne sais pas pourquoi cela arrive ??? – Jeba

+0

Je viens d'ajouter une nouvelle section commençant par "BUT" qui, je l'espère, explique le vrai problème (maintenant en supposant que le code que vous avez posté est complet et pas seulement un échantillon). –

+0

Merci de répondre à nouveau et pour une explication claire .. Je suis totalement nouveau pour modéliser/voir la programmation ici .. Pouvez-vous s'il vous plaît poster un extrait de code de QSortFilterProxyModel qui peut être utilisé ici .. Parce que je n'ai pas utilisé ce .. – Jeba

0

Jebagnanadas - Je recommande de changer légèrement votre conception; Au lieu d'utiliser l'interface utilisateur en tant que modèle et, créez des objets séparés pour représenter ce qui se trouve dans votre TreeView, puis mettez à jour ces objets et reconstruisez/actualisez votre TreeView.

Votre méthode test() doit simplement supprimer les objets sélectionnés d'une variable membre, puis appeler une méthode refresh() (que vous devez écrire) qui effacera l'arborescence et la reconstruira à l'aide de la variable membre mise à jour.

Cette conception est beaucoup plus agréable à utiliser car elle sépare l'interface utilisateur de votre modèle, et vous n'avez pas besoin de vous soucier de plus de méthodes QT alors vous devez le faire.

+0

Merci beaucoup jcoon pour votre réponse .. Quand j'ai essayé comme vous l'avez dit je reçois un comportement inattendu lors de la suppression !!! – Jeba

+0

À quoi ressemble votre nouveau code jusqu'à maintenant? –

+0

jcoon désolé de répondre tard .. J'ai caché les répertoires sélectionnés en utilisant setRowHidden() dans l'arborescence et à partir de maintenant, il semble assez suffisant .. Merci de passer votre temps .. – Jeba

0

Merci jcoon et Kaleb .. Je l'ai caché la ligne en utilisant la fonction setRowHidden() de la vue de l'arbre ..