2011-11-17 16 views
15

Tôi biết điều này đã được hỏi một loạt các lần, nhưng tôi không thể dường như tìm thấy bất cứ điều gì có liên quan.QTreeView Checkboxes

Sử dụng the simpletreemodel tutorial được đóng gói bằng Qt, làm cách nào để thêm hộp kiểm?

Trả lời

18

Thứ nhất, bạn sẽ cần phải sửa đổi TreeItem để theo dõi tình trạng kiểm tra:

private: 
    ... 
    bool checked; 

và setter và getter:

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

Bây giờ mô hình sẽ cần phải được sửa đổi để chế độ xem biết về trạng thái séc:

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()); 
} 

và sửa đổi phương thức cờ của mô hình để cho phép số lượt xem biết rằng mô hình chứa các mục có thể kiểm tra:

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; 
} 

Tôi nghĩ rằng điều này nên làm điều đó. Nếu bạn muốn có thể cập nhật trạng thái kiểm tra TreeItem khi người dùng đánh dấu và bỏ chọn các mục, thì bạn sẽ cần cung cấp phương thức QAbstractItemModel :: setData trong TreeModel của bạn.

+0

Rất tuyệt! Chính xác những gì tôi đang tìm kiếm. Tuy nhiên tôi phát hiện ra rằng tôi nên đã được sử dụng TreeWidget cho những gì tôi đang cố gắng để xây dựng. Cảm ơn bạn rất nhiều cho bài viết tuy nhiên. – Drise

+0

Không phải là tôi có thể đề xuất một giải pháp tốt hơn atm, nhưng boolean thiếu TRISTATENESS tuyệt vời của khóa học. (Ví dụ: đối với các thư mục được chọn một phần) – eMPee584

14

Tôi đã chuyển đổi mục ở trên thành PyQt cho mục đích của riêng mình và tôi đã chia sẻ.

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

Chủ đề cũ nhưng có cơ hội nào bạn có thể chia sẻ toàn bộ lớp học không? – atomSmasher

0

Dưới đây là một PyQt hoàn dụ woking sử dụng QStandardItemModel:

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) 

Btw, điều này cũng nên làm việc cho bất kỳ ứng dụng C++.

Các vấn đề liên quan