2017-11-29 41 views
0

사전이 선택된 확인합니다.어떻게 QTreeView CheckBox에 내가 파일 시스템 폴더를 렌더링하는 QtGui.QFileSystemModel와 트 리뷰를

내 트 리뷰는 체크 박스를 체크 &의 선택을 취소 작업 벌금을 가지고있다. UI Load에서 모든 체크 박스를 미리 선택하고 싶습니다.

트 리뷰에 대한 기본 선택 체크 박스를 만드는 방법을 제안 해주십시오.

내 모델 코드는 다음과 같습니다 -

내가 확인란 사전 선택에 대해 서로 다른 조합을 사용하려고하지만 successed 수없는

Source Code

class CheckableDirModel(QtGui.QFileSystemModel): 

    def __init__(self, resultFormats, parent=None): 
     QtGui.QFileSystemModel.__init__(self, None) 
     filters = QStringList() 
     #import ipdb;ipdb.set_trace() 
     filters.append('*.odb') 
     resultFormats = resultFormats.split(',') 
     for resultFormat in resultFormats: 
      filters.append('*.' + resultFormat) 
     self.setNameFilters(filters) 
     #set to False to hide files that match the filter 
     self.setNameFilterDisables(True) 
     self.checks = {} 
     self.selectedFiles = set() 

     #self.b1 = QCheckBox("SPM_CAE_DATA") 
     #self.b1.setChecked(True) 


    #Show the particular formate ('.pages') file into result set for the checked folder 
    def addFile(self,path1): 
     # import ipdb;ipd b.set_trace() 
     files = glob.iglob(os.path.join(str(path1), "*.pages"))#size= os.path.getsize(fp) 
     for file in files: 
      print(file) 
      if os.path.isfile(file): 
       #print(file) 
       Formate.append(file) 
       shutil.copy2(file, reportpath + '/../Particular_Formate') 


     #print(Formate) 
     #treeView1 = TreeView(reportpath) 
    #Show the file greater than 250 MB into list 


    def addFilegt250mb(self,path1): 
     # import ipdb;ipd b.set_trace() 
     global listview1 
     for root, dirs, files in os.walk(str(path1), topdown=False): 
      for name in files: 
       f = os.path.join(root, name) 
       if os.path.isfile(f):#if os.path.isfile(f) 
        if os.path.getsize(f) >= 0: 
         greaterSize.append(f) 
         print(name) 
         shutil.copy2(f, reportpath+ '/../Particular_Formate_size') 


     #print(greaterSize) 


    #remove the File, When uncheck the Folder 
    def deleteFile(self,path2): 
     for root, dirs, files in os.walk(str(path2), topdown=False): 
      for name in files: 
       f = os.path.join(root, name) 
       if name == ".DS_Store" : 
        pass 

       else: 
        if os.path.getsize(f) >=0 : 
         greaterSize.remove(f) 

       for x in Formate: 
        if x == f : 
         Formate.remove(x) 


        #Formate.remove(f) 


       self.deletSize(name) 
       self.deletFormate(name) 

     #print(greaterSize) 
     #print(Formate)   
    #remove the file size greater then 250 MB , When Folder is uncheck 
    def deletSize(self,name) : 
     folder = reportpath +'/../Particular_Formate_size' 
     for the_file in os.listdir(folder): 
      file_path = os.path.join(folder, the_file) 
      if the_file == name : 
       try: 
        if os.path.isfile(file_path): 
         os.unlink(file_path) 

        #elif os.path.isdir(file_path): shutil.rmtree(file_path) 
       except Exception as e: 
        print(e) 
     #print(greaterSize) 
    #Renove the particular formate file 
    def deletFormate(self,name) : 
     folder = reportpath + '/../Particular_Formate' 
     for the_file in os.listdir(folder): 
      file_path = os.path.join(folder, the_file) 
      if the_file == name : 
       try: 
        if os.path.isfile(file_path): 
         os.unlink(file_path) 
         #import ipdb;ipdb.set_trace() 
        #elif os.path.isdir(file_path): shutil.rmtree(file_path) 
       except Exception as e: 
        print(e) 



    def data(self, index, role=QtCore.Qt.DisplayRole): 
     if role != QtCore.Qt.CheckStateRole: 
      return QtGui.QFileSystemModel.data(self, index, role) 
     else: 
      if index.column() == 0: 
       return self.checkState(index) 



    def flags(self, index): 
     if (index.column() == 0): 
      return QtGui.QFileSystemModel.flags(self, index) | QtCore.Qt.ItemIsUserCheckable 
     else: 
      return QtGui.QFileSystemModel.flags(self, index) 



    def checkState(self, index): 
     if index in self.checks: 
      return self.checks[index] 
     else: 
      return QtCore.Qt.Unchecked 

    def setData(self, index, value, role): 
     if (role == QtCore.Qt.CheckStateRole and index.column() == 0): 
      # print(QtGui.QFileSystemModel.filePath(self, index)) 

      self.checks[index] = value 
      if QtGui.QFileSystemModel.filePath(self, index) in self.selectedFiles: 
       self.selectedFiles.remove(QtGui.QFileSystemModel.filePath(self, index)) 
       path2=QtGui.QFileSystemModel.filePath(self, index) 
       self.deleteFile(path2) 


      else: 
       path1 =QtGui.QFileSystemModel.filePath(self, index) 
       self.addFile(path1) 
       self.addFilegt250mb(path1) 

       self.selectedFiles.add(QtGui.QFileSystemModel.filePath(self, index)) 

      self.emit(QtCore.SIGNAL("dataChanged(QModelIndex,QModelIndex)"), index, index) 
      return True 
     return QtGui.QFileSystemModel.setData(self, index, value, role) 
