我挥动QStandardItemModel
支持QListView
。在某些情况下,QStandardItem
被检查。除了项目的显示外,还会显示一个复选框。在某些时候,我想删除隐藏QStandardItem
复选框。我将它的可检查状态设置为false,但它不隐藏复选框(尽管它不能再被检查)。隐藏QListView项目中的复选框
我发现隐藏复选框的唯一方法是用新的项目替换项目。这似乎不是前面的正确方法。
这是代码:
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()));
}
有没有更好的方式来进行呢?
人们预计,setCheckable(假)确实在内部。 –
是的,它会调用'setData(Qt :: Unchecked,Qt :: CheckStateRole);'如果该项目在调用'setCheckable'时不可检查。当调用'setData'时,它会尝试在数据映射中添加'Qt :: CheckStateRole'。你可以看到[源代码](https://qt.gitorious.org/qt/qtbase/source/c8172953ed6d3776178b9a37c0773d648cfdd9f2:src/gui/itemmodels/qstandarditemmodel.cpp)。 –
@Alex谢谢你的回答!而不是通过'itemData()'映射来清除'Qt :: CheckStateRole',写QVariant()也是一样的。因此,我的最终代码将是这一行:'item(row) - > setData(QVariant(),Qt :: CheckStateRole);' – gfrigon