QTableView實現行選和複選框
阿新 • • 發佈:2019-02-17
');" >
其中SelectionBehavior設定成SelectRows行選
showGrid設定成false,不顯示錶格
sortingEnabled設定成true,支援排序。(據說這個功能需要實現sort方法或者使用ProxyModel,還沒有具體實驗)
-------------------
然後,自定義一個ListModel,
對於第一列資料要能夠支援CheckBox,要能夠顯示圖示,要能夠顯示文字
對應的就要返回Qt::CheckStateRole、Qt::DecorationRole、Qt::DisplayRole相應的資料。
我的實現如下:
QVariant ListModel::data(const QModelIndex &index, int role) const
{
if (!index.isValid())
return QVariant();
ListItem *item = static_cast<ListItem*>(index.internalPointer());
if (index.column()==0)//請求第一列資料
{
switch(role)
{
case Qt::DisplayRole:
return item->caption();
case Qt::DecorationRole://返回圖示
if (item->readed())
return readed;
else
return unRead;
case Qt::CheckStateRole: //返回單選框狀態
if (item->readed()) //這裡由於QCheckBox是三態的,不應該簡單的返回true,false
return Qt::Checked;
else
return Qt::Unchecked;
default:
return QVariant();
}
}
if ((index.column()==1) && (role==Qt::DisplayRole))
return item->description();
return QVariant();
}
其次,
我的flags方法實現如下:
Qt::ItemFlags ListModel::flags(const QModelIndex &index) const
{
if (!index.isValid())
return 0;
if (index.column()==0)//對於第一列設定標誌位
return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsUserCheckable;
//CheckBox
return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
}
最後,
bool ListModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
if (!index.isValid())
return false;
ListItem *item= static_cast<ListItem*>(index.internalPointer());
if ((index.column()==0)&&(role==Qt::CheckStateRole))
//CheckStateRole表示執行復選框狀態的資料更新
{
if (value == Qt::Checked)
item->setReaded(true);
else
item->setReaded(false);
}
}