2014-04-01 56 views
0

我正在用QtCreator编写一个应用程序,并试图检查已检查父项的孩子,但似乎无法找到正确的方式来执行此操作。QTreeView:如何检查父母后检查儿童

我设置的模式是这样的:

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

我与信号试着点击()和一个自定义槽,但无法弄清楚如何检查检查父的孩子。

任何意见,将不胜感激。

+0

你需要在所有的孩子上运行setChecked。 – user2672165

+0

这并不是我的意思。我知道如何检查一个单独的盒子,但我不知道如何去检查他们的父母。 – Simpsons

+0

好的。我自己没有使用QtCreator,因为我手动编写代码。我使用了一个TreeItem类和一个setChecked方法,它也包含了这些孩子。 – user2672165

回答

1

为您的QTreeView的点击信号实施一个插槽,并确保使用QStandardItem::setCheckable设置您想要在addItens函数中进行检查。

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

这工作完美,正是我所期待的。 非常感谢:) – Simpsons

+0

至少用PySide做这件事,这只有在你真正点击该项目时才有效,而不是以另一种方式检查它,比如按空格。 –