2010-02-10 3 views
3

을 beginremoverows :PyQt는 아래의 예에서

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

나는 내가 그것을 클릭 할 때 (있는 경우) 행과 아이를 제거 할.
(클릭 후 아래의 폴더 및 그것의 아이들은 제거되어야한다.)

나는이 라인에 실수를하고있어 알고 당신의 시간을

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

감사합니다.

+0

컨텍스트를 설명 할 수 있습니까? 파일 등을 제거 하시겠습니까? – PedroMorgan

답변

3

는 나는이 줄에 실수를하고있어 알고

self.model.beginRemoveRows(index.parent(),index.row(),self.model.rowCount(index)) 
예, 당신 말이 맞아. , beginRemoveRows에 대한 설명서의 그림을 살펴 가지고 지금

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 

: 이제 당신이 전달하고 보자

당신의 당신이 동일한 행에 index.row()에서 제거 할 것인지를 말하는 아이들의 수는 지수로 나타났습니다. 귀하의 부모 - 자녀 색인에 잘못 일치합니다. 당신이 정말로 원하는 무엇

했다 : 그 아이의

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

당신이 index.row()에서 행을 제거하면

, 모두 자동으로 제거됩니다.

하지만, 더 큰 문제가있다 : beginRemoveRows()하지 어떤 행을 제거한다. 행을 제거하려고한다는 사실을 모델에 알리기 만하면됩니다. endRemoveRows()으로 전화를 걸면 누구나 모델을 업데이트하여 올바르게 다시 그릴 수 있습니다.

C++에서는 을 호출 할 수 없습니다. 모델에서만 호출 할 수있는 보호 된 메서드이기 때문입니다.

원하는대로 필터링하려면 원하는 필터링을 수행하는 맞춤 프록시 모델 (예 : QSortFilterProxyModel)을 만들어야합니다. 그런 다음 신호 처리기에서 QSortFilterProxy 모델을 조작하여 조작합니다.

+0

kaleb에 답해 주셔서 감사합니다. 그것은 작동하지 않는다 .. (모델에서) 폴더가 삭제되지 않고있다 .. (다른 순서로 삭제되고있다.) .. 당신의 시스템에서이 코드를 확인해 주 시겠어요 .. 모르겠다. 왜 이런 일이 일어나고있는거야 ??? – Jeba

+0

방금 ​​"BUT"에서 시작하여 실제 문제를 설명하는 새 섹션을 추가했습니다. 이제 게시 한 코드가 샘플이 아니라 완전하다고 가정합니다. –

+0

다시 대답 해 주시고 분명한 설명을 해주셔서 감사합니다. 여기 모델링/뷰 프로그래밍을 완전히 처음 보았습니다 .. 여기에서 사용할 수있는 QSortFilterProxyModel의 코드 스 니펫을 게시 할 수 있습니까? – Jeba

0

Jebagnanadas - 디자인을 약간 변경하는 것이 좋습니다. UI를 모델 보기로 사용하는 대신 별도의 개체를 만들어 TreeView에있는 것을 나타내도록하고 개체를 업데이트하고 TreeView를 다시 작성하거나 새로 고칩니다.

test() 메서드는 멤버 변수에서 선택한 개체를 제거한 다음 TreeView를 지우고 업데이트 된 멤버 변수를 사용하여 다시 작성하는 refresh() 메서드를 호출해야합니다 (작성해야 함).

이 디자인은 UI를 모델과 분리하고 더 많은 QT 방법을 처리하는 것에 대해 걱정할 필요가 없기 때문에 작업하기 훨씬 더 편리합니다.

+0

답장을 보내 주셔서 대단히 감사합니다. 내가 예기치 않은 행동을 할 때 말했듯이 내가 시도한 것처럼 !!! – Jeba

+0

새 코드는 지금까지 어떻게 생겼습니까? –

+0

jcoon 늦게 회신 해 주셔서 죄송합니다. 트리보기에서 setRowHidden()을 사용하여 선택한 디렉토리를 숨 겼고 지금은 충분 해 보입니다. 시간을 보내 주셔서 감사합니다 .. – Jeba

0

감사합니다. jcoon 및 kaleb .. 트리보기에서 setRowHidden() 함수를 사용하여 행을 숨 겼습니다.