从QListView项目中隐藏复选框

Hide the checkbox from a QListView item

本文关键字:隐藏 复选框 项目 QListView      更新时间:2023-10-16

i挥舞由QStandardItemModel支持的QListView。在某些CirconStances下,可以检查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);
    }
}

希望它有用。:)

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

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