.

+0

는 참조 언젠가 사라지는 수, 전체 소스 다음을 게시하시기 바랍니다. – user1767754

답변

0

우리가 rowsInserted 신호를 사용하는 기본 항목을 설정하려면 bool

self.b1 = QCheckBox("SPM_CAE_DATA") 
self.b1.setCheckState(True) 
+0

그것은 나를 위해 작동하지 않습니다. –

+0

오류 메시지가 있습니까? – user1767754

+0

no. 이 줄에서는 체크 박스가 선택되어 있지 않습니다. –

0

을 취하는 방법 setCheckState이 아래 그림과 같이, 또한 QModelIndex하지만 QPersistentModelIndex를 저장하지 않는 것이 좋습니다 :

QPersistentModelIndex 클래스는 데이터 모델에서 데이터를 찾는 데 사용됩니다.

QPersistentModelIndex는 응용 프로그램에서 저장할 수 있고 나중에 모델의 정보에 액세스하는 데 사용되는 모델 색인입니다. QModelIndex 클래스와는 달리, 그들이 모델에 액세스 할 수있는 항목에 대한 참조가 긴 유효 할 것입니다 것을 보장합니다 모델부터 QPersistentModelIndex 를 저장하는 것이 안전합니다.

예 :

QAbstractTableModel와
from PyQt4 import QtGui, QtCore 

class CheckableDirModel(QtGui.QFileSystemModel): 
    def __init__(self, parent=None): 
     QtGui.QFileSystemModel.__init__(self, parent) 
     self.rowsInserted.connect(self.onRowsInserted) 
     self.checks = {} 
     self.setRootPath(QtCore.QDir.currentPath()) 

    def onRowsInserted(self, ix, first, last): 
     for i in range(first, last+1): 
      children = self.index(i, 0, ix) 
      self.setData(children, QtCore.Qt.Checked, QtCore.Qt.CheckStateRole) 

    def data(self, index, role=QtCore.Qt.DisplayRole): 
     if role != QtCore.Qt.CheckStateRole: 
      return QtGui.QFileSystemModel.data(self, index, role) 
     else: 
      if index.column() == 0: 
       return self.checkState(QtCore.QPersistentModelIndex(index)) 

    def flags(self, index): 
     val = QtGui.QFileSystemModel.flags(self, index) 
     if index.column() == 0: 
      val |= QtCore.Qt.ItemIsUserCheckable 
     return val 

    def checkState(self, index): 
     if index in self.checks.keys(): 
      return self.checks[index] 
     else: 
      return QtCore.Qt.Unchecked 

    def setData(self, index, value, role=QtCore.Qt.EditRole): 
     if role == QtCore.Qt.CheckStateRole: 
      if index.column() == 0: 
       self.checks[QtCore.QPersistentModelIndex(index)] = value 
       return True 
      return False 
     return QtGui.QFileSystemModel.setData(self, index, value, role) 

