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?
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?
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.
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)
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
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++.
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
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