2011-11-17 105 views

回答

18

首先,你需要修改TreeItem保持选中状态的轨迹:

private: 
    ... 
    bool checked; 

和setter和getter:

bool isChecked() const { return checked; } 
void setChecked(bool set) { checked = set; } 

现在,该模型将需要被如此修改该视图知道检查状态:

QVariant TreeModel::data(const QModelIndex &index, int role) const 
{ 
    if (!index.isValid()) 
     return QVariant(); 

    TreeItem *item = static_cast<TreeItem*>(index.internalPointer()); 

    if (role == Qt::CheckStateRole && index.column() == 0) 
     return static_cast<int>(item->isChecked() ? Qt::Checked : Qt::Unchecked); 

    if (role != Qt::DisplayRole) 
     return QVariant(); 

    return item->data(index.column()); 
} 

并修改模型的标记方法以允许意见知道该模型包含可检查项目:

Qt::ItemFlags TreeModel::flags(const QModelIndex &index) const 
{ 
    if (!index.isValid()) 
     return 0; 

    Qt::ItemFlags flags = Qt::ItemIsEnabled | Qt::ItemIsSelectable; 

    if (index.column() == 0) 
     flags |= Qt::ItemIsUserCheckable; 

    return flags; 
} 

我认为这应该做到这一点。如果您希望能够在用户勾选并取消选中项目时更新TreeItem检查状态,则需要在您的TreeModel中提供QAbstractItemModel :: setData方法。

+0

非常酷!正是我在找什么。然而,我发现我应该使用TreeWidget来创建我想要的东西。然而,非常感谢你的职位。 – Drise

+0

不是我可以提出更好的解决方案atm,但布尔值当然缺乏令人敬畏的TRISTATENESS。 (f.e.对于部分选定的文件夹) – eMPee584

14

为了我自己的目的,我将上面的代码转换成了PyQt,并且我想分享一下。

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

    item = index.internalPointer(); 

    if role == Qt.CheckStateRole and index.column() == self.check_col: 
     return int(Qt.Checked if item.isChecked() else Qt.Unchecked) 

    return super(TreeModel, self).data(index, role) 


def flags(self, index): 
    if not index.isValid(): 
     return None 

    if index.column() == self.check_col: 
     flags = Qt.ItemIsEnabled | Qt.ItemIsSelectable | Qt.ItemIsUserCheckable 
    else: 
     flags = super(TreeModel, self).flags(index) 

    return flags 


def setData(self, index, value, role=Qt.EditRole): 
    if index.column() == self.check_col: 
     if role == Qt.EditRole: 
      return False 
     if role == Qt.CheckStateRole: 
      item = self.getItem(index) 
      item.setChecked(value) 
      self.dataChanged.emit(index, index) 
      return True 

    return super(TreeModel, self).setData(index, value, role) 
+0

旧线程,但有没有机会分享全班? – atomSmasher

0

下面是使用QStandardItemModel另一个PyQt的完整沃金例如:

model = QStandardItemModel() 
parent_item = model.invisibleRootItem() # type: QStandardItem 
for row in [ 
    (Qt.Unchecked, 'unchecked'), 
    (Qt.PartiallyChecked, 'partially'), 
    (Qt.Checked, 'checked') 
]: 
    checked, text = row 
    check_item = QStandardItem('') 
    check_item.setCheckable(True) 
    check_item.setCheckState(checked) 
    parent_item.appendRow([check_item, QStandardItem(text)]) 
treeview.setModel(model) 

顺便说一句,这也应该为任何C++应用程序。