如何在QTreeView中选择孩子的物品复选框

问题描述:

当我选择/取消选择他们父母的物品QCheckBox时,我想选择/取消选择所有孩子的物品QCheckBoxs。如何在QTreeView中选择孩子的物品复选框

我继承QTreeView并检测QCheckBox何时被选中,然后我调用函数做选择/取消选择过程。

这里我的代码:

#ifndef MYQTREEVIEW_H 
#define MYQTREEVIEW_H 

#include <QTreeView> 
#include <QMouseEvent> 
#include <QDebug> 
#include <QStandardItem> 

class MyQTreeView: public QTreeView { 
public: 
    MyQTreeView(QWidget* parent=0): QTreeView(parent){} 
    virtual ~MyQTreeView() {} 

protected: 
    void resettingCheckBox (QModelIndex& parentIndex) { 
     if (! parentIndex.isValid()) 
      return; 

     QString text = parentIndex.data(Qt::DisplayRole).value<QString>(); 
     qDebug() << "parent is: " << text; 

     if (model()->hasChildren(parentIndex)) { 
      for(int i = 0; i < model()->rowCount(parentIndex) ; i++) { 
       QModelIndex childIndex = model()->index(i, 0, parentIndex); 

       if (model()->hasChildren(childIndex)) 
        resettingCheckBox(childIndex); 
       else { 
        QString text = childIndex.data(Qt::DisplayRole).value<QString>(); 
        qDebug() << "child is: " << text; 

        QStandardItem *parentItem = static_cast<QStandardItem*> (parentIndex.internalPointer()); 
        QStandardItem *childItem = static_cast<QStandardItem*> (childIndex.internalPointer()); 

        if (parentItem->checkState() == Qt::Checked) { 
         qDebug() << "child item " << childItem->checkState(); 
         childItem->setCheckState(Qt::Unchecked); 

        } 
        else { 
         qDebug() << "child item " << childItem->checkState(); 
         childItem->setCheckState( Qt::Checked); 
        } 
       } 
      } 
     } 
    } 

    void mousePressEvent (QMouseEvent *event) { 
     QModelIndex index = indexAt(event->pos()); 

     if(index.isValid()) { 
      QStyleOptionButton opt; 
      opt.QStyleOption::operator=(viewOptions()); 
      opt.rect = visualRect(index); 
      QRect rect = style()->subElementRect(QStyle::SE_ViewItemCheckIndicator, &opt); 

      if (rect.contains(event->pos())) { 
       resettingCheckBox(index); 
      } 

      QTreeView::mousePressEvent(event); 
     } 
    } 
}; 

#endif // MYQTREEVIEW_H 

代码可能不工作时,我选择/取消选择父复选框(subchilds未选中/未选中)。

在此先感谢。

我相信操纵树视图项目的最好方法是通过模型。它看起来像你正在使用QStandardItemModel;因此您可以覆盖模型的setData方法,并重置作为参数传递给此方法的项目索引的子项目值。下面是一个小例子:

class TestModel : public QStandardItemModel 
{ 
public: 
    TestModel() {} 

    bool setData(const QModelIndex & index, const QVariant & value, int role = Qt::EditRole) 
    { 
     QStandardItem *item = itemFromIndex(index); 
     for(int i = 0; i < item->rowCount() ; i++) 
     { 
      QStandardItem *childItem = item->child(i); 
      setData(childItem->index(), value, role); 
     } 
     return QStandardItemModel::setData(index, value, role); 
    } 
}; 

这里的这种模式如何被初始化:

QStandardItemModel* tableModel = new TestModel(); 
QStandardItem* parentItem = tableModel->invisibleRootItem(); 
for (int i = 0; i < 4; ++i) 
{ 
    QStandardItem *item = new QStandardItem(QString("item %0").arg(i)); 
    item->setCheckable(true); 
    parentItem->appendRow(item); 
    parentItem = item; 
} 
treeView->setModel(tableModel); 

希望这会有所帮助,至于

+0

谢谢,它现在的工作。 – 2011-02-28 05:44:40

在我看来,你应该resettingCheckBox(index)之前调用QTreeView::mousePressEvent(event),让QTreeView更新checkState

+0

谢谢,但它不能解决问题 – 2011-02-28 06:05:03

重写mouseReleaseEvent()而不是mousePressEvent()!

因为checkState更改鼠标时释放鼠标 - 按!