设置所选QTreeview项目的复选框

时间:2017-09-02 02:11:13

标签: c++ qt

如何在QTreeview C ++项目中设置所选Treeview项目的复选框?

我的目标是迭代选定的Treeview项目并将其复选框状态设置为true或false。我将通过righclick菜单执行此操作。我只是不知道如何收集所选项目。

我编写了一个循环遍历所有项目的函数,并将复选框设置为true或false,但我很难弄清楚如何只设置所选项目。

void ShotsEditor::checkAll()
{
   for (int i = 0; i < d->sourceModel->rowCount(); i++){
        QStandardItem* item = d->sourceModel->item(i);
        if (item->isCheckable())
        {
            item->setCheckState(Qt::Checked);
        }
        else{
            if (item->hasChildren())
            {
                for (int j = 0; j < item->rowCount(); j++){
                     QStandardItem* item1 = item->child(j);
                     if (item1->isCheckable())
                     {
                         item1->setCheckState(Qt::Checked);
                     }
                }
            }
        }
    }
}

这就是我被困的地方......

void ShotsEditor::checkSelected()
{
    QModelIndexList selected = d->treeView->selectionModel()->selectedIndexes();
    qDebug() << "selected indexes" << selected;
    foreach (QModelIndex index, selected)
    {
        if (index.column()==0)
        {
            int row = index.row();
            qDebug() << "row" << row;
        }
    }
}

enter image description here

这就是我在pyside中的表现。我不知道如何在c ++中做到这一点

  def set_checked(self):
        indexes = self.treeview.selectedIndexes()

        for i in indexes:
            model = i.model()
            item = i.model().itemFromIndex(i)
            print i, model, item

            if item.isSelectable():
                item.setCheckState(QtCore.Qt.Checked)

2 个答案:

答案 0 :(得分:2)

获取所选项目的正确方法是覆盖selectionChanged槽,它返回选定和取消选择的项目,然后我们通过索引获取项目并进行检查。

class TreeView : public QTreeView
{
    Q_OBJECT
protected slots:
    void selectionChanged(const QItemSelection &selected, const QItemSelection &deselected){
        Q_UNUSED(deselected)
        const auto *m = qobject_cast<QStandardItemModel *>(model());
        if(m){
            for(const auto index: selected.indexes()){
                m->itemFromIndex(index)->setCheckState(Qt::Checked);
            }
        }
    }
};

#include "main.moc"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    TreeView w;
    QStandardItemModel *model = new QStandardItemModel;
    for (int i = 0; i < 4; ++i){
        QStandardItem *parent =new  QStandardItem(QString("Family %1").arg(i));
        for (int j = 0; j < 4; ++j){
            QStandardItem *child = new QStandardItem(QString("item %1").arg(j));
            parent->appendRow(child);
        }
        model->appendRow(parent);
    }

    w.setModel(model);
    w.show();

    return a.exec();
}

您在以下link

中找到的完整示例

答案 1 :(得分:0)

对于那些有同样问题的人:

QModelIndexList selected = d->treeView->selectionModel()->selectedIndexes();
qDebug() << "selected" << selected;
foreach (QModelIndex index, selected)
{
    QStandardItem* item = d->sourceModel->itemFromIndex(index);
    qDebug() << "item" << item;
    if (item->isSelectable() && item->isCheckable())
    {
        item->setCheckState(Qt::Unchecked);
    }
}