我挥动由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()));
}
有更好的方法进行吗?
最佳答案
当您调用setCheckState
或setCheckable
时,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);
}
}
希望它有用。 :)