1. 程式人生 > >QTableView實現行選和複選框

QTableView實現行選和複選框

');" >
其中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();
}
其次,
光是有這些還不夠,QTableView需要通過ListMode的flags方法知道某個單元格是不是需要繪製CheckBox,
我的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;
}
最後,
結合這兩樣應該就能夠正常顯示了,不過這個時候的單選框還只是個擺設,需要實現setData方法讓複選框可用,我的setData方法實現如下:
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);
}
}