Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qrangemodel.h
Go to the documentation of this file.
1// Copyright (C) 2025 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3// Qt-Security score:significant reason:default
4
5#ifndef QRANGEMODEL_H
6#define QRANGEMODEL_H
7
8#include <QtCore/qrangemodel_impl.h>
9
10QT_BEGIN_NAMESPACE
11
12class QRangeModelPrivate;
13class QCollator;
14
15class Q_CORE_EXPORT QRangeModel : public QAbstractItemModel
16{
17 Q_OBJECT
18 Q_PROPERTY(QHash<int, QByteArray> roleNames READ roleNames WRITE setRoleNames RESET resetRoleNames
19 NOTIFY roleNamesChanged FINAL)
20 Q_PROPERTY(AutoConnectPolicy autoConnectPolicy READ autoConnectPolicy WRITE setAutoConnectPolicy
21 NOTIFY autoConnectPolicyChanged REVISION(6, 11))
22 Q_PROPERTY(int sortRole READ sortRole WRITE setSortRole RESET resetSortRole
23 NOTIFY sortRoleChanged REVISION(6, 12))
24 Q_PROPERTY(QCollator sortCollator READ sortCollator WRITE setSortCollator
25 RESET resetSortCollator NOTIFY sortCollatorChanged REVISION(6, 12))
26 Q_PROPERTY(QCollator matchCollator READ matchCollator WRITE setMatchCollator
27 RESET resetMatchCollator NOTIFY matchCollatorChanged REVISION(6, 13))
28 Q_PROPERTY(Qt::DropActions supportedDropActions READ supportedDropActions
29 WRITE setSupportedDropActions
30 RESET resetSupportedDropActions
31 NOTIFY supportedDropActionsChanged REVISION(6, 12))
32 Q_PROPERTY(Qt::DropActions supportedDragActions READ supportedDragActions
33 WRITE setSupportedDragActions
34 RESET resetSupportedDragActions
35 NOTIFY supportedDragActionsChanged REVISION(6, 12))
36 Q_CLASSINFO("RegisterEnumClassesUnscoped", "false")
38public:
39 enum class AutoConnectPolicy {
40 None,
41 Full,
42 OnRead,
43 };
44 Q_ENUM(AutoConnectPolicy)
46 enum class RowCategory {
47 Default,
48 MultiRoleItem,
49 };
50
51 enum class DropOperation {
52 DontDrop,
53 Automatic,
54 OverwriteAndIgnore,
55 OverwriteAndExtend,
56 InsertAsSiblings,
57 InsertAsChildren,
58 };
59 Q_ENUM(DropOperation);
60
61 template <typename T>
62 struct RowOptions {
63#ifdef Q_QDOC
64 static constexpr RowCategory rowCategory;
65 static QVariant headerData(int section, int role);
66 static Qt::ItemFlags flags(const T &row);
67
68 static QStringList mimeTypes();
69 static QMimeData *mimeData(const auto &range);
70 static QMimeData *mimeData(const QModelIndex &range);
71 static bool canDropMimeData(const QMimeData *mimeData);
72 static bool canDropMimeData(const QMimeData *mimeData, Qt::DragAction action,
73 int row, int column, const QModelIndex &parent);
74 static auto dropMimeData(const QMimeData *mimeData, auto inserter);
75 static auto dropMimeData(const QMimeData *mimeData, Qt::DragAction action,
76 int row, int column, const QModelIndex &parent,
77 auto inserter);
78#endif
79 };
80
81 template <typename T>
82 struct ItemAccess {
83#ifdef Q_QDOC
84 static QVariant readRole(const T &item, int role);
85 static bool writeRole(T &item, const QVariant &value, int role);
86 static Qt::ItemFlags flags(const T &item);
87
88 static QStringList mimeTypes();
89 static QMimeData *mimeData(const auto &range);
90 static QMimeData *mimeData(const QModelIndex &range);
91 static bool canDropMimeData(const QMimeData *mimeData);
92 static bool canDropMimeData(const QMimeData *mimeData, Qt::DragAction action,
93 int row, int column, const QModelIndex &parent);
94 static auto dropMimeData(const QMimeData *mimeData, auto inserter);
95 static auto dropMimeData(const QMimeData *mimeData, Qt::DragAction action,
96 int row, int column, const QModelIndex &parent,
97 auto inserter);
98#endif
99 };
100
101 template <typename Range,
102 QRangeModelDetails::if_table_range<Range> = true>
103 explicit QRangeModel(Range &&range, QObject *parent = nullptr)
104 : QRangeModel(new QGenericTableItemModelImpl<Range>(std::forward<Range>(range), this), parent)
105 {}
106
107 template <typename Range,
108 QRangeModelDetails::if_tree_range<Range> = true>
109 explicit QRangeModel(Range &&range, QObject *parent = nullptr)
110 : QRangeModel(std::forward<Range>(range), QRangeModelDetails::DefaultTreeProtocol<Range>{},
111 parent)
112 {}
113
114 template <typename Range, typename Protocol,
115 QRangeModelDetails::if_tree_range<Range, Protocol> = true>
116 explicit QRangeModel(Range &&range, Protocol &&protocol, QObject *parent = nullptr)
117 : QRangeModel(new QGenericTreeItemModelImpl<Range, Protocol>(std::forward<Range>(range),
118 std::forward<Protocol>(protocol),
119 this),
120 parent)
121 {}
122
123 ~QRangeModel() override;
124
125 QModelIndex index(int row, int column, const QModelIndex &parent = {}) const final;
126 QModelIndex parent(const QModelIndex &child) const final;
127 QModelIndex sibling(int row, int column, const QModelIndex &index) const final;
128 int rowCount(const QModelIndex &parent = {}) const final;
129 int columnCount(const QModelIndex &parent = {}) const final;
130 Qt::ItemFlags flags(const QModelIndex &index) const override;
131 QVariant headerData(int section, Qt::Orientation orientation,
132 int role = Qt::DisplayRole) const override;
133 bool setHeaderData(int section, Qt::Orientation orientation, const QVariant &data,
134 int role = Qt::EditRole) override;
135 QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
136 bool setData(const QModelIndex &index, const QVariant &data, int role = Qt::EditRole) override;
137 QMap<int, QVariant> itemData(const QModelIndex &index) const override;
138 bool setItemData(const QModelIndex &index, const QMap<int, QVariant> &data) override;
139 bool clearItemData(const QModelIndex &index) override;
140 bool insertColumns(int column, int count, const QModelIndex &parent = {}) final;
141 bool removeColumns(int column, int count, const QModelIndex &parent = {}) final;
142 bool moveColumns(const QModelIndex &sourceParent, int sourceColumn, int count,
143 const QModelIndex &destParent, int destColumn) final;
144 bool insertRows(int row, int count, const QModelIndex &parent = {}) final;
145 bool removeRows(int row, int count, const QModelIndex &parent = {}) final;
146 bool moveRows(const QModelIndex &sourceParent, int sourceRow, int count,
147 const QModelIndex &destParent, int destRow) final;
148
149 QHash<int, QByteArray> roleNames() const override;
150 void setRoleNames(const QHash<int, QByteArray> &names);
151 void resetRoleNames();
152
153 bool canFetchMore(const QModelIndex &parent) const override;
154 void fetchMore(const QModelIndex &parent) override;
155
156 bool hasChildren(const QModelIndex &parent = QModelIndex()) const final;
157 QModelIndex buddy(const QModelIndex &index) const override;
158 bool canDropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column,
159 const QModelIndex &parent) const override;
160 bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column,
161 const QModelIndex &parent) override;
162 QMimeData *mimeData(const QModelIndexList &indexes) const override;
163 QStringList mimeTypes() const override;
164 QModelIndexList match(const QModelIndex &start, int role, const QVariant &value, int hits,
165 Qt::MatchFlags flags) const override;
166 void multiData(const QModelIndex &index, QModelRoleDataSpan roleDataSpan) const override;
167 void sort(int column, Qt::SortOrder order = Qt::AscendingOrder) override;
168
169 QCollator sortCollator() const;
170 void setSortCollator(const QCollator &collator);
171 void resetSortCollator();
172
173 QCollator matchCollator() const;
174 void setMatchCollator(const QCollator &collator);
175 void resetMatchCollator();
176
177 int sortRole() const;
178 void setSortRole(int role);
179 void resetSortRole();
180
181 QSize span(const QModelIndex &index) const override;
182
183 Qt::DropActions supportedDragActions() const override;
184 void setSupportedDragActions(Qt::DropActions actions);
185 void resetSupportedDragActions();
186 Qt::DropActions supportedDropActions() const override;
187 void setSupportedDropActions(Qt::DropActions actions);
188 void resetSupportedDropActions();
189
190 AutoConnectPolicy autoConnectPolicy() const;
191 void setAutoConnectPolicy(AutoConnectPolicy policy);
192
193Q_SIGNALS:
194 void roleNamesChanged();
195 Q_REVISION(6, 11) void autoConnectPolicyChanged(AutoConnectPolicy policy);
196 Q_REVISION(6, 12) void sortRoleChanged(int role);
197 Q_REVISION(6, 12) void sortCollatorChanged(const QCollator &collator);
198 Q_REVISION(6, 13) void matchCollatorChanged(const QCollator &collator);
199 Q_REVISION(6, 12) void supportedDragActionsChanged(Qt::DropActions actions);
200 Q_REVISION(6, 12) void supportedDropActionsChanged(Qt::DropActions actions);
201
202protected Q_SLOTS:
203 void resetInternalData() override;
204
205protected:
206 bool event(QEvent *) override;
207 bool eventFilter(QObject *, QEvent *) override;
208
209private:
210 Q_DISABLE_COPY_MOVE(QRangeModel)
211 Q_DECLARE_PRIVATE(QRangeModel)
212
213 explicit QRangeModel(QRangeModelImplBase *impl, QObject *parent);
214 friend class QRangeModelImplBase;
215};
216
217// implementation of forwarders
218QModelIndex QRangeModelImplBase::createIndex(int row, int column, const void *ptr) const
219{
220 return m_rangeModel->createIndex(row, column, ptr);
221}
222QModelIndexList QRangeModelImplBase::persistentIndexList() const
223{
224 return m_rangeModel->persistentIndexList();
225}
226void QRangeModelImplBase::changePersistentIndex(const QModelIndex &from,
227 const QModelIndex &to)
228{
229 m_rangeModel->changePersistentIndex(from, to);
230}
231QHash<int, QByteArray> QRangeModelImplBase::roleNames() const
232{
233 return m_rangeModel->roleNames();
234}
235void QRangeModelImplBase::dataChanged(const QModelIndex &from, const QModelIndex &to,
236 const QList<int> &roles)
237{
238 m_rangeModel->dataChanged(from, to, roles);
239}
240void QRangeModelImplBase::beginResetModel()
241{
242 m_rangeModel->beginResetModel();
243}
244void QRangeModelImplBase::endResetModel()
245{
246 m_rangeModel->endResetModel();
247}
248void QRangeModelImplBase::beginInsertColumns(const QModelIndex &parent, int start, int count)
249{
250 m_rangeModel->beginInsertColumns(parent, start, count);
251}
252void QRangeModelImplBase::endInsertColumns()
253{
254 m_rangeModel->endInsertColumns();
255}
256void QRangeModelImplBase::beginRemoveColumns(const QModelIndex &parent, int start, int count)
257{
258 m_rangeModel->beginRemoveColumns(parent, start, count);
259}
260void QRangeModelImplBase::endRemoveColumns()
261{
262 m_rangeModel->endRemoveColumns();
263}
264bool QRangeModelImplBase::beginMoveColumns(const QModelIndex &sourceParent, int sourceFirst,
265 int sourceLast, const QModelIndex &destParent,
266 int destColumn)
267{
268 return m_rangeModel->beginMoveColumns(sourceParent, sourceFirst, sourceLast,
269 destParent, destColumn);
270}
271void QRangeModelImplBase::endMoveColumns()
272{
273 m_rangeModel->endMoveColumns();
274}
275
276void QRangeModelImplBase::beginInsertRows(const QModelIndex &parent, int start, int count)
277{
278 m_rangeModel->beginInsertRows(parent, start, count);
279}
280void QRangeModelImplBase::endInsertRows()
281{
282 m_rangeModel->endInsertRows();
283}
284void QRangeModelImplBase::beginRemoveRows(const QModelIndex &parent, int start, int count)
285{
286 m_rangeModel->beginRemoveRows(parent, start, count);
287}
288void QRangeModelImplBase::endRemoveRows()
289{
290 m_rangeModel->endRemoveRows();
291}
292bool QRangeModelImplBase::beginMoveRows(const QModelIndex &sourceParent, int sourceFirst,
293 int sourceLast,
294 const QModelIndex &destParent, int destRow)
295{
296 return m_rangeModel->beginMoveRows(sourceParent, sourceFirst, sourceLast, destParent, destRow);
297}
298void QRangeModelImplBase::endMoveRows()
299{
300 m_rangeModel->endMoveRows();
301}
302void QRangeModelImplBase::beginLayoutChange()
303{
304 Q_EMIT m_rangeModel->layoutAboutToBeChanged();
305}
306void QRangeModelImplBase::endLayoutChange()
307{
308 Q_EMIT m_rangeModel->layoutChanged();
309}
310
311QAbstractItemModel &QRangeModelImplBase::itemModel()
312{
313 return *m_rangeModel;
314}
315const QAbstractItemModel &QRangeModelImplBase::itemModel() const
316{
317 return *m_rangeModel;
318}
319
320QRangeModelImplBase::AutoConnectPolicy QRangeModelImplBase::autoConnectPolicy() const
321{
322 return QRangeModelImplBase::AutoConnectPolicy(m_rangeModel->autoConnectPolicy());
323}
324
325Qt::partial_ordering QRangeModelImplBase::compareData(const QVariant &lhs, const QVariant &rhs,
326 const QCollator *collator)
327{
328 return QRangeModel::compareData(lhs, rhs, collator);
329}
330
331// Helper templates that we can forward declare in the _impl header,
332// where QRangeModel is not yet defined.
333namespace QRangeModelDetails
334{
335template <typename T>
337
338template <typename T>
340}
341
342QT_END_NAMESPACE
343
344
345#endif // QRANGEMODEL_H
\inmodule QtCore
Definition qrangemodel.h:16
static bool matchValueImpl(const QString &itemData, const QVariant &value, Qt::MatchFlags flags, const QCollator *collator)
static bool connectPropertiesHelper(const QModelIndex &index, const QObject *item, QRangeModelDetails::AutoConnectContext *context, const QHash< int, QMetaProperty > &properties)
~ConstPropertyChangedHandler()=default
ConstPropertyChangedHandler(ConstPropertyChangedHandler &&other) noexcept=default
ConstPropertyChangedHandler(const QModelIndex &index, int role)
PropertyChangedHandler & operator=(PropertyChangedHandler &&)=delete
PropertyChangedHandler(PropertyChangedHandler &&other) noexcept
PropertyChangedHandler(const PropertyChangedHandler &)=delete
PropertyChangedHandler & operator=(const PropertyChangedHandler &)=delete
~PropertyChangedHandler()=default
PropertyChangedHandler(const QPersistentModelIndex &index, int role)
PropertyChangedHandler & operator=(QMetaObject::Connection &&connection)