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

4 篇文章 0 订阅
该代码示例展示了如何在Qt中使用QTreeView处理点击事件,自动填充背景,并管理QStandardItemModel或QFileSystemModel的数据。当点击项目时,通过checked和unchecked状态触发changeChildrenState递归函数,以同步父项和子项的勾选状态。此功能适用于构建具有层级关系的勾选列表。
摘要由CSDN通过智能技术生成

下面是示例代码:


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值