qabstractitemmodel.h
上传用户:detong
上传日期:2022-06-22
资源大小:20675k
文件大小:15k
源码类别:

系统编程

开发平台:

Unix_Linux

  1. /****************************************************************************
  2. **
  3. ** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
  4. ** Contact: Qt Software Information (qt-info@nokia.com)
  5. **
  6. ** This file is part of the QtCore module of the Qt Toolkit.
  7. **
  8. ** Commercial Usage
  9. ** Licensees holding valid Qt Commercial licenses may use this file in
  10. ** accordance with the Qt Commercial License Agreement provided with the
  11. ** Software or, alternatively, in accordance with the terms contained in
  12. ** a written agreement between you and Nokia.
  13. **
  14. **
  15. ** GNU General Public License Usage
  16. ** Alternatively, this file may be used under the terms of the GNU
  17. ** General Public License versions 2.0 or 3.0 as published by the Free
  18. ** Software Foundation and appearing in the file LICENSE.GPL included in
  19. ** the packaging of this file.  Please review the following information
  20. ** to ensure GNU General Public Licensing requirements will be met:
  21. ** http://www.fsf.org/licensing/licenses/info/GPLv2.html and
  22. ** http://www.gnu.org/copyleft/gpl.html.  In addition, as a special
  23. ** exception, Nokia gives you certain additional rights. These rights
  24. ** are described in the Nokia Qt GPL Exception version 1.3, included in
  25. ** the file GPL_EXCEPTION.txt in this package.
  26. **
  27. ** Qt for Windows(R) Licensees
  28. ** As a special exception, Nokia, as the sole copyright holder for Qt
  29. ** Designer, grants users of the Qt/Eclipse Integration plug-in the
  30. ** right for the Qt/Eclipse Integration to link to functionality
  31. ** provided by Qt Designer and its related libraries.
  32. **
  33. ** If you are unsure which license is appropriate for your use, please
  34. ** contact the sales department at qt-sales@nokia.com.
  35. **
  36. ****************************************************************************/
  37. #ifndef QABSTRACTITEMMODEL_H
  38. #define QABSTRACTITEMMODEL_H
  39. #include <QtCore/qvariant.h>
  40. #include <QtCore/qobject.h>
  41. QT_BEGIN_HEADER
  42. QT_BEGIN_NAMESPACE
  43. QT_MODULE(Core)
  44. class QAbstractItemModel;
  45. class QPersistentModelIndex;
  46. class Q_CORE_EXPORT QModelIndex
  47. {
  48.     friend class QAbstractItemModel;
  49.     friend class QProxyModel;
  50. public:
  51.     inline QModelIndex() : r(-1), c(-1), p(0), m(0) {}
  52.     inline QModelIndex(const QModelIndex &other)
  53.         : r(other.r), c(other.c), p(other.p), m(other.m) {}
  54.     inline ~QModelIndex() { p = 0; m = 0; }
  55.     inline int row() const { return r; }
  56.     inline int column() const { return c; }
  57.     inline void *internalPointer() const { return p; }
  58.     inline qint64 internalId() const { return reinterpret_cast<qint64>(p); }
  59.     inline QModelIndex parent() const;
  60.     inline QModelIndex sibling(int row, int column) const;
  61.     inline QModelIndex child(int row, int column) const;
  62.     inline QVariant data(int role = Qt::DisplayRole) const;
  63.     inline Qt::ItemFlags flags() const;
  64.     inline const QAbstractItemModel *model() const { return m; }
  65.     inline bool isValid() const { return (r >= 0) && (c >= 0) && (m != 0); }
  66.     inline bool operator==(const QModelIndex &other) const
  67.         { return (other.r == r) && (other.p == p) && (other.c == c) && (other.m == m); }
  68.     inline bool operator!=(const QModelIndex &other) const
  69.         { return !(*this == other); }
  70.     inline bool operator<(const QModelIndex &other) const
  71.         {
  72.           if (r < other.r) return true;
  73.           if (r == other.r) {
  74.               if (c < other.c) return true;
  75.               if (c == other.c) {
  76.                   if (p < other.p) return true;
  77.                   if (p == other.p) return m < other.m;
  78.               }
  79.           }
  80.           return false; }
  81. private:
  82.     inline QModelIndex(int row, int column, void *ptr, const QAbstractItemModel *model);
  83.     int r, c;
  84.     void *p;
  85.     const QAbstractItemModel *m;
  86. };
  87. Q_DECLARE_TYPEINFO(QModelIndex, Q_MOVABLE_TYPE);
  88. #ifndef QT_NO_DEBUG_STREAM
  89. Q_CORE_EXPORT QDebug operator<<(QDebug, const QModelIndex &);
  90. #endif
  91. class QPersistentModelIndexData;
  92. class Q_CORE_EXPORT QPersistentModelIndex
  93. {
  94. public:
  95.     QPersistentModelIndex();
  96.     QPersistentModelIndex(const QModelIndex &index);
  97.     QPersistentModelIndex(const QPersistentModelIndex &other);
  98.     ~QPersistentModelIndex();
  99.     bool operator<(const QPersistentModelIndex &other) const;
  100.     bool operator==(const QPersistentModelIndex &other) const;
  101.     inline bool operator!=(const QPersistentModelIndex &other) const
  102.     { return !operator==(other); }
  103.     QPersistentModelIndex &operator=(const QPersistentModelIndex &other);
  104.     bool operator==(const QModelIndex &other) const;
  105.     bool operator!=(const QModelIndex &other) const;
  106.     QPersistentModelIndex &operator=(const QModelIndex &other);
  107.     operator const QModelIndex&() const;
  108.     int row() const;
  109.     int column() const;
  110.     void *internalPointer() const;
  111.     qint64 internalId() const;
  112.     QModelIndex parent() const;
  113.     QModelIndex sibling(int row, int column) const;
  114.     QModelIndex child(int row, int column) const;
  115.     QVariant data(int role = Qt::DisplayRole) const;
  116.     Qt::ItemFlags flags() const;
  117.     const QAbstractItemModel *model() const;
  118.     bool isValid() const;
  119. private:
  120.     QPersistentModelIndexData *d;
  121. #ifndef QT_NO_DEBUG_STREAM
  122.     friend Q_CORE_EXPORT QDebug operator<<(QDebug, const QPersistentModelIndex &);
  123. #endif
  124. };
  125. Q_DECLARE_TYPEINFO(QPersistentModelIndex, Q_MOVABLE_TYPE);
  126. #ifndef QT_NO_DEBUG_STREAM
  127. Q_CORE_EXPORT QDebug operator<<(QDebug, const QPersistentModelIndex &);
  128. #endif
  129. template<typename T> class QList;
  130. typedef QList<QModelIndex> QModelIndexList;
  131. class QMimeData;
  132. class QAbstractItemModelPrivate;
  133. template <class Key, class T> class QMap;
  134. class Q_CORE_EXPORT QAbstractItemModel : public QObject
  135. {
  136.     Q_OBJECT
  137.     friend class QPersistentModelIndexData;
  138. public:
  139.     explicit QAbstractItemModel(QObject *parent = 0);
  140.     virtual ~QAbstractItemModel();
  141.     bool hasIndex(int row, int column, const QModelIndex &parent = QModelIndex()) const;
  142.     virtual QModelIndex index(int row, int column,
  143.                               const QModelIndex &parent = QModelIndex()) const = 0;
  144.     virtual QModelIndex parent(const QModelIndex &child) const = 0;
  145.     inline QModelIndex sibling(int row, int column, const QModelIndex &idx) const
  146.         { return index(row, column, parent(idx)); }
  147.     virtual int rowCount(const QModelIndex &parent = QModelIndex()) const = 0;
  148.     virtual int columnCount(const QModelIndex &parent = QModelIndex()) const = 0;
  149.     virtual bool hasChildren(const QModelIndex &parent = QModelIndex()) const;
  150.     virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const = 0;
  151.     virtual bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole);
  152.     virtual QVariant headerData(int section, Qt::Orientation orientation,
  153.                                 int role = Qt::DisplayRole) const;
  154.     virtual bool setHeaderData(int section, Qt::Orientation orientation, const QVariant &value,
  155.                                int role = Qt::EditRole);
  156.     virtual QMap<int, QVariant> itemData(const QModelIndex &index) const;
  157.     virtual bool setItemData(const QModelIndex &index, const QMap<int, QVariant> &roles);
  158.     virtual QStringList mimeTypes() const;
  159.     virtual QMimeData *mimeData(const QModelIndexList &indexes) const;
  160.     virtual bool dropMimeData(const QMimeData *data, Qt::DropAction action,
  161.                               int row, int column, const QModelIndex &parent);
  162.     virtual Qt::DropActions supportedDropActions() const;
  163.     Qt::DropActions supportedDragActions() const;
  164.     void setSupportedDragActions(Qt::DropActions);
  165.     virtual bool insertRows(int row, int count, const QModelIndex &parent = QModelIndex());
  166.     virtual bool insertColumns(int column, int count, const QModelIndex &parent = QModelIndex());
  167.     virtual bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex());
  168.     virtual bool removeColumns(int column, int count, const QModelIndex &parent = QModelIndex());
  169.     inline bool insertRow(int row, const QModelIndex &parent = QModelIndex());
  170.     inline bool insertColumn(int column, const QModelIndex &parent = QModelIndex());
  171.     inline bool removeRow(int row, const QModelIndex &parent = QModelIndex());
  172.     inline bool removeColumn(int column, const QModelIndex &parent = QModelIndex());
  173.     virtual void fetchMore(const QModelIndex &parent);
  174.     virtual bool canFetchMore(const QModelIndex &parent) const;
  175.     virtual Qt::ItemFlags flags(const QModelIndex &index) const;
  176.     virtual void sort(int column, Qt::SortOrder order = Qt::AscendingOrder);
  177.     virtual QModelIndex buddy(const QModelIndex &index) const;
  178.     virtual QModelIndexList match(const QModelIndex &start, int role,
  179.                                   const QVariant &value, int hits = 1,
  180.                                   Qt::MatchFlags flags =
  181.                                   Qt::MatchFlags(Qt::MatchStartsWith|Qt::MatchWrap)) const;
  182.     virtual QSize span(const QModelIndex &index) const;
  183. #ifdef Q_NO_USING_KEYWORD
  184.     inline QObject *parent() const { return QObject::parent(); }
  185. #else
  186.     using QObject::parent;
  187. #endif
  188. Q_SIGNALS:
  189.     void dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight);
  190.     void headerDataChanged(Qt::Orientation orientation, int first, int last);
  191.     void layoutChanged();
  192.     void layoutAboutToBeChanged();
  193. #if !defined(Q_MOC_RUN) && !defined(qdoc)
  194. private: // can only be emitted by QAbstractItemModel
  195. #endif
  196.     void rowsAboutToBeInserted(const QModelIndex &parent, int first, int last);
  197.     void rowsInserted(const QModelIndex &parent, int first, int last);
  198.     void rowsAboutToBeRemoved(const QModelIndex &parent, int first, int last);
  199.     void rowsRemoved(const QModelIndex &parent, int first, int last);
  200.     void columnsAboutToBeInserted(const QModelIndex &parent, int first, int last);
  201.     void columnsInserted(const QModelIndex &parent, int first, int last);
  202.     void columnsAboutToBeRemoved(const QModelIndex &parent, int first, int last);
  203.     void columnsRemoved(const QModelIndex &parent, int first, int last);
  204.     void modelAboutToBeReset();
  205.     void modelReset();
  206. public Q_SLOTS:
  207.     virtual bool submit();
  208.     virtual void revert();
  209. protected:
  210.     QAbstractItemModel(QAbstractItemModelPrivate &dd, QObject *parent = 0);
  211.     inline QModelIndex createIndex(int row, int column, void *data = 0) const;
  212.     inline QModelIndex createIndex(int row, int column, int id) const;
  213.     inline QModelIndex createIndex(int row, int column, quint32 id) const;
  214.     void encodeData(const QModelIndexList &indexes, QDataStream &stream) const;
  215.     bool decodeData(int row, int column, const QModelIndex &parent, QDataStream &stream);
  216.     void beginInsertRows(const QModelIndex &parent, int first, int last);
  217.     void endInsertRows();
  218.     void beginRemoveRows(const QModelIndex &parent, int first, int last);
  219.     void endRemoveRows();
  220.     void beginInsertColumns(const QModelIndex &parent, int first, int last);
  221.     void endInsertColumns();
  222.     void beginRemoveColumns(const QModelIndex &parent, int first, int last);
  223.     void endRemoveColumns();
  224.     void reset();
  225.     void changePersistentIndex(const QModelIndex &from, const QModelIndex &to);
  226.     void changePersistentIndexList(const QModelIndexList &from, const QModelIndexList &to);
  227.     QModelIndexList persistentIndexList() const;
  228. private:
  229.     Q_DECLARE_PRIVATE(QAbstractItemModel)
  230.     Q_DISABLE_COPY(QAbstractItemModel)
  231. };
  232. inline bool QAbstractItemModel::insertRow(int arow, const QModelIndex &aparent)
  233. { return insertRows(arow, 1, aparent); }
  234. inline bool QAbstractItemModel::insertColumn(int acolumn, const QModelIndex &aparent)
  235. { return insertColumns(acolumn, 1, aparent); }
  236. inline bool QAbstractItemModel::removeRow(int arow, const QModelIndex &aparent)
  237. { return removeRows(arow, 1, aparent); }
  238. inline bool QAbstractItemModel::removeColumn(int acolumn, const QModelIndex &aparent)
  239. { return removeColumns(acolumn, 1, aparent); }
  240. inline QModelIndex QAbstractItemModel::createIndex(int arow, int acolumn, void *adata) const
  241. { return QModelIndex(arow, acolumn, adata, this); }
  242. inline QModelIndex QAbstractItemModel::createIndex(int arow, int acolumn, int aid) const
  243. #if defined(Q_CC_MSVC)
  244. #pragma warning( push )
  245. #pragma warning( disable : 4312 ) // avoid conversion warning on 64-bit
  246. #endif
  247. { return QModelIndex(arow, acolumn, reinterpret_cast<void*>(aid), this); }
  248. #if defined(Q_CC_MSVC)
  249. #pragma warning( pop )
  250. #endif
  251. inline QModelIndex QAbstractItemModel::createIndex(int arow, int acolumn, quint32 aid) const
  252. #if defined(Q_CC_MSVC)
  253. #pragma warning( push )
  254. #pragma warning( disable : 4312 ) // avoid conversion warning on 64-bit
  255. #endif
  256. { return QModelIndex(arow, acolumn, reinterpret_cast<void*>(aid), this); }
  257. #if defined(Q_CC_MSVC)
  258. #pragma warning( pop )
  259. #endif
  260. class Q_CORE_EXPORT QAbstractTableModel : public QAbstractItemModel
  261. {
  262.     Q_OBJECT
  263. public:
  264.     explicit QAbstractTableModel(QObject *parent = 0);
  265.     ~QAbstractTableModel();
  266.     QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const;
  267.     bool dropMimeData(const QMimeData *data, Qt::DropAction action,
  268.                       int row, int column, const QModelIndex &parent);
  269. protected:
  270.     QAbstractTableModel(QAbstractItemModelPrivate &dd, QObject *parent);
  271. private:
  272.     Q_DISABLE_COPY(QAbstractTableModel)
  273.     QModelIndex parent(const QModelIndex &child) const;
  274.     bool hasChildren(const QModelIndex &parent) const;
  275. };
  276. class Q_CORE_EXPORT QAbstractListModel : public QAbstractItemModel
  277. {
  278.     Q_OBJECT
  279. public:
  280.     explicit QAbstractListModel(QObject *parent = 0);
  281.     ~QAbstractListModel();
  282.     QModelIndex index(int row, int column = 0, const QModelIndex &parent = QModelIndex()) const;
  283.     bool dropMimeData(const QMimeData *data, Qt::DropAction action,
  284.                       int row, int column, const QModelIndex &parent);
  285. protected:
  286.     QAbstractListModel(QAbstractItemModelPrivate &dd, QObject *parent);
  287. private:
  288.     Q_DISABLE_COPY(QAbstractListModel)
  289.     QModelIndex parent(const QModelIndex &child) const;
  290.     int columnCount(const QModelIndex &parent) const;
  291.     bool hasChildren(const QModelIndex &parent) const;
  292. };
  293. // inline implementations
  294. inline QModelIndex::QModelIndex(int arow, int acolumn, void *adata,
  295.                                 const QAbstractItemModel *amodel)
  296.     : r(arow), c(acolumn), p(adata), m(amodel) {}
  297. inline QModelIndex QModelIndex::parent() const
  298. { return m ? m->parent(*this) : QModelIndex(); }
  299. inline QModelIndex QModelIndex::sibling(int arow, int acolumn) const
  300. { return m ? (r == arow && c == acolumn) ? *this : m->index(arow, acolumn, m->parent(*this)) : QModelIndex(); }
  301. inline QModelIndex QModelIndex::child(int arow, int acolumn) const
  302. { return m ? m->index(arow, acolumn, *this) : QModelIndex(); }
  303. inline QVariant QModelIndex::data(int arole) const
  304. { return m ? m->data(*this, arole) : QVariant(); }
  305. inline Qt::ItemFlags QModelIndex::flags() const
  306. { return m ? m->flags(*this) : Qt::ItemFlags(0); }
  307. inline uint qHash(const QModelIndex &index)
  308. { return uint((index.row() << 4) + index.column() + index.internalId()); }
  309. QT_END_NAMESPACE
  310. QT_END_HEADER
  311. #endif // QABSTRACTITEMMODEL_H