2017-09-02 50 views
0

如何在我的QTreeview C++項目中爲所選Treeview項目設置複選框?爲所選QTreeview項目設置複選框

我的目標是遍歷所選的Treeview項目並將其複選框狀態設置爲true或false。我會通過一個righclick菜單來做到這一點。我只是不知道如何收集選定的項目。

我寫道,通過所有的項目循環,並設置相應的複選框以真或假的函數,但我在努力弄清楚如何只設置所選項目。

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

你是什麼意思選擇,你能解釋我請。 – eyllanesc

+0

@eyllanesc用更多的信息更新了這個問題 – JokerMartini

+0

@JokerMartini你如何選擇它們? – Macias

回答

1

獲得選擇的覆蓋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

+0

@JokerMartini你工作我的解決方案嗎? – eyllanesc

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