下面是示例代码:
// 创建 QTreeView 对象
QTreeView* treeView = new QTreeView();
// 设置自动填充背景色
treeView->setAutoFillBackground(true);
// 获取 QStandardItemModel 或 QFileSystemModel 数据模型
QStandardItemModel* model = dynamic_cast<QStandardItemModel*>(treeView->model());
// ...加载数据
QStandardItem* item = new QStandardItem(qstrName);
model ->appendRow(item);
item->setCheckable(true); //设置复选框
item->setTristate(true); //设置三态
// 关联信号和槽
QObject::connect(treeView, &QTreeView::clicked, [=](const QModelIndex& index)
{
Qt::CheckState state = index.data(Qt::CheckStateRole).value<Qt::CheckState>();
if(state == Qt::Checked)
changeChildrenState(index, Qt::Checked);
else if(state == Qt::Unchecked)
changeChildrenState(index, Qt::Unchecked);
});
// 处理逻辑勾选,勾选父节点时子节点自动全部勾选
void MainWindow::changeChildrenState(const QModelIndex &index, const Qt::CheckState state)
{
for (int i = 0; i < model->rowCount(index); ++i)
{
QModelIndex childIndex = model->index(i, 0, index);
if (childIndex.isValid())
{
model->setData(childIndex, QVariant(state), Qt::CheckStateRole);
changeChildrenState(childIndex, state);
}
}
}
在上面的代码中,我们使用了clicked信号和QModelIndex提示在QTreeView中单击的项目。通过检查已单击的项目的状态并调用changeChildrenState函数处理其子项的状态。'changeChildrenState是递归函数,它会在子项中继续处理所有孙项。当勾选(或取消勾选)父母时,子项的状态通过使用setData()`在数据模型中更新。请注意,必须禁用自动三重状态,否则这将导致勾选不起作用。