2014-02-07 58 views
0

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

有没有更好的方式来进行呢?

回答

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); 
    } 
} 

希望它有用。 :)

+0

人们预计,setCheckable(假)确实在内部。 –

+0

是的,它会调用'setData(Qt :: Unchecked,Qt :: CheckStateRole);'如果该项目在调用'setCheckable'时不可检查。当调用'setData'时,它会尝试在数据映射中添加'Qt :: CheckStateRole'。你可以看到[源代码](https://qt.gitorious.org/qt/qtbase/source/c8172953ed6d3776178b9a37c0773d648cfdd9f2:src/gui/itemmodels/qstandarditemmodel.cpp)。 –

+0

@Alex谢谢你的回答!而不是通过'itemData()'映射来清除'Qt :: CheckStateRole',写QVariant()也是一样的。因此,我的最终代码将是这一行:'item(row) - > setData(QVariant(),Qt :: CheckStateRole);' – gfrigon

0

我想的复选框中存在由项标志定义的项目,这样我会写的函数是在下列方式:

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

对不起,我试图使用你的方法,但它没有奏效。 –