if __name__ == '__main__': 
    import sys 

    app = QtGui.QApplication(sys.argv) 
    main = QtGui.QTreeView() 
    model = CheckableDirModel() 
    main.setModel(model) 
    main.show() 
    main.expandAll() 
    sys.exit(app.exec_()) 

: 해당이 요구 이후 열 0을 필터링하지만, 경우에 당신은 내가에 반복해야하는 모든 열이하고 싶은 앞의 예에서 이 :

def onRowsInserted(self, ix, first, last): 
    for i in range(first, last+1): 
     for j in range(self.columnCount(ix)): # all columns 
      children = self.index(i, j, ix) 
      self.setData(children, Qt.Checked, Qt.CheckStateRole) 

코드 :

from PyQt4.QtGui import * 
from PyQt4.QtCore import * 

class TableModel(QAbstractTableModel): 
    def __init__(self, parent=None): 
     super(TableModel, self).__init__(parent) 
     self.addresses = [] 
     self.rowsInserted.connect(self.onRowsInserted) 
     self.checks = {} 

    def checkState(self, index): 
     if index in self.checks.keys(): 
      return self.checks[index] 
     else: 
      return Qt.Unchecked 

    def onRowsInserted(self, ix, first, last): 
     for i in range(first, last+1): 
      for j in range(self.columnCount(ix)): 
       children = self.index(i, j, ix) 
       self.setData(children, Qt.Checked, Qt.CheckStateRole) 

    def rowCount(self, index=QModelIndex()): 
     return len(self.addresses) 

    def columnCount(self, index=QModelIndex()): 
     return 2 

    def data(self, index, role=Qt.DisplayRole): 
     if not index.isValid(): 
      return None 

     if not 0 <= index.row() < len(self.addresses): 
      return None 

     if role == Qt.DisplayRole: 
      name = self.addresses[index.row()]["name"] 
      address = self.addresses[index.row()]["address"] 
      if index.column() == 0: 
       return name 
      elif index.column() == 1: 
       return address 
     elif role == Qt.CheckStateRole: 
      return self.checkState(QPersistentModelIndex(index)) 
     return None 

    def headerData(self, section, orientation, role=Qt.DisplayRole): 
     if role != Qt.DisplayRole: 
      return None 

     if orientation == Qt.Horizontal: 
      if section == 0: 
       return "Name" 
      elif section == 1: 
       return "Address" 
     return None 

    def addRow(self, name, address): 
     position = self.rowCount() 
     self.beginInsertRows(QModelIndex(), position, position) 
     self.addresses.append({"name": name, "address": address}) 
     self.endInsertRows() 
     return True 

    def setData(self, index, value, role=Qt.EditRole): 
     if index.isValid() and 0 <= index.row() < len(self.addresses): 
      if role == Qt.CheckStateRole: 
       self.checks[QPersistentModelIndex(index)] = value 
       return True 
      elif role == Qt.EditRole: 
       address = self.addresses[index.row()] 
       if index.column() == 0: 
        address["name"] = value 
       elif index.column() == 1: 
        address["address"] = value 
       else: 
        return False 
       self.dataChanged.emit(index, index) 
       return True 
     return False 

    def flags(self, index): 
     if not index.isValid(): 
      return Qt.ItemIsEnabled 
     return Qt.ItemFlags(QAbstractTableModel.flags(self, index) | 
          Qt.ItemIsEditable | Qt.ItemIsUserCheckable) 

if __name__ == '__main__': 
    import sys 

    app = QApplication(sys.argv) 
    model = TableModel() 
    for i in range(100): 
     model.addRow("name-{}".format(i), "address-{}".format(i)) 
    view = QTableView() 
    view.setModel(model) 
    view.show() 
    sys.exit(app.exec_()) 
012 3,516,

참고 : 당신이이 내부적으로 우리는 솔루션에서 사용하는 rowsInserted 신호를 방출하기 때문에 당신의 beginInsertRows()endInsertRows() 방법을 사용하여 항목을 추가해야합니다이 방법을 사용합니다.

+0

QAbstractTableModel에서 어떻게 동일한 작업을 수행 할 수 있습니까? –

+0

내 솔루션이 작동 했습니까? – eyllanesc

+0

QAbstractTableModel에 대한 솔루션은 약간 다르다. insert 메소드를 구현하고 rowsInserted 및 columnsInserted 신호를내는 beginInsertRows, beginInsertColumns 메소드를 사용해야하기 때문에 – eyllanesc