首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

(4)Qt实现自定义模型基于QAbstractTableModel

2012-08-28 
(四)Qt实现自定义模型基于QAbstractTableModel?目录:(一) Qt Model/View 的简单说明?、预定义模型(二)使用

(四)Qt实现自定义模型基于QAbstractTableModel

?

目录:

(一) Qt Model/View 的简单说明?、预定义模型

(二)使用预定义模型?QstringListModel例子

(三)使用预定义模型QDirModel的例子

(四)Qt实现自定义模型基于QAbstractTableModel

(五)Qt实现自定义模型基于QAbstractItemModel?

(六) Qt实现自定义委托 QDelegate

?

Qt实现自定义模型基于QAbstractTableModel

两个例子

?

?

例子1代码

?

Main.cpp

?

?

citymodel.h

#include <QtCore>#include "citymodel.h"CityModel::CityModel(QObject *parent)    : QAbstractTableModel(parent){}//设定一下数据源void CityModel::setCities(const QStringList &cityNames){    cities = cityNames;    //重新设置一下QVector distances的矩阵大小的,中间对角线为0不用存    distances.resize(cities.count() * (cities.count() - 1) / 2);    //填充所有距离值为0    distances.fill(0);    //刷新所有视图数据    reset();}//模型行数int CityModel::rowCount(const QModelIndex & /* parent */) const{    return cities.count();}//模型列数int CityModel::columnCount(const QModelIndex & /* parent */) const{    return cities.count();}//赋值模型每个项的数据QVariant CityModel::data(const QModelIndex &index, int role) const{    if (!index.isValid())        return QVariant();    if (role == Qt::TextAlignmentRole) {        return int(Qt::AlignRight | Qt::AlignVCenter);    } else if (role == Qt::DisplayRole) {        if (index.row() == index.column())            return 0;        int offset = offsetOf(index.row(), index.column());        return distances[offset];    }    return QVariant();}//编辑一个项bool CityModel::setData(const QModelIndex &index,                        const QVariant &value, int role){    if (index.isValid() && index.row() != index.column()            && role == Qt::EditRole) {        int offset = offsetOf(index.row(), index.column());        distances[offset] = value.toInt();        //交换对应项的模型索引        QModelIndex transposedIndex = createIndex(index.column(),                                                  index.row());        //某项发生改变,发射信号( between topLeft and bottomRight inclusive)        emit dataChanged(index, index);        emit dataChanged(transposedIndex, transposedIndex);        return true;    }    return false;}//返回列表头QVariant CityModel::headerData(int section,                               Qt::Orientation /* orientation */,                               int role) const{    //返回在Cities字符串列表中给定偏移量的城市名称    if (role == Qt::DisplayRole)        return cities[section];    return QVariant();}//返回对一个项相关的操作的标识符(例如,是否可以编辑或者是否已选中等)Qt::ItemFlags CityModel::flags(const QModelIndex &index) const{    Qt::ItemFlags flags = QAbstractItemModel::flags(index);    if (index.row() != index.column())        flags |= Qt::ItemIsEditable;    return flags;}//计算偏移量int CityModel::offsetOf(int row, int column) const{    if (row < column)        qSwap(row, column);    return (row * (row - 1) / 2) + column;}

?

热点排行