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
specialize.cpp
Go to the documentation of this file.
1// Copyright (C) 2025 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
3
4#include <QtCore/qrangemodel.h>
5
6#ifndef QT_NO_WIDGETS
7
8#include <QtCore/qiodevice.h>
9#include <QtCore/qmimedata.h>
10#include <QtCore/qstring.h>
11#include <QtCore/qtextstream.h>
12#include <QtCore/qxmlstream.h>
13#include <QtGui/qcolor.h>
14
15#include <QtWidgets/qlistview.h>
16#include <QtWidgets/qtableview.h>
17
18using namespace Qt::StringLiterals;
19
21//! [color_gadget_decl]
23{
24 Q_GADGET
25 Q_PROPERTY(QString display READ colorName)
28public:
29//! [color_gadget_decl]
30 Qt::ItemFlags flags() const { return {}; }
31//! [color_gadget_impl]
34 {}
35
37 {
38 return m_colorName;
39 }
41 {
43 }
45 {
47 }
48
49private:
51//! [color_gadget_impl]
52//! [color_gadget_end]
53};
54//! [color_gadget_end]
55}
56
58//! [color_gadget_row_options_decl]
59
60template <>
61struct QRangeModel::RowOptions<ColorEntry>
62{
63//! [color_gadget_row_options_decl]
64//! [color_gadget_row_options_rowCategory]
65 static constexpr auto rowCategory = QRangeModel::RowCategory::MultiRoleItem;
66//! [color_gadget_row_options_rowCategory]
67//! [color_gadget_row_options_headerData]
68 static QVariant headerData(int section, int role)
69 {
70 switch (section) {
71 // ...
72 }
73 return {};
74 }
75//! [color_gadget_row_options_headerData]
76//! [color_gadget_row_options_flags]
77 static Qt::ItemFlags flags(const ColorEntry &entry)
78 {
79 return entry.flags();
80 }
81//! [color_gadget_row_options_flags]
82//! [color_gadget_row_options_mimeTypes]
83 static QStringList mimeTypes()
84 {
85 return {
86 u"text/html"_s
87 };
88 }
89//! [color_gadget_row_options_mimeTypes]
90//! [color_gadget_row_options_mimeData]
91 template <typename Items>
92 static QMimeData *mimeData(const Items &items)
93 {
94 if (items.isEmpty())
95 return nullptr;
96 QByteArray data;
97 QXmlStreamWriter stream(&data);
98 stream.writeStartElement("ul");
99 for (const auto &[item, index] : items)
100 stream.writeTextElement("li", item.colorName());
101 stream.writeEndElement();
102
103 QMimeData *mimeData = new QMimeData;
104 mimeData->setData(mimeTypes().first(), data);
105 return mimeData;
106 }
107//! [color_gadget_row_options_mimeData]
108//! [color_gadget_row_options_dropMimeData]
109 static bool dropMimeData(const QMimeData *mimeData, auto inserter)
110 {
111 const QByteArray data = mimeData->data(mimeTypes().first());
112 if (data.isEmpty())
113 return false;
114 QXmlStreamReader stream(data);
115 while (!stream.atEnd()) {
116 stream.readNext();
117 if (stream.isStartElement() && stream.name() == u"li"_s)
118 inserter = ColorEntry(stream.readElementText());
119 }
120
121 return true;
122 }
123//! [color_gadget_row_options_dropMimeData]
124//! [color_gadget_row_options_end_decl]
125};
126//! [color_gadget_row_options_end_decl]
127//! [color_gadget_row_options]
128
129//! [color_gadget_item_access_decl]
130template <>
131struct QRangeModel::ItemAccess<ColorEntry>
132{
133//! [color_gadget_item_access_decl]
134//! [color_gadget_item_access_flags]
135 static Qt::ItemFlags flags(const ColorEntry &entry)
136 {
137 return entry.flags();
138 }
139//! [color_gadget_item_access_flags]
140//! [color_gadget_item_access_readRole]
141 static QVariant readRole(const ColorEntry &entry, int role)
142 {
143 switch (role) {
144 // ...
145 }
146 return {};
147 }
148//! [color_gadget_item_access_readRole]
149//! [color_gadget_item_access_writeRole]
150 static bool writeRole(ColorEntry &entry, const QVariant &value, int role)
151 {
152 bool ok = false;
153 switch (role) {
154 // ...
155 }
156 return ok;
157 }
158//! [color_gadget_item_access_writeRole]
159//! [color_gadget_item_access_mimeTypes]
160 static QStringList mimeTypes()
161 {
162 return {
163 u"text/plain"_s,
164 u"application/x-qabstractitemmodeldatalist"_s
165 };
166 }
167//! [color_gadget_item_access_mimeTypes]
168//! [color_gadget_item_access_mimeData]
169 static QMimeData *mimeData(const auto &range)
170 {
171 QByteArray data;
172 QTextStream stream(&data, QIODevice::WriteOnly);
173 for (const auto &[item, index] : range)
174 stream << item.colorName() << Qt::endl;
175
176 QMimeData *result = new QMimeData;
177 result->setData(mimeTypes().first(), data);
178 // Qt handles encoding into the default mime type
179 return result;
180 }
181//! [color_gadget_item_access_mimeData]
182//! [color_gadget_item_access_dropMimeData]
183 static bool dropMimeData(const QMimeData *mimeData, auto inserter)
184 {
185 QByteArray data = mimeData->data(mimeTypes().first());
186 if (data.isEmpty())
187 return false;
188 QTextStream stream(&data, QIODevice::ReadOnly);
189 while (!stream.atEnd()) {
190 QString colorName;
191 stream >> colorName;
192 inserter = ColorEntry(colorName);
193 }
194 return true;
195 }
196//! [color_gadget_item_access_dropMimeData]
197//! [color_gadget_item_access_end_decl]
198};
199//! [color_gadget_item_access_end_decl]
200
201namespace multirole_gadget {
203 //! [color_gadget_table]
204 QList<QList<ColorEntry>> colorTable;
205
206 // ...
207
208 QRangeModel colorModel(colorTable);
209 QTableView table;
210 table.setModel(&colorModel);
211 //! [color_gadget_table]
212}
213
215 //! [color_gadget_multi_role]
216 const QStringList colorNames = QColor::colorNames();
217 QList<ColorEntry> colors;
218 colors.reserve(colorNames.size());
219 for (const QString &name : colorNames)
220 colors << name;
221
222 QRangeModel colorModel(colors);
223 QListView list;
224 list.setModel(&colorModel);
225 //! [color_gadget_multi_role]
226}
227
229{
230 //! [color_gadget_item_access_use]
231
232 std::vector<std::shared_ptr<ColorEntry>> colors;
233 // ...
234 QRangeModel model(colors);
235 //! [color_gadget_item_access_use]
236};
237
239 //! [color_gadget_single_column]
240 const QStringList colorNames = QColor::colorNames();
241 QList<std::tuple<ColorEntry>> colors;
242
243 // ...
244
245 QRangeModel colorModel(colors);
246 QListView list;
247 list.setModel(&colorModel);
248 //! [color_gadget_single_column]
249
250 {
251 //! [color_gadget_single_column_access_get]
252 ColorEntry firstEntry = std::get<0>(colors.at(0));
253 //! [color_gadget_single_column_access_get]
254 }
255 {
256 //! [color_gadget_single_column_access_sb]
257 auto [firstEntry] = colors.at(0);
258 //! [color_gadget_single_column_access_sb]
259 }
260}
261} // namespace multirole_gadget
262
263#endif //QT_NO_WIDGETS
[color_gadget_decl]
[color_gadget_item_access_end_decl]
void color_list_single_column()
void color_list_pointers()
void color_list_multi_role()
multirole_gadget::ColorEntry ColorEntry