2013-03-12 17 views
6

Sistemdeki dosyaları/klasörleri göstermek için bir QDirModel (veya QFileSystemModel) içeren basit bir QTreeView() nasıl yapılacağını biliyorum ama her birinin yanında bir onay kutusu eklemek istiyorum Böylece kullanıcı sistemindeki bazı klasörleri/dosyaları seçebilir. Açıkçası, hangi seçtiklerini seçmem gerekiyor. Herhangi bir ipucu? BöylePyQt4 Local Directory görünümü, klasörleri seçme seçeneği ile

temelde bir şey ... Aşağıda

enter image description here

bir dizin görünümü ancak onay kutusu kılan bir örnek kod verilmiştir.

from PyQt4 import QtGui 

if __name__ == '__main__': 

    import sys 

    app = QtGui.QApplication(sys.argv) 

    model = QtGui.QDirModel() 
    tree = QtGui.QTreeView() 
    tree.setModel(model) 

    tree.setAnimated(False) 
    tree.setIndentation(20) 
    tree.setSortingEnabled(True) 

    tree.setWindowTitle("Dir View") 
    tree.resize(640, 480) 
    tree.show() 

    sys.exit(app.exec_()) 

cevap

5

Sen QDirModel alt sınıf ve roleQtCore.Qt.CheckStateRole olup olmadığını kontrol etmelidir data(index,role) yöntemi, reimplement olabilir. Öyleyse, QtCore.Qt.Checked veya QtCore.Qt.Unchecked'dan dönmelisiniz. Ayrıca, kullanıcı denetimleri/işaretlerini işlemek için setData yöntemini yeniden yapılandırmanız ve kullanıcının denetlemesini/işaretini kaldırmayı sağlayan QtCore.Qt.ItemIsUserCheckable işaretini döndürmek için flags. Yani:

Sonra
class CheckableDirModel(QtGui.QDirModel): 
def __init__(self, parent=None): 
    QtGui.QDirModel.__init__(self, None) 
    self.checks = {} 

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

def flags(self, index): 
    return QtGui.QDirModel.flags(self, index) | QtCore.Qt.ItemIsUserCheckable 

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): 
     self.checks[index] = value 
     self.emit(QtCore.SIGNAL("dataChanged(QModelIndex,QModelIndex)"), index, index) 
     return True 

    return QtGui.QDirModel.setData(self, index, value, role) 

yerine QDirModel bu sınıfını kullanın:

model = CheckableDirModel() 
tree = QtGui.QTreeView() 
tree.setModel(model) 
+0

Bu sadece iyi çalışır ancak bir C tıkladığında bu yüzden ne zaman nasıl değiştirileceğini biliyor musunuz: sonra tüm alt kategoriler tıklanma ve tek bir alt kategori C tıkladım: bir nokta (yarım kontrol)? – Kiarash

+0

@Kiarash 'setData' içindeki 'index' alt ve üst dizinlerini buna göre değiştirmelisiniz. Alt dizin almak için 'QModelIndex.child' kullanın. Üst dizin almak için 'QModelIndex.parent' kullanın. Verilen dizinin bir dizi çocuğunu elde etmek için 'QDirModel.rowCount' kullanmalısınız. Bkz. [This] (http://pyqt.sourceforge.net/Docs/PyQt4/qmodelindex.html) ve [this] (http://pyqt.sourceforge.net/Docs/PyQt4/qabstractitemmodel.html#rowCount) – user2155932

+0

setData'da şunu ekledim: menzil için (self.rowCount (indeks)): self.setData (index.child (i, 0), value, role) AMA C: 'yi tıklarsa bu kadar yavaştır. Bunun nasıl çözüleceğine dair bir fikrin var mı? – Kiarash