当前位置:主页   - 电脑 - 程序设计 - C/C++
Qt学习之路(46): 自定义model之二
来源:网络   作者:FinderCheng   更新时间:2011-07-04
收藏此页】    【字号    】    【打印】    【关闭

  前面的例子已经比较清楚的给出了自定义model的方法,就是要覆盖我们所需要的那几个函数就可以了。但是,前面的例子仅仅是简单的展示数据,也就是说数据时只读的。那么,如何能做到读写数据呢?那就要来看进来的例子了。这个例子也是来自C++GUI Programming with Qt 4, 2nd Edition这本书的。

  还是先来看代码吧:

  citymodel.h

class CityModel : public QAbstractTableModel
{
        Q_OBJECT

  public:

        CityModel(QObject *parent = 0);
        void setCities(const QStringList &cityNames);
        int rowCount(const QModelIndex &parent) const;
        int columnCount(const QModelIndex &parent) const;
        QVariant data(const QModelIndex &index, int role) const;
        bool setData(const QModelIndex &index, const QVariant &value, int role);
        QVariant headerData(int section, Qt::Orientation orientation, int role) const;
        Qt::ItemFlags flags(const QModelIndex &index) const;

  private:

        int offsetOf(int row, int column) const;
        QStringList cities;
        QVector<int> distances;
};

  citymodel.cpp

CityModel::CityModel(QObject *parent)
        : QAbstractTableModel(parent)
{
}
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();
}
QVariant CityModel::headerData(int section, Qt::Orientation orientation, int role) const
{
        if (role == Qt::DisplayRole) {
                return cities[section];
        }
        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());
                emit dataChanged(index, index);
                emit dataChanged(transposedIndex, transposedIndex);
                return true;
        }
        return false;
}
Qt::ItemFlags CityModel::flags(const QModelIndex &index) const
{
        Qt::ItemFlags flags = QAbstractItemModel::flags(index);
        if (index.row() != index.column()) {
                flags |= Qt::ItemIsEditable;
        }
        return flags;
}
void CityModel::setCities(const QStringList &cityNames)
{
        cities = cityNames;
        distances.resize(cities.count() * (cities.count() - 1) / 2);
        distances.fill(0);
        reset();
}
int CityModel::offsetOf(int row, int column) const
{
        if (row < column) {
                qSwap(row, column);
        }
        return (row * (row - 1) / 2) + column;
}

编缉推荐阅读以下文章

  • Qt学习之路(47): 自定义Model之三
  • Qt学习之路(45): 自定义model之一
  • Qt学习之路(44): QSortFilterProxyModel
  • Qt学习之路(43): QDirModel
  • Qt学习之路(42): QStringListModel
  • Qt学习之路(41): QTableWidget
  • Qt学习之路(40): QTreeWidget
  • Qt学习之路(39): QListWidget
  • Qt学习之路(38): model-view架构
  • Qt学习之路(37): Qt容器类之关联存储容器
其它资源
来源声明

版权与免责声明
1、本站所发布的文章仅供技术交流参考,本站不主张将其做为决策的依据,浏览者可自愿选择采信与否,本站不对因采信这些信息所产生的任何问题负责。
2、本站部分文章来源于网络,其版权为原权利人所有。由于来源之故,有的文章未能获得作者姓名,署“未知”或“佚名”。对于这些文章,有知悉作者姓名的请告知本站,以便及时署名。如果作者要求删除,我们将予以删除。除此之外本站不再承担其它责任。
3、本站部分文章来源于本站原创,本站拥有所有权利。
4、如对本站发布的信息有异议,请联系我们,经本站确认后,将在三个工作日内做出修改或删除处理。
请参阅权责声明