我挥动了由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()));
}
还有更好的方法吗?
答案 0 :(得分:2)
当您致电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);
}
}
希望它有用。 :)
答案 1 :(得分:0)
我认为项目标志定义的项目中存在复选框,因此我将按以下方式编写函数:
void MyModel::hideCheckBox(int row)
{
// Does not set the Qt::ItemIsUserCheckable flag.
item(row)->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
}