如何在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);
希望这会有所帮助,至于
答
在我看来,你应该resettingCheckBox(index)
之前调用QTreeView::mousePressEvent(event)
,让QTreeView
更新checkState
。
+0
谢谢,但它不能解决问题 – 2011-02-28 06:05:03
答
重写mouseReleaseEvent()而不是mousePressEvent()!
因为checkState更改鼠标时释放鼠标 - 按!
谢谢,它现在的工作。 – 2011-02-28 05:44:40