QTreeView:检查父母后如何检查孩子

QTreeView: How to check children after checking parent

本文关键字:检查 何检查 孩子 父母 QTreeView      更新时间:2023-10-16

我正在使用QtCreator编写一个应用程序,并试图检查已检查父级的子项,但似乎无法找到正确的方法。

我以这种方式设置模型:

MyClass::MyClass()
{
    QVBoxLayout *layout = new QVBoxLayout;
    setWindowTitle(tr("Menu"));
    m_model = new QStandardItemModel (this);
    addItems(m_model);
    m_view = new QTreeView;
    m_view->header()->hide();
    m_view->setModel(m_model);
    m_view->setContextMenuPolicy(Qt::CustomContextMenu);
    layout->addWidget(m_view);
    layout->setMargin(0);
    setLayout(layout);
    connect(m_view, SIGNAL(customContextMenuRequested(QPoint)),
             this, SLOT(contextMenuRequested(QPoint)));
}

我已经尝试使用信号 clicked() 和一个自定义插槽,但无法弄清楚如何检查已检查父母的孩子。

任何建议将不胜感激。

QTreeView的点击信号实现一个插槽,并确保使用 QStandardItem::setCheckableaddItens 函数中设置您想要检查的 itens。

void MyClass::on_treeView_clicked(const QModelIndex &index) {
    QStandardItem* l_itemClicked = m_model->itemFromIndex(index);
    if (!l_itemClicked->rowCount()) return; // clicked item has no children
    for (int i = 0 ; i < l_itemClicked->rowCount() ; ++i) {
        QStandardItem* l_child = l_itemClicked->child(i);
        bool l_isChecked = l_child->checkState() == Qt::Checked;
        if (l_child->isCheckable())
            l_child->setCheckState(l_isChecked ? Qt::Unchecked : Qt::Checked);
    }
}