2014-02-07 94 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

對不起,我試圖使用你的方法,但它沒有奏效。 –