QAbstractItemModel类的子类,经常需要实现的几个方法
When subclassing QAbstractItemModel, at the very least you must implement index(), parent(), rowCount(), columnCount(), and data().
the model is a simple table of rows and columns. Each item has a unique index specified by a QModelIndex.
You can obtain this model index using the index( int nRow,int nColumn, QModelIndex *parent=0 ) function
用index()函数获取QModelIndex模型索引。
1.
flags()方法。
//flags()方法的,判断使用的是QModelIndex类的column()方法,根据列进行判断。
Qt::ItemFlags TradeTableModel::flags ( const QModelIndex & index ) const
{
Qt::ItemFlags flags = QAbstractItemModel::flags(index);
switch(index.column())
{
case ORDER_ID://如果是订单ID列,允许勾选
flags |= Qt::ItemIsUserCheckable;
break;
case GUARANTEEVALUEAMOUNT:
{
if(m_bGuaranteeValueEditable )
{
flags |= Qt::ItemIsEditable;//允许勾选
}
}
break;
}
return flags;
}
2.
index()方法
//根据行和列,创建QModelIndex模型索引,
//在model中,QModelIndex才是访问数据的 唯一标识
QModelIndex TradeTableModel::index ( int row, int column, const QModelIndex & parent/* = QModelIndex() */) const
{
if (row < 0 || column < 0)
{
return QModelIndex();
}
return createIndex(row, column);//QAbstractItemModel类的方法 createIndex(),根据行列,创建QModelIndex。
}
3.
data()方法
//返回index模型索引处的数据,根据角色不同,获取不同的数据。
//返回给个角色的值
QVariant TradeTableModel::data ( const QModelIndex & index, int role /*= Qt::DisplayRole*/ ) const
{
if(!index.isValid() || index.row() >=m_OrderList.size() || m_OrderList.isEmpty())
{
Q_ASSERT(false);
return QVariant();
}
switch(role)
{
case Qt::DisplayRole: //显示文字
case Qt::EditRole:
{
QVariant varHeader = headerData(index.column(), Qt::Horizontal , Qt::UserRole);
return GetIndexData(index, varHeader);
}
break;
}
}
4.
setData()方法
//设置model中的数据,
bool TradeTableModel::setData ( const QModelIndex & index, const QVariant & value, int role/* = Qt::EditRole */)
{
int row = index.row();
if(role == Qt::CheckStateRole && index.column() == ORDER_ID)
{
ORDER_LIST_STRUCT& orderData = m_OrderList[row];
orderData.m_bChecked = !orderData.m_bChecked;
}
}
5.
headData()方法
QHeaderView标题类使用的数据,就是有model中的方法headerData()提供的。
即列的名字。
//返回列的内容,即表格显示的列名字
QVariant TradeTableModel::headerData ( int section, Qt::Orientation orientation, int role/* = Qt::DisplayRole*/ ) const
{
if (orientation == Qt::Horizontal )
{
if(role == Qt::DisplayRole)
{
return GetHeadData(section, role);
}
else if(role == Qt::UserRole)
{
return GetHeadData(section, role);
}
}
return QAbstractItemModel::headerData(section, orientation, role);
}
6.
int TradeTableModel::columnCount ( const QModelIndex & parent/* = QModelIndex() */) const
{
return 10;//有几列就返回列的数量
}
7.
int TradeTableModel::rowCount ( const QModelIndex & parent/* = QModelIndex()*/ ) const
{
return m_OrderList.size();//返回行的数量
}
8.
QModelIndex TradeTableModel::parent ( const QModelIndex & index ) const
{
return QModelIndex();//直接返回 QModelIndex(),空的QModelIndex,表示,没有父QModelIndex。
}
9.
QVariant headData( int section,Qt::Orientation orientation, int role=Qt::DisplayRole )
//该方法,主要是返回列名称,
//也可以返回列的序号,
//section:列序号,即第几列
//orientation:水平还是垂直
//role:角色
QVariant TradeTableModel::headerData ( int section, Qt::Orientation orientation, int role/* = Qt::DisplayRole*/ ) const
{
if (orientation == Qt::Horizontal )
{
if(role == Qt::DisplayRole)//一定要有role的判断,否则view不会显示列的内容
{
return 1;
}
else if(role == Qt::UserRole)
{
return “订单号”;
}
}
return QAbstractItemModel::headerData(section, orientation, role);
}