QTreeView勾选父节点时自动勾选子节点

4 篇文章 0 订阅

下面是示例代码:


// 创建 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()`在数据模型中更新。请注意,必须禁用自动三重状态,否则这将导致勾选不起作用。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值