隐藏QListView项目中的复选框

时间:2014-02-07 01:21:26

标签: c++ qt

我挥动了由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()));
}

还有更好的方法吗?

2 个答案:

答案 0 :(得分:2)

当您致电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);
    }
}

希望它有用。 :)

答案 1 :(得分:0)

我认为项目标志定义的项目中存在复选框,因此我将按以下方式编写函数:

void MyModel::hideCheckBox(int row)
{
   // Does not set the Qt::ItemIsUserCheckable flag.
   item(row)->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
}