我挥动由QListView支持的QStandardItemModel。在某些情况下,QStandardItem是可检查的。除了项目的显示外,还将显示一个复选框。在某些时候,我想删除QStandardItem复选框。我将其可检查状态设置为false,但它不会隐藏该复选框(尽管无法再对其进行检查)。

我发现隐藏该复选框的唯一方法是用新的替换该项目。这似乎不是正确的方法。

这是代码:

MyModel::MyModel(QObject *parent):QStandardItemModel(parent){}

void MyModel::createItem(int row, const QString &text)
{
   setItem(row, new QStandardItem(text));
}

void MyModel::setCheckable(int row)
{
   item(row)->setCheckState(Qt::Unchecked);
   item(row)->setCheckable(true); // A checkbox appears besides the text
}

void MyModel::hideCheckBox(int row)
{
   item(row)->setCheckState(Qt::Unchecked);
   item(row)->setCheckable(false); // does not work

   // I need to completely replace the item for the checkbox to disapear.
   // This doesn't seem the proper way to proceed
   setItem(row, new QStandardItem(item(row)->data(Qt::DisplayRole).toString()));
}


有更好的方法进行吗?

最佳答案

当您调用setCheckStatesetCheckable时,qt将通过添加或设置Qt::CheckStateRole数据来更新列表项的数据。如果存在Qt::CheckStateRole数据,将显示复选图标。因此,您需要将其从列表项的数据映射中删除。

最后,hideCheckBox的代码应为:

void MyModel::hideCheckBox(int row)
{
    // check the item pointer
    QStandardItem* pitem = item(row);
    if (pitem == NULL) return;

    // find and delete the Qt::CheckStateRole data
    QMap<int, QVariant> mdata = itemData(pitem->index());
    if (mdata.remove(Qt::CheckStateRole))
    {
        setItemData(pitem->index(), mdata);
    }
}


希望它有用。 :)

09-04 17:49
查看更多