如何在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;
}
}
}
这就是我在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 :(得分: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);
}
}