Pergunta

I'm writing an application with QtCreator and am trying to check the children of a checked parent but can't seem to be able to find the correct way to do it.

I setup the model this way:

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

I have tried with the signal clicked() and a custom slot but can't figure out how to check the children of the checked parent.

Any advice would be appreciated.

Foi útil?

Solução

Implement a slot for the clicked signal of your QTreeView and make sure to set the itens you want checkable in your addItens function using QStandardItem::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);
    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top