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