model模型中 要实现的几个方法

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值