QTreeView:检查父项后如何检查子项

时间:2014-04-01 15:33:32

标签: c++ qt qtreeview

我正在用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()和自定义插槽信号,但无法弄清楚如何检查已检查父级的子项。

任何建议都将受到赞赏。

1 个答案:

答案 0 :(得分:1)

QTreeView的点击信号实施一个插槽,并确保使用addItensQStandardItem::setCheckable功能中设置您想要检查的内容。

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);
    }
}