|
1 /**************************************************************************** |
|
2 ** |
|
3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). |
|
4 ** All rights reserved. |
|
5 ** Contact: Nokia Corporation (qt-info@nokia.com) |
|
6 ** |
|
7 ** This file is part of the QtGui module of the Qt Toolkit. |
|
8 ** |
|
9 ** $QT_BEGIN_LICENSE:LGPL$ |
|
10 ** No Commercial Usage |
|
11 ** This file contains pre-release code and may not be distributed. |
|
12 ** You may use this file in accordance with the terms and conditions |
|
13 ** contained in the Technology Preview License Agreement accompanying |
|
14 ** this package. |
|
15 ** |
|
16 ** GNU Lesser General Public License Usage |
|
17 ** Alternatively, this file may be used under the terms of the GNU Lesser |
|
18 ** General Public License version 2.1 as published by the Free Software |
|
19 ** Foundation and appearing in the file LICENSE.LGPL included in the |
|
20 ** packaging of this file. Please review the following information to |
|
21 ** ensure the GNU Lesser General Public License version 2.1 requirements |
|
22 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. |
|
23 ** |
|
24 ** In addition, as a special exception, Nokia gives you certain additional |
|
25 ** rights. These rights are described in the Nokia Qt LGPL Exception |
|
26 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. |
|
27 ** |
|
28 ** If you have questions regarding the use of this file, please contact |
|
29 ** Nokia at qt-info@nokia.com. |
|
30 ** |
|
31 ** |
|
32 ** |
|
33 ** |
|
34 ** |
|
35 ** |
|
36 ** |
|
37 ** |
|
38 ** $QT_END_LICENSE$ |
|
39 ** |
|
40 ****************************************************************************/ |
|
41 |
|
42 #include "qstandarditemmodel.h" |
|
43 |
|
44 #ifndef QT_NO_STANDARDITEMMODEL |
|
45 |
|
46 #include <QtCore/qdatetime.h> |
|
47 #include <QtCore/qlist.h> |
|
48 #include <QtCore/qmap.h> |
|
49 #include <QtCore/qpair.h> |
|
50 #include <QtCore/qvariant.h> |
|
51 #include <QtCore/qvector.h> |
|
52 #include <QtCore/qstringlist.h> |
|
53 #include <QtCore/qbitarray.h> |
|
54 #include <QtCore/qmimedata.h> |
|
55 |
|
56 #include <private/qstandarditemmodel_p.h> |
|
57 #include <qdebug.h> |
|
58 |
|
59 QT_BEGIN_NAMESPACE |
|
60 |
|
61 class QStandardItemModelLessThan |
|
62 { |
|
63 public: |
|
64 inline QStandardItemModelLessThan() |
|
65 { } |
|
66 |
|
67 inline bool operator()(const QPair<QStandardItem*, int> &l, |
|
68 const QPair<QStandardItem*, int> &r) const |
|
69 { |
|
70 return *(l.first) < *(r.first); |
|
71 } |
|
72 }; |
|
73 |
|
74 class QStandardItemModelGreaterThan |
|
75 { |
|
76 public: |
|
77 inline QStandardItemModelGreaterThan() |
|
78 { } |
|
79 |
|
80 inline bool operator()(const QPair<QStandardItem*, int> &l, |
|
81 const QPair<QStandardItem*, int> &r) const |
|
82 { |
|
83 return *(r.first) < *(l.first); |
|
84 } |
|
85 }; |
|
86 |
|
87 /*! |
|
88 \internal |
|
89 */ |
|
90 QStandardItemPrivate::~QStandardItemPrivate() |
|
91 { |
|
92 QVector<QStandardItem*>::const_iterator it; |
|
93 for (it = children.constBegin(); it != children.constEnd(); ++it) { |
|
94 QStandardItem *child = *it; |
|
95 if (child) |
|
96 child->d_func()->setModel(0); |
|
97 delete child; |
|
98 } |
|
99 children.clear(); |
|
100 if (parent && model) |
|
101 parent->d_func()->childDeleted(q_func()); |
|
102 } |
|
103 |
|
104 /*! |
|
105 \internal |
|
106 */ |
|
107 QPair<int, int> QStandardItemPrivate::position() const |
|
108 { |
|
109 if (QStandardItem *par = parent) { |
|
110 int idx = par->d_func()->childIndex(q_func()); |
|
111 if (idx == -1) |
|
112 return QPair<int, int>(-1, -1); |
|
113 return QPair<int, int>(idx / par->columnCount(), idx % par->columnCount()); |
|
114 } |
|
115 // ### support header items? |
|
116 return QPair<int, int>(-1, -1); |
|
117 } |
|
118 |
|
119 /*! |
|
120 \internal |
|
121 */ |
|
122 void QStandardItemPrivate::setChild(int row, int column, QStandardItem *item, |
|
123 bool emitChanged) |
|
124 { |
|
125 Q_Q(QStandardItem); |
|
126 if (item == q) { |
|
127 qWarning("QStandardItem::setChild: Can't make an item a child of itself %p", |
|
128 item); |
|
129 return; |
|
130 } |
|
131 if ((row < 0) || (column < 0)) |
|
132 return; |
|
133 if (rows <= row) |
|
134 q->setRowCount(row + 1); |
|
135 if (columns <= column) |
|
136 q->setColumnCount(column + 1); |
|
137 int index = childIndex(row, column); |
|
138 Q_ASSERT(index != -1); |
|
139 QStandardItem *oldItem = children.at(index); |
|
140 if (item == oldItem) |
|
141 return; |
|
142 if (item) { |
|
143 if (item->d_func()->parent == 0) { |
|
144 item->d_func()->setParentAndModel(q, model); |
|
145 } else { |
|
146 qWarning("QStandardItem::setChild: Ignoring duplicate insertion of item %p", |
|
147 item); |
|
148 return; |
|
149 } |
|
150 } |
|
151 if (oldItem) |
|
152 oldItem->d_func()->setModel(0); |
|
153 delete oldItem; |
|
154 children.replace(index, item); |
|
155 if (emitChanged && model) |
|
156 model->d_func()->itemChanged(item); |
|
157 } |
|
158 |
|
159 |
|
160 /*! |
|
161 \internal |
|
162 */ |
|
163 void QStandardItemPrivate::changeFlags(bool enable, Qt::ItemFlags f) |
|
164 { |
|
165 Q_Q(QStandardItem); |
|
166 Qt::ItemFlags flags = q->flags(); |
|
167 if (enable) |
|
168 flags |= f; |
|
169 else |
|
170 flags &= ~f; |
|
171 q->setFlags(flags); |
|
172 } |
|
173 |
|
174 /*! |
|
175 \internal |
|
176 */ |
|
177 void QStandardItemPrivate::childDeleted(QStandardItem *child) |
|
178 { |
|
179 int index = childIndex(child); |
|
180 Q_ASSERT(index != -1); |
|
181 children.replace(index, 0); |
|
182 } |
|
183 |
|
184 /*! |
|
185 \internal |
|
186 */ |
|
187 void QStandardItemPrivate::setItemData(const QMap<int, QVariant> &roles) |
|
188 { |
|
189 Q_Q(QStandardItem); |
|
190 |
|
191 //let's build the vector of new values |
|
192 QVector<QWidgetItemData> newValues; |
|
193 QMap<int, QVariant>::const_iterator it; |
|
194 for (it = roles.begin(); it != roles.end(); ++it) { |
|
195 QVariant value = it.value(); |
|
196 if (value.isValid()) { |
|
197 int role = it.key(); |
|
198 role = (role == Qt::EditRole) ? Qt::DisplayRole : role; |
|
199 QWidgetItemData wid(role,it.value()); |
|
200 newValues.append(wid); |
|
201 } |
|
202 } |
|
203 |
|
204 if (values!=newValues) { |
|
205 values=newValues; |
|
206 if (model) |
|
207 model->d_func()->itemChanged(q); |
|
208 } |
|
209 } |
|
210 |
|
211 /*! |
|
212 \internal |
|
213 */ |
|
214 const QMap<int, QVariant> QStandardItemPrivate::itemData() const |
|
215 { |
|
216 QMap<int, QVariant> result; |
|
217 QVector<QWidgetItemData>::const_iterator it; |
|
218 for (it = values.begin(); it != values.end(); ++it) |
|
219 result.insert((*it).role, (*it).value); |
|
220 return result; |
|
221 } |
|
222 |
|
223 /*! |
|
224 \internal |
|
225 */ |
|
226 void QStandardItemPrivate::sortChildren(int column, Qt::SortOrder order) |
|
227 { |
|
228 Q_Q(QStandardItem); |
|
229 if (column >= columnCount()) |
|
230 return; |
|
231 |
|
232 QVector<QPair<QStandardItem*, int> > sortable; |
|
233 QVector<int> unsortable; |
|
234 |
|
235 sortable.reserve(rowCount()); |
|
236 unsortable.reserve(rowCount()); |
|
237 |
|
238 for (int row = 0; row < rowCount(); ++row) { |
|
239 QStandardItem *itm = q->child(row, column); |
|
240 if (itm) |
|
241 sortable.append(QPair<QStandardItem*,int>(itm, row)); |
|
242 else |
|
243 unsortable.append(row); |
|
244 } |
|
245 |
|
246 if (order == Qt::AscendingOrder) { |
|
247 QStandardItemModelLessThan lt; |
|
248 qStableSort(sortable.begin(), sortable.end(), lt); |
|
249 } else { |
|
250 QStandardItemModelGreaterThan gt; |
|
251 qStableSort(sortable.begin(), sortable.end(), gt); |
|
252 } |
|
253 |
|
254 QModelIndexList changedPersistentIndexesFrom, changedPersistentIndexesTo; |
|
255 QVector<QStandardItem*> sorted_children(children.count()); |
|
256 for (int i = 0; i < rowCount(); ++i) { |
|
257 int r = (i < sortable.count() |
|
258 ? sortable.at(i).second |
|
259 : unsortable.at(i - sortable.count())); |
|
260 for (int c = 0; c < columnCount(); ++c) { |
|
261 QStandardItem *itm = q->child(r, c); |
|
262 sorted_children[childIndex(i, c)] = itm; |
|
263 if (model) { |
|
264 QModelIndex from = model->createIndex(r, c, q); |
|
265 if (model->d_func()->persistent.indexes.contains(from)) { |
|
266 QModelIndex to = model->createIndex(i, c, q); |
|
267 changedPersistentIndexesFrom.append(from); |
|
268 changedPersistentIndexesTo.append(to); |
|
269 } |
|
270 } |
|
271 } |
|
272 } |
|
273 |
|
274 children = sorted_children; |
|
275 |
|
276 if (model) { |
|
277 model->changePersistentIndexList(changedPersistentIndexesFrom, changedPersistentIndexesTo); |
|
278 } |
|
279 |
|
280 QVector<QStandardItem*>::iterator it; |
|
281 for (it = children.begin(); it != children.end(); ++it) { |
|
282 if (*it) |
|
283 (*it)->d_func()->sortChildren(column, order); |
|
284 } |
|
285 } |
|
286 |
|
287 /*! |
|
288 \internal |
|
289 set the model of this item and all its children |
|
290 */ |
|
291 void QStandardItemPrivate::setModel(QStandardItemModel *mod) |
|
292 { |
|
293 if (children.isEmpty()) { |
|
294 if (model) |
|
295 model->d_func()->invalidatePersistentIndex(model->indexFromItem(q_ptr)); |
|
296 model = mod; |
|
297 } else { |
|
298 QStack<QStandardItem*> stack; |
|
299 stack.push(q_ptr); |
|
300 while (!stack.isEmpty()) { |
|
301 QStandardItem *itm = stack.pop(); |
|
302 if (itm->d_func()->model) { |
|
303 itm->d_func()->model->d_func()->invalidatePersistentIndex(itm->d_func()->model->indexFromItem(itm)); |
|
304 } |
|
305 itm->d_func()->model = mod; |
|
306 const QVector<QStandardItem*> &childList = itm->d_func()->children; |
|
307 for (int i = 0; i < childList.count(); ++i) { |
|
308 QStandardItem *chi = childList.at(i); |
|
309 if (chi) |
|
310 stack.push(chi); |
|
311 } |
|
312 } |
|
313 } |
|
314 } |
|
315 |
|
316 /*! |
|
317 \internal |
|
318 */ |
|
319 QStandardItemModelPrivate::QStandardItemModelPrivate() |
|
320 : root(new QStandardItem), |
|
321 itemPrototype(0), |
|
322 sortRole(Qt::DisplayRole) |
|
323 { |
|
324 root->setFlags(Qt::ItemIsDropEnabled); |
|
325 } |
|
326 |
|
327 /*! |
|
328 \internal |
|
329 */ |
|
330 QStandardItemModelPrivate::~QStandardItemModelPrivate() |
|
331 { |
|
332 delete itemPrototype; |
|
333 qDeleteAll(columnHeaderItems); |
|
334 qDeleteAll(rowHeaderItems); |
|
335 } |
|
336 |
|
337 /*! |
|
338 \internal |
|
339 */ |
|
340 void QStandardItemModelPrivate::init() |
|
341 { |
|
342 Q_Q(QStandardItemModel); |
|
343 QObject::connect(q, SIGNAL(dataChanged(QModelIndex,QModelIndex)), |
|
344 q, SLOT(_q_emitItemChanged(QModelIndex,QModelIndex))); |
|
345 } |
|
346 |
|
347 /*! |
|
348 \internal |
|
349 */ |
|
350 void QStandardItemModelPrivate::_q_emitItemChanged(const QModelIndex &topLeft, |
|
351 const QModelIndex &bottomRight) |
|
352 { |
|
353 Q_Q(QStandardItemModel); |
|
354 QModelIndex parent = topLeft.parent(); |
|
355 for (int row = topLeft.row(); row <= bottomRight.row(); ++row) { |
|
356 for (int column = topLeft.column(); column <= bottomRight.column(); ++column) { |
|
357 QModelIndex index = q->index(row, column, parent); |
|
358 if (QStandardItem *item = itemFromIndex(index)) |
|
359 emit q->itemChanged(item); |
|
360 } |
|
361 } |
|
362 } |
|
363 |
|
364 /*! |
|
365 \internal |
|
366 */ |
|
367 bool QStandardItemPrivate::insertRows(int row, const QList<QStandardItem*> &items) |
|
368 { |
|
369 Q_Q(QStandardItem); |
|
370 if ((row < 0) || (row > rowCount())) |
|
371 return false; |
|
372 int count = items.count(); |
|
373 if (model) |
|
374 model->d_func()->rowsAboutToBeInserted(q, row, row + count - 1); |
|
375 if (rowCount() == 0) { |
|
376 if (columnCount() == 0) |
|
377 q->setColumnCount(1); |
|
378 children.resize(columnCount() * count); |
|
379 rows = count; |
|
380 } else { |
|
381 rows += count; |
|
382 int index = childIndex(row, 0); |
|
383 if (index != -1) |
|
384 children.insert(index, columnCount() * count, 0); |
|
385 } |
|
386 for (int i = 0; i < items.count(); ++i) { |
|
387 QStandardItem *item = items.at(i); |
|
388 item->d_func()->model = model; |
|
389 item->d_func()->parent = q; |
|
390 int index = childIndex(i + row, 0); |
|
391 children.replace(index, item); |
|
392 } |
|
393 if (model) |
|
394 model->d_func()->rowsInserted(q, row, count); |
|
395 return true; |
|
396 } |
|
397 |
|
398 bool QStandardItemPrivate::insertRows(int row, int count, const QList<QStandardItem*> &items) |
|
399 { |
|
400 Q_Q(QStandardItem); |
|
401 if ((count < 1) || (row < 0) || (row > rowCount())) |
|
402 return false; |
|
403 if (model) |
|
404 model->d_func()->rowsAboutToBeInserted(q, row, row + count - 1); |
|
405 if (rowCount() == 0) { |
|
406 children.resize(columnCount() * count); |
|
407 rows = count; |
|
408 } else { |
|
409 rows += count; |
|
410 int index = childIndex(row, 0); |
|
411 if (index != -1) |
|
412 children.insert(index, columnCount() * count, 0); |
|
413 } |
|
414 if (!items.isEmpty()) { |
|
415 int index = childIndex(row, 0); |
|
416 int limit = qMin(items.count(), columnCount() * count); |
|
417 for (int i = 0; i < limit; ++i) { |
|
418 QStandardItem *item = items.at(i); |
|
419 if (item) { |
|
420 if (item->d_func()->parent == 0) { |
|
421 item->d_func()->setParentAndModel(q, model); |
|
422 } else { |
|
423 qWarning("QStandardItem::insertRows: Ignoring duplicate insertion of item %p", |
|
424 item); |
|
425 item = 0; |
|
426 } |
|
427 } |
|
428 children.replace(index, item); |
|
429 ++index; |
|
430 } |
|
431 } |
|
432 if (model) |
|
433 model->d_func()->rowsInserted(q, row, count); |
|
434 return true; |
|
435 } |
|
436 |
|
437 /*! |
|
438 \internal |
|
439 */ |
|
440 bool QStandardItemPrivate::insertColumns(int column, int count, const QList<QStandardItem*> &items) |
|
441 { |
|
442 Q_Q(QStandardItem); |
|
443 if ((count < 1) || (column < 0) || (column > columnCount())) |
|
444 return false; |
|
445 if (model) |
|
446 model->d_func()->columnsAboutToBeInserted(q, column, column + count - 1); |
|
447 if (columnCount() == 0) { |
|
448 children.resize(rowCount() * count); |
|
449 columns = count; |
|
450 } else { |
|
451 columns += count; |
|
452 int index = childIndex(0, column); |
|
453 for (int row = 0; row < rowCount(); ++row) { |
|
454 children.insert(index, count, 0); |
|
455 index += columnCount(); |
|
456 } |
|
457 } |
|
458 if (!items.isEmpty()) { |
|
459 int limit = qMin(items.count(), rowCount() * count); |
|
460 for (int i = 0; i < limit; ++i) { |
|
461 QStandardItem *item = items.at(i); |
|
462 if (item) { |
|
463 if (item->d_func()->parent == 0) { |
|
464 item->d_func()->setParentAndModel(q, model); |
|
465 } else { |
|
466 qWarning("QStandardItem::insertColumns: Ignoring duplicate insertion of item %p", |
|
467 item); |
|
468 item = 0; |
|
469 } |
|
470 } |
|
471 int r = i / count; |
|
472 int c = column + (i % count); |
|
473 int index = childIndex(r, c); |
|
474 children.replace(index, item); |
|
475 } |
|
476 } |
|
477 if (model) |
|
478 model->d_func()->columnsInserted(q, column, count); |
|
479 return true; |
|
480 } |
|
481 |
|
482 /*! |
|
483 \internal |
|
484 */ |
|
485 void QStandardItemModelPrivate::itemChanged(QStandardItem *item) |
|
486 { |
|
487 Q_Q(QStandardItemModel); |
|
488 if (item->d_func()->parent == 0) { |
|
489 // Header item |
|
490 int idx = columnHeaderItems.indexOf(item); |
|
491 if (idx != -1) { |
|
492 emit q->headerDataChanged(Qt::Horizontal, idx, idx); |
|
493 } else { |
|
494 idx = rowHeaderItems.indexOf(item); |
|
495 if (idx != -1) |
|
496 emit q->headerDataChanged(Qt::Vertical, idx, idx); |
|
497 } |
|
498 } else { |
|
499 // Normal item |
|
500 QModelIndex index = q->indexFromItem(item); |
|
501 emit q->dataChanged(index, index); |
|
502 } |
|
503 } |
|
504 |
|
505 /*! |
|
506 \internal |
|
507 */ |
|
508 void QStandardItemModelPrivate::rowsAboutToBeInserted(QStandardItem *parent, |
|
509 int start, int end) |
|
510 { |
|
511 Q_Q(QStandardItemModel); |
|
512 QModelIndex index = q->indexFromItem(parent); |
|
513 q->beginInsertRows(index, start, end); |
|
514 } |
|
515 |
|
516 /*! |
|
517 \internal |
|
518 */ |
|
519 void QStandardItemModelPrivate::columnsAboutToBeInserted(QStandardItem *parent, |
|
520 int start, int end) |
|
521 { |
|
522 Q_Q(QStandardItemModel); |
|
523 QModelIndex index = q->indexFromItem(parent); |
|
524 q->beginInsertColumns(index, start, end); |
|
525 } |
|
526 |
|
527 /*! |
|
528 \internal |
|
529 */ |
|
530 void QStandardItemModelPrivate::rowsAboutToBeRemoved(QStandardItem *parent, |
|
531 int start, int end) |
|
532 { |
|
533 Q_Q(QStandardItemModel); |
|
534 QModelIndex index = q->indexFromItem(parent); |
|
535 q->beginRemoveRows(index, start, end); |
|
536 } |
|
537 |
|
538 /*! |
|
539 \internal |
|
540 */ |
|
541 void QStandardItemModelPrivate::columnsAboutToBeRemoved(QStandardItem *parent, |
|
542 int start, int end) |
|
543 { |
|
544 Q_Q(QStandardItemModel); |
|
545 QModelIndex index = q->indexFromItem(parent); |
|
546 q->beginRemoveColumns(index, start, end); |
|
547 } |
|
548 |
|
549 /*! |
|
550 \internal |
|
551 */ |
|
552 void QStandardItemModelPrivate::rowsInserted(QStandardItem *parent, |
|
553 int row, int count) |
|
554 { |
|
555 Q_Q(QStandardItemModel); |
|
556 if (parent == root.data()) |
|
557 rowHeaderItems.insert(row, count, 0); |
|
558 q->endInsertRows(); |
|
559 } |
|
560 |
|
561 /*! |
|
562 \internal |
|
563 */ |
|
564 void QStandardItemModelPrivate::columnsInserted(QStandardItem *parent, |
|
565 int column, int count) |
|
566 { |
|
567 Q_Q(QStandardItemModel); |
|
568 if (parent == root.data()) |
|
569 columnHeaderItems.insert(column, count, 0); |
|
570 q->endInsertColumns(); |
|
571 } |
|
572 |
|
573 /*! |
|
574 \internal |
|
575 */ |
|
576 void QStandardItemModelPrivate::rowsRemoved(QStandardItem *parent, |
|
577 int row, int count) |
|
578 { |
|
579 Q_Q(QStandardItemModel); |
|
580 if (parent == root.data()) { |
|
581 for (int i = row; i < row + count; ++i) { |
|
582 QStandardItem *oldItem = rowHeaderItems.at(i); |
|
583 if (oldItem) |
|
584 oldItem->d_func()->setModel(0); |
|
585 delete oldItem; |
|
586 } |
|
587 rowHeaderItems.remove(row, count); |
|
588 } |
|
589 q->endRemoveRows(); |
|
590 } |
|
591 |
|
592 /*! |
|
593 \internal |
|
594 */ |
|
595 void QStandardItemModelPrivate::columnsRemoved(QStandardItem *parent, |
|
596 int column, int count) |
|
597 { |
|
598 Q_Q(QStandardItemModel); |
|
599 if (parent == root.data()) { |
|
600 for (int i = column; i < column + count; ++i) { |
|
601 QStandardItem *oldItem = columnHeaderItems.at(i); |
|
602 if (oldItem) |
|
603 oldItem->d_func()->setModel(0); |
|
604 delete oldItem; |
|
605 } |
|
606 columnHeaderItems.remove(column, count); |
|
607 } |
|
608 q->endRemoveColumns(); |
|
609 } |
|
610 |
|
611 /*! |
|
612 \class QStandardItem |
|
613 \brief The QStandardItem class provides an item for use with the |
|
614 QStandardItemModel class. |
|
615 \since 4.2 |
|
616 \ingroup model-view |
|
617 |
|
618 Items usually contain text, icons, or checkboxes. |
|
619 |
|
620 Each item can have its own background brush which is set with the |
|
621 setBackground() function. The current background brush can be found with |
|
622 background(). The text label for each item can be rendered with its own |
|
623 font and brush. These are specified with the setFont() and setForeground() |
|
624 functions, and read with font() and foreground(). |
|
625 |
|
626 By default, items are enabled, editable, selectable, checkable, and can be |
|
627 used both as the source of a drag and drop operation and as a drop target. |
|
628 Each item's flags can be changed by calling setFlags(). Checkable items |
|
629 can be checked and unchecked with the setCheckState() function. The |
|
630 corresponding checkState() function indicates whether the item is |
|
631 currently checked. |
|
632 |
|
633 You can store application-specific data in an item by calling setData(). |
|
634 |
|
635 Each item can have a two-dimensional table of child items. This makes it |
|
636 possible to build hierarchies of items. The typical hierarchy is the tree, |
|
637 in which case the child table is a table with a single column (a list). |
|
638 |
|
639 The dimensions of the child table can be set with setRowCount() and |
|
640 setColumnCount(). Items can be positioned in the child table with |
|
641 setChild(). Get a pointer to a child item with child(). New rows and |
|
642 columns of children can also be inserted with insertRow() and |
|
643 insertColumn(), or appended with appendRow() and appendColumn(). When |
|
644 using the append and insert functions, the dimensions of the child table |
|
645 will grow as needed. |
|
646 |
|
647 An existing row of children can be removed with removeRow() or takeRow(); |
|
648 correspondingly, a column can be removed with removeColumn() or |
|
649 takeColumn(). |
|
650 |
|
651 An item's children can be sorted by calling sortChildren(). |
|
652 |
|
653 \section1 Subclassing |
|
654 |
|
655 When subclassing QStandardItem to provide custom items, it is possible to |
|
656 define new types for them so that they can be distinguished from the base |
|
657 class. The type() function should be reimplemented to return a new type |
|
658 value equal to or greater than \l UserType. |
|
659 |
|
660 Reimplement data() and setData() if you want to perform custom handling of |
|
661 data queries and/or control how an item's data is represented. |
|
662 |
|
663 Reimplement clone() if you want QStandardItemModel to be able to create |
|
664 instances of your custom item class on demand (see |
|
665 QStandardItemModel::setItemPrototype()). |
|
666 |
|
667 Reimplement read() and write() if you want to control how items are |
|
668 represented in their serialized form. |
|
669 |
|
670 Reimplement \l{operator<()} if you want to control the semantics of item |
|
671 comparison. \l{operator<()} determines the sorted order when sorting items |
|
672 with sortChildren() or with QStandardItemModel::sort(). |
|
673 |
|
674 \sa QStandardItemModel, {Item View Convenience Classes}, {Model/View Programming} |
|
675 */ |
|
676 |
|
677 /*! |
|
678 \enum QStandardItem::ItemType |
|
679 |
|
680 This enum describes the types that are used to describe standard items. |
|
681 |
|
682 \value Type The default type for standard items. |
|
683 \value UserType The minimum value for custom types. Values below UserType are |
|
684 reserved by Qt. |
|
685 |
|
686 You can define new user types in QStandardItem subclasses to ensure that |
|
687 custom items are treated specially; for example, when items are sorted. |
|
688 |
|
689 \sa type() |
|
690 */ |
|
691 |
|
692 /*! |
|
693 Constructs an item. |
|
694 */ |
|
695 QStandardItem::QStandardItem() |
|
696 : d_ptr(new QStandardItemPrivate) |
|
697 { |
|
698 Q_D(QStandardItem); |
|
699 d->q_ptr = this; |
|
700 } |
|
701 |
|
702 /*! |
|
703 Constructs an item with the given \a text. |
|
704 */ |
|
705 QStandardItem::QStandardItem(const QString &text) |
|
706 : d_ptr(new QStandardItemPrivate) |
|
707 { |
|
708 Q_D(QStandardItem); |
|
709 d->q_ptr = this; |
|
710 setText(text); |
|
711 } |
|
712 |
|
713 /*! |
|
714 Constructs an item with the given \a icon and \a text. |
|
715 */ |
|
716 QStandardItem::QStandardItem(const QIcon &icon, const QString &text) |
|
717 : d_ptr(new QStandardItemPrivate) |
|
718 { |
|
719 Q_D(QStandardItem); |
|
720 d->q_ptr = this; |
|
721 setIcon(icon); |
|
722 setText(text); |
|
723 } |
|
724 |
|
725 /*! |
|
726 Constructs an item with \a rows rows and \a columns columns of child items. |
|
727 */ |
|
728 QStandardItem::QStandardItem(int rows, int columns) |
|
729 : d_ptr(new QStandardItemPrivate) |
|
730 { |
|
731 Q_D(QStandardItem); |
|
732 d->q_ptr = this; |
|
733 setRowCount(rows); |
|
734 setColumnCount(columns); |
|
735 } |
|
736 |
|
737 /*! |
|
738 \internal |
|
739 */ |
|
740 QStandardItem::QStandardItem(QStandardItemPrivate &dd) |
|
741 : d_ptr(&dd) |
|
742 { |
|
743 Q_D(QStandardItem); |
|
744 d->q_ptr = this; |
|
745 } |
|
746 |
|
747 /*! |
|
748 Constructs a copy of \a other. Note that model() is |
|
749 not copied. |
|
750 |
|
751 This function is useful when reimplementing clone(). |
|
752 */ |
|
753 QStandardItem::QStandardItem(const QStandardItem &other) |
|
754 : d_ptr(new QStandardItemPrivate) |
|
755 { |
|
756 Q_D(QStandardItem); |
|
757 d->q_ptr = this; |
|
758 operator=(other); |
|
759 } |
|
760 |
|
761 /*! |
|
762 Assigns \a other's data and flags to this item. Note that |
|
763 type() and model() are not copied. |
|
764 |
|
765 This function is useful when reimplementing clone(). |
|
766 */ |
|
767 QStandardItem &QStandardItem::operator=(const QStandardItem &other) |
|
768 { |
|
769 Q_D(QStandardItem); |
|
770 d->values = other.d_func()->values; |
|
771 return *this; |
|
772 } |
|
773 |
|
774 /*! |
|
775 Destructs the item. |
|
776 This causes the item's children to be destructed as well. |
|
777 */ |
|
778 QStandardItem::~QStandardItem() |
|
779 { |
|
780 } |
|
781 |
|
782 /*! |
|
783 Returns the item's parent item, or 0 if the item has no parent. |
|
784 |
|
785 \sa child() |
|
786 */ |
|
787 QStandardItem *QStandardItem::parent() const |
|
788 { |
|
789 Q_D(const QStandardItem); |
|
790 if (!d->model || (d->model->d_func()->root.data() != d->parent)) |
|
791 return d->parent; |
|
792 return 0; |
|
793 } |
|
794 |
|
795 /*! |
|
796 Sets the item's data for the given \a role to the specified \a value. |
|
797 |
|
798 If you subclass QStandardItem and reimplement this function, your |
|
799 reimplementation should call emitDataChanged() if you do not call |
|
800 the base implementation of setData(). This will ensure that e.g. |
|
801 views using the model are notified of the changes. |
|
802 |
|
803 \note The default implementation treats Qt::EditRole and Qt::DisplayRole |
|
804 as referring to the same data. |
|
805 |
|
806 \sa Qt::ItemDataRole, data(), setFlags() |
|
807 */ |
|
808 void QStandardItem::setData(const QVariant &value, int role) |
|
809 { |
|
810 Q_D(QStandardItem); |
|
811 role = (role == Qt::EditRole) ? Qt::DisplayRole : role; |
|
812 QVector<QWidgetItemData>::iterator it; |
|
813 for (it = d->values.begin(); it != d->values.end(); ++it) { |
|
814 if ((*it).role == role) { |
|
815 if (value.isValid()) { |
|
816 if ((*it).value.type() == value.type() && (*it).value == value) |
|
817 return; |
|
818 (*it).value = value; |
|
819 } else { |
|
820 d->values.erase(it); |
|
821 } |
|
822 if (d->model) |
|
823 d->model->d_func()->itemChanged(this); |
|
824 return; |
|
825 } |
|
826 } |
|
827 d->values.append(QWidgetItemData(role, value)); |
|
828 if (d->model) |
|
829 d->model->d_func()->itemChanged(this); |
|
830 } |
|
831 |
|
832 /*! |
|
833 Returns the item's data for the given \a role, or an invalid |
|
834 QVariant if there is no data for the role. |
|
835 |
|
836 \note The default implementation treats Qt::EditRole and Qt::DisplayRole |
|
837 as referring to the same data. |
|
838 */ |
|
839 QVariant QStandardItem::data(int role) const |
|
840 { |
|
841 Q_D(const QStandardItem); |
|
842 role = (role == Qt::EditRole) ? Qt::DisplayRole : role; |
|
843 QVector<QWidgetItemData>::const_iterator it; |
|
844 for (it = d->values.begin(); it != d->values.end(); ++it) { |
|
845 if ((*it).role == role) |
|
846 return (*it).value; |
|
847 } |
|
848 return QVariant(); |
|
849 } |
|
850 |
|
851 /*! |
|
852 \since 4.4 |
|
853 |
|
854 Causes the model associated with this item to emit a |
|
855 \l{QAbstractItemModel::dataChanged()}{dataChanged}() signal for this |
|
856 item. |
|
857 |
|
858 You normally only need to call this function if you have subclassed |
|
859 QStandardItem and reimplemented data() and/or setData(). |
|
860 |
|
861 \sa setData() |
|
862 */ |
|
863 void QStandardItem::emitDataChanged() |
|
864 { |
|
865 Q_D(QStandardItem); |
|
866 if (d->model) |
|
867 d->model->d_func()->itemChanged(this); |
|
868 } |
|
869 |
|
870 /*! |
|
871 Sets the item flags for the item to \a flags. |
|
872 |
|
873 The item flags determine how the user can interact with the item. |
|
874 This is often used to disable an item. |
|
875 |
|
876 \sa flags(), setData() |
|
877 */ |
|
878 void QStandardItem::setFlags(Qt::ItemFlags flags) |
|
879 { |
|
880 setData((int)flags, Qt::UserRole - 1); |
|
881 } |
|
882 |
|
883 /*! |
|
884 Returns the item flags for the item. |
|
885 |
|
886 The item flags determine how the user can interact with the item. |
|
887 |
|
888 By default, items are enabled, editable, selectable, checkable, and can be |
|
889 used both as the source of a drag and drop operation and as a drop target. |
|
890 |
|
891 \sa setFlags() |
|
892 */ |
|
893 Qt::ItemFlags QStandardItem::flags() const |
|
894 { |
|
895 QVariant v = data(Qt::UserRole - 1); |
|
896 if (!v.isValid()) |
|
897 return (Qt::ItemIsSelectable|Qt::ItemIsEnabled|Qt::ItemIsEditable |
|
898 |Qt::ItemIsDragEnabled|Qt::ItemIsDropEnabled); |
|
899 return Qt::ItemFlags(v.toInt()); |
|
900 } |
|
901 |
|
902 /*! |
|
903 \fn QString QStandardItem::text() const |
|
904 |
|
905 Returns the item's text. This is the text that's presented to the user |
|
906 in a view. |
|
907 |
|
908 \sa setText() |
|
909 */ |
|
910 |
|
911 /*! |
|
912 \fn void QStandardItem::setText(const QString &text) |
|
913 |
|
914 Sets the item's text to the \a text specified. |
|
915 |
|
916 \sa text(), setFont(), setForeground() |
|
917 */ |
|
918 |
|
919 /*! |
|
920 \fn QIcon QStandardItem::icon() const |
|
921 |
|
922 Returns the item's icon. |
|
923 |
|
924 \sa setIcon(), {QAbstractItemView::iconSize}{iconSize} |
|
925 */ |
|
926 |
|
927 /*! |
|
928 \fn void QStandardItem::setIcon(const QIcon &icon) |
|
929 |
|
930 Sets the item's icon to the \a icon specified. |
|
931 */ |
|
932 |
|
933 /*! |
|
934 \fn QString QStandardItem::statusTip() const |
|
935 |
|
936 Returns the item's status tip. |
|
937 |
|
938 \sa setStatusTip(), toolTip(), whatsThis() |
|
939 */ |
|
940 |
|
941 /*! |
|
942 \fn void QStandardItem::setStatusTip(const QString &statusTip) |
|
943 |
|
944 Sets the item's status tip to the string specified by \a statusTip. |
|
945 |
|
946 \sa statusTip(), setToolTip(), setWhatsThis() |
|
947 */ |
|
948 |
|
949 /*! |
|
950 \fn QString QStandardItem::toolTip() const |
|
951 |
|
952 Returns the item's tooltip. |
|
953 |
|
954 \sa setToolTip(), statusTip(), whatsThis() |
|
955 */ |
|
956 |
|
957 /*! |
|
958 \fn void QStandardItem::setToolTip(const QString &toolTip) |
|
959 |
|
960 Sets the item's tooltip to the string specified by \a toolTip. |
|
961 |
|
962 \sa toolTip(), setStatusTip(), setWhatsThis() |
|
963 */ |
|
964 |
|
965 /*! |
|
966 \fn QString QStandardItem::whatsThis() const |
|
967 |
|
968 Returns the item's "What's This?" help. |
|
969 |
|
970 \sa setWhatsThis(), toolTip(), statusTip() |
|
971 */ |
|
972 |
|
973 /*! |
|
974 \fn void QStandardItem::setWhatsThis(const QString &whatsThis) |
|
975 |
|
976 Sets the item's "What's This?" help to the string specified by \a whatsThis. |
|
977 |
|
978 \sa whatsThis(), setStatusTip(), setToolTip() |
|
979 */ |
|
980 |
|
981 /*! |
|
982 \fn QFont QStandardItem::font() const |
|
983 |
|
984 Returns the font used to render the item's text. |
|
985 |
|
986 \sa setFont() |
|
987 */ |
|
988 |
|
989 /*! |
|
990 \fn void QStandardItem::setFont(const QFont &font) |
|
991 |
|
992 Sets the font used to display the item's text to the given \a font. |
|
993 |
|
994 \sa font() setText() setForeground() |
|
995 */ |
|
996 |
|
997 /*! |
|
998 \fn QBrush QStandardItem::background() const |
|
999 |
|
1000 Returns the brush used to render the item's background. |
|
1001 |
|
1002 \sa foreground() setBackground() |
|
1003 */ |
|
1004 |
|
1005 /*! |
|
1006 \fn void QStandardItem::setBackground(const QBrush &brush) |
|
1007 |
|
1008 Sets the item's background brush to the specified \a brush. |
|
1009 |
|
1010 \sa background() setForeground() |
|
1011 */ |
|
1012 |
|
1013 /*! |
|
1014 \fn QBrush QStandardItem::foreground() const |
|
1015 |
|
1016 Returns the brush used to render the item's foreground (e.g. text). |
|
1017 |
|
1018 \sa setForeground() background() |
|
1019 */ |
|
1020 |
|
1021 /*! |
|
1022 \fn void QStandardItem::setForeground(const QBrush &brush) |
|
1023 |
|
1024 Sets the brush used to display the item's foreground (e.g. text) to the |
|
1025 given \a brush. |
|
1026 |
|
1027 \sa foreground() setBackground() setFont() |
|
1028 */ |
|
1029 |
|
1030 /*! |
|
1031 \fn int QStandardItem::textAlignment() const |
|
1032 |
|
1033 Returns the text alignment for the item's text. |
|
1034 */ |
|
1035 |
|
1036 /*! |
|
1037 \fn void QStandardItem::setTextAlignment(Qt::Alignment alignment) |
|
1038 |
|
1039 Sets the text alignment for the item's text to the \a alignment |
|
1040 specified. |
|
1041 |
|
1042 \sa textAlignment() |
|
1043 */ |
|
1044 |
|
1045 /*! |
|
1046 \fn QSize QStandardItem::sizeHint() const |
|
1047 |
|
1048 Returns the size hint set for the item, or an invalid QSize if no |
|
1049 size hint has been set. |
|
1050 |
|
1051 If no size hint has been set, the item delegate will compute the |
|
1052 size hint based on the item data. |
|
1053 |
|
1054 \sa setSizeHint() |
|
1055 */ |
|
1056 |
|
1057 /*! |
|
1058 \fn void QStandardItem::setSizeHint(const QSize &size) |
|
1059 |
|
1060 Sets the size hint for the item to be \a size. |
|
1061 If no size hint is set, the item delegate will compute the |
|
1062 size hint based on the item data. |
|
1063 |
|
1064 \sa sizeHint() |
|
1065 */ |
|
1066 |
|
1067 /*! |
|
1068 \fn Qt::CheckState QStandardItem::checkState() const |
|
1069 |
|
1070 Returns the checked state of the item. |
|
1071 |
|
1072 \sa setCheckState(), isCheckable() |
|
1073 */ |
|
1074 |
|
1075 /*! |
|
1076 \fn void QStandardItem::setCheckState(Qt::CheckState state) |
|
1077 |
|
1078 Sets the check state of the item to be \a state. |
|
1079 |
|
1080 \sa checkState(), setCheckable() |
|
1081 */ |
|
1082 |
|
1083 /*! |
|
1084 \fn QString QStandardItem::accessibleText() const |
|
1085 |
|
1086 Returns the item's accessible text. |
|
1087 |
|
1088 The accessible text is used by assistive technologies (i.e. for users who |
|
1089 cannot use conventional means of interaction). |
|
1090 |
|
1091 \sa setAccessibleText(), accessibleDescription() |
|
1092 */ |
|
1093 |
|
1094 /*! |
|
1095 \fn void QStandardItem::setAccessibleText(const QString &accessibleText) |
|
1096 |
|
1097 Sets the item's accessible text to the string specified by \a accessibleText. |
|
1098 |
|
1099 The accessible text is used by assistive technologies (i.e. for users who |
|
1100 cannot use conventional means of interaction). |
|
1101 |
|
1102 \sa accessibleText(), setAccessibleDescription() |
|
1103 */ |
|
1104 |
|
1105 /*! |
|
1106 \fn QString QStandardItem::accessibleDescription() const |
|
1107 |
|
1108 Returns the item's accessible description. |
|
1109 |
|
1110 The accessible description is used by assistive technologies (i.e. for |
|
1111 users who cannot use conventional means of interaction). |
|
1112 |
|
1113 \sa setAccessibleDescription(), accessibleText() |
|
1114 */ |
|
1115 |
|
1116 /*! |
|
1117 \fn void QStandardItem::setAccessibleDescription(const QString &accessibleDescription) |
|
1118 |
|
1119 Sets the item's accessible description to the string specified by \a |
|
1120 accessibleDescription. |
|
1121 |
|
1122 The accessible description is used by assistive technologies (i.e. for |
|
1123 users who cannot use conventional means of interaction). |
|
1124 |
|
1125 \sa accessibleDescription(), setAccessibleText() |
|
1126 */ |
|
1127 |
|
1128 /*! |
|
1129 Sets whether the item is enabled. If \a enabled is true, the item is enabled, |
|
1130 meaning that the user can interact with the item; if \a enabled is false, the |
|
1131 user cannot interact with the item. |
|
1132 |
|
1133 This flag takes presedence over the other item flags; e.g. if an item is not |
|
1134 enabled, it cannot be selected by the user, even if the Qt::ItemIsSelectable |
|
1135 flag has been set. |
|
1136 |
|
1137 \sa isEnabled(), Qt::ItemIsEnabled, setFlags() |
|
1138 */ |
|
1139 void QStandardItem::setEnabled(bool enabled) |
|
1140 { |
|
1141 Q_D(QStandardItem); |
|
1142 d->changeFlags(enabled, Qt::ItemIsEnabled); |
|
1143 } |
|
1144 |
|
1145 /*! |
|
1146 \fn bool QStandardItem::isEnabled() const |
|
1147 |
|
1148 Returns whether the item is enabled. |
|
1149 |
|
1150 When an item is enabled, the user can interact with it. The possible |
|
1151 types of interaction are specified by the other item flags, such as |
|
1152 isEditable() and isSelectable(). |
|
1153 |
|
1154 The default value is true. |
|
1155 |
|
1156 \sa setEnabled(), flags() |
|
1157 */ |
|
1158 |
|
1159 /*! |
|
1160 Sets whether the item is editable. If \a editable is true, the item can be |
|
1161 edited by the user; otherwise, the user cannot edit the item. |
|
1162 |
|
1163 How the user can edit items in a view is determined by the view's edit |
|
1164 triggers; see QAbstractItemView::editTriggers. |
|
1165 |
|
1166 \sa isEditable(), setFlags() |
|
1167 */ |
|
1168 void QStandardItem::setEditable(bool editable) |
|
1169 { |
|
1170 Q_D(QStandardItem); |
|
1171 d->changeFlags(editable, Qt::ItemIsEditable); |
|
1172 } |
|
1173 |
|
1174 /*! |
|
1175 \fn bool QStandardItem::isEditable() const |
|
1176 |
|
1177 Returns whether the item can be edited by the user. |
|
1178 |
|
1179 When an item is editable (and enabled), the user can edit the item by |
|
1180 invoking one of the view's edit triggers; see |
|
1181 QAbstractItemView::editTriggers. |
|
1182 |
|
1183 The default value is true. |
|
1184 |
|
1185 \sa setEditable(), flags() |
|
1186 */ |
|
1187 |
|
1188 /*! |
|
1189 Sets whether the item is selectable. If \a selectable is true, the item |
|
1190 can be selected by the user; otherwise, the user cannot select the item. |
|
1191 |
|
1192 You can control the selection behavior and mode by manipulating their |
|
1193 view properties; see QAbstractItemView::selectionMode and |
|
1194 QAbstractItemView::selectionBehavior. |
|
1195 |
|
1196 \sa isSelectable(), setFlags() |
|
1197 */ |
|
1198 void QStandardItem::setSelectable(bool selectable) |
|
1199 { |
|
1200 Q_D(QStandardItem); |
|
1201 d->changeFlags(selectable, Qt::ItemIsSelectable); |
|
1202 } |
|
1203 |
|
1204 /*! |
|
1205 \fn bool QStandardItem::isSelectable() const |
|
1206 |
|
1207 Returns whether the item is selectable by the user. |
|
1208 |
|
1209 The default value is true. |
|
1210 |
|
1211 \sa setSelectable(), flags() |
|
1212 */ |
|
1213 |
|
1214 /*! |
|
1215 Sets whether the item is user-checkable. If \a checkable is true, the |
|
1216 item can be checked by the user; otherwise, the user cannot check |
|
1217 the item. |
|
1218 |
|
1219 The item delegate will render a checkable item with a check box next to the |
|
1220 item's text. |
|
1221 |
|
1222 \sa isCheckable(), setCheckState(), setTristate() |
|
1223 */ |
|
1224 void QStandardItem::setCheckable(bool checkable) |
|
1225 { |
|
1226 Q_D(QStandardItem); |
|
1227 if (checkable && !isCheckable()) { |
|
1228 // make sure there's data for the checkstate role |
|
1229 if (!data(Qt::CheckStateRole).isValid()) |
|
1230 setData(Qt::Unchecked, Qt::CheckStateRole); |
|
1231 } |
|
1232 d->changeFlags(checkable, Qt::ItemIsUserCheckable); |
|
1233 } |
|
1234 |
|
1235 /*! |
|
1236 \fn bool QStandardItem::isCheckable() const |
|
1237 |
|
1238 Returns whether the item is user-checkable. |
|
1239 |
|
1240 The default value is false. |
|
1241 |
|
1242 \sa setCheckable(), checkState(), isTristate() |
|
1243 */ |
|
1244 |
|
1245 /*! |
|
1246 Sets whether the item is tristate. If \a tristate is true, the |
|
1247 item is checkable with three separate states; otherwise, the item |
|
1248 is checkable with two states. (Note that this also requires that |
|
1249 the item is checkable; see isCheckable().) |
|
1250 |
|
1251 \sa isTristate(), setCheckable(), setCheckState() |
|
1252 */ |
|
1253 void QStandardItem::setTristate(bool tristate) |
|
1254 { |
|
1255 Q_D(QStandardItem); |
|
1256 d->changeFlags(tristate, Qt::ItemIsTristate); |
|
1257 } |
|
1258 |
|
1259 /*! |
|
1260 \fn bool QStandardItem::isTristate() const |
|
1261 |
|
1262 Returns whether the item is tristate; that is, if it's checkable with three |
|
1263 separate states. |
|
1264 |
|
1265 The default value is false. |
|
1266 |
|
1267 \sa setTristate(), isCheckable(), checkState() |
|
1268 */ |
|
1269 |
|
1270 #ifndef QT_NO_DRAGANDDROP |
|
1271 |
|
1272 /*! |
|
1273 Sets whether the item is drag enabled. If \a dragEnabled is true, the item |
|
1274 can be dragged by the user; otherwise, the user cannot drag the item. |
|
1275 |
|
1276 Note that you also need to ensure that item dragging is enabled in the view; |
|
1277 see QAbstractItemView::dragEnabled. |
|
1278 |
|
1279 \sa isDragEnabled(), setDropEnabled(), setFlags() |
|
1280 */ |
|
1281 void QStandardItem::setDragEnabled(bool dragEnabled) |
|
1282 { |
|
1283 Q_D(QStandardItem); |
|
1284 d->changeFlags(dragEnabled, Qt::ItemIsDragEnabled); |
|
1285 } |
|
1286 |
|
1287 /*! |
|
1288 \fn bool QStandardItem::isDragEnabled() const |
|
1289 |
|
1290 Returns whether the item is drag enabled. An item that is drag enabled can |
|
1291 be dragged by the user. |
|
1292 |
|
1293 The default value is true. |
|
1294 |
|
1295 Note that item dragging must be enabled in the view for dragging to work; |
|
1296 see QAbstractItemView::dragEnabled. |
|
1297 |
|
1298 \sa setDragEnabled(), isDropEnabled(), flags() |
|
1299 */ |
|
1300 |
|
1301 /*! |
|
1302 Sets whether the item is drop enabled. If \a dropEnabled is true, the item |
|
1303 can be used as a drop target; otherwise, it cannot. |
|
1304 |
|
1305 Note that you also need to ensure that drops are enabled in the view; see |
|
1306 QWidget::acceptDrops(); and that the model supports the desired drop actions; |
|
1307 see QAbstractItemModel::supportedDropActions(). |
|
1308 |
|
1309 \sa isDropEnabled(), setDragEnabled(), setFlags() |
|
1310 */ |
|
1311 void QStandardItem::setDropEnabled(bool dropEnabled) |
|
1312 { |
|
1313 Q_D(QStandardItem); |
|
1314 d->changeFlags(dropEnabled, Qt::ItemIsDropEnabled); |
|
1315 } |
|
1316 |
|
1317 /*! |
|
1318 \fn bool QStandardItem::isDropEnabled() const |
|
1319 |
|
1320 Returns whether the item is drop enabled. When an item is drop enabled, it |
|
1321 can be used as a drop target. |
|
1322 |
|
1323 The default value is true. |
|
1324 |
|
1325 \sa setDropEnabled(), isDragEnabled(), flags() |
|
1326 */ |
|
1327 |
|
1328 #endif // QT_NO_DRAGANDDROP |
|
1329 |
|
1330 /*! |
|
1331 Returns the row where the item is located in its parent's child table, or |
|
1332 -1 if the item has no parent. |
|
1333 |
|
1334 \sa column(), parent() |
|
1335 */ |
|
1336 int QStandardItem::row() const |
|
1337 { |
|
1338 Q_D(const QStandardItem); |
|
1339 QPair<int, int> pos = d->position(); |
|
1340 return pos.first; |
|
1341 } |
|
1342 |
|
1343 /*! |
|
1344 Returns the column where the item is located in its parent's child table, |
|
1345 or -1 if the item has no parent. |
|
1346 |
|
1347 \sa row(), parent() |
|
1348 */ |
|
1349 int QStandardItem::column() const |
|
1350 { |
|
1351 Q_D(const QStandardItem); |
|
1352 QPair<int, int> pos = d->position(); |
|
1353 return pos.second; |
|
1354 } |
|
1355 |
|
1356 /*! |
|
1357 Returns the QModelIndex associated with this item. |
|
1358 |
|
1359 When you need to invoke item functionality in a QModelIndex-based API (e.g. |
|
1360 QAbstractItemView), you can call this function to obtain an index that |
|
1361 corresponds to the item's location in the model. |
|
1362 |
|
1363 If the item is not associated with a model, an invalid QModelIndex is |
|
1364 returned. |
|
1365 |
|
1366 \sa model(), QStandardItemModel::itemFromIndex() |
|
1367 */ |
|
1368 QModelIndex QStandardItem::index() const |
|
1369 { |
|
1370 Q_D(const QStandardItem); |
|
1371 return d->model ? d->model->indexFromItem(this) : QModelIndex(); |
|
1372 } |
|
1373 |
|
1374 /*! |
|
1375 Returns the QStandardItemModel that this item belongs to. |
|
1376 |
|
1377 If the item is not a child of another item that belongs to the model, this |
|
1378 function returns 0. |
|
1379 |
|
1380 \sa index() |
|
1381 */ |
|
1382 QStandardItemModel *QStandardItem::model() const |
|
1383 { |
|
1384 Q_D(const QStandardItem); |
|
1385 return d->model; |
|
1386 } |
|
1387 |
|
1388 /*! |
|
1389 Sets the number of child item rows to \a rows. If this is less than |
|
1390 rowCount(), the data in the unwanted rows is discarded. |
|
1391 |
|
1392 \sa rowCount(), setColumnCount() |
|
1393 */ |
|
1394 void QStandardItem::setRowCount(int rows) |
|
1395 { |
|
1396 int rc = rowCount(); |
|
1397 if (rc == rows) |
|
1398 return; |
|
1399 if (rc < rows) |
|
1400 insertRows(qMax(rc, 0), rows - rc); |
|
1401 else |
|
1402 removeRows(qMax(rows, 0), rc - rows); |
|
1403 } |
|
1404 |
|
1405 /*! |
|
1406 Returns the number of child item rows that the item has. |
|
1407 |
|
1408 \sa setRowCount(), columnCount() |
|
1409 */ |
|
1410 int QStandardItem::rowCount() const |
|
1411 { |
|
1412 Q_D(const QStandardItem); |
|
1413 return d->rowCount(); |
|
1414 } |
|
1415 |
|
1416 /*! |
|
1417 Sets the number of child item columns to \a columns. If this is less than |
|
1418 columnCount(), the data in the unwanted columns is discarded. |
|
1419 |
|
1420 \sa columnCount(), setRowCount() |
|
1421 */ |
|
1422 void QStandardItem::setColumnCount(int columns) |
|
1423 { |
|
1424 int cc = columnCount(); |
|
1425 if (cc == columns) |
|
1426 return; |
|
1427 if (cc < columns) |
|
1428 insertColumns(qMax(cc, 0), columns - cc); |
|
1429 else |
|
1430 removeColumns(qMax(columns, 0), cc - columns); |
|
1431 } |
|
1432 |
|
1433 /*! |
|
1434 Returns the number of child item columns that the item has. |
|
1435 |
|
1436 \sa setColumnCount(), rowCount() |
|
1437 */ |
|
1438 int QStandardItem::columnCount() const |
|
1439 { |
|
1440 Q_D(const QStandardItem); |
|
1441 return d->columnCount(); |
|
1442 } |
|
1443 |
|
1444 /*! |
|
1445 Inserts a row at \a row containing \a items. If necessary, the column |
|
1446 count is increased to the size of \a items. |
|
1447 |
|
1448 \sa insertRows(), insertColumn() |
|
1449 */ |
|
1450 void QStandardItem::insertRow(int row, const QList<QStandardItem*> &items) |
|
1451 { |
|
1452 Q_D(QStandardItem); |
|
1453 if (row < 0) |
|
1454 return; |
|
1455 if (columnCount() < items.count()) |
|
1456 setColumnCount(items.count()); |
|
1457 d->insertRows(row, 1, items); |
|
1458 } |
|
1459 |
|
1460 /*! |
|
1461 Inserts \a items at \a row. The column count wont be changed. |
|
1462 |
|
1463 \sa insertRow(), insertColumn() |
|
1464 */ |
|
1465 void QStandardItem::insertRows(int row, const QList<QStandardItem*> &items) |
|
1466 { |
|
1467 Q_D(QStandardItem); |
|
1468 if (row < 0) |
|
1469 return; |
|
1470 d->insertRows(row, items); |
|
1471 } |
|
1472 |
|
1473 /*! |
|
1474 Inserts a column at \a column containing \a items. If necessary, |
|
1475 the row count is increased to the size of \a items. |
|
1476 |
|
1477 \sa insertColumns(), insertRow() |
|
1478 */ |
|
1479 void QStandardItem::insertColumn(int column, const QList<QStandardItem*> &items) |
|
1480 { |
|
1481 Q_D(QStandardItem); |
|
1482 if (column < 0) |
|
1483 return; |
|
1484 if (rowCount() < items.count()) |
|
1485 setRowCount(items.count()); |
|
1486 d->insertColumns(column, 1, items); |
|
1487 } |
|
1488 |
|
1489 /*! |
|
1490 Inserts \a count rows of child items at row \a row. |
|
1491 |
|
1492 \sa insertRow(), insertColumns() |
|
1493 */ |
|
1494 void QStandardItem::insertRows(int row, int count) |
|
1495 { |
|
1496 Q_D(QStandardItem); |
|
1497 if (rowCount() < row) { |
|
1498 count += row - rowCount(); |
|
1499 row = rowCount(); |
|
1500 } |
|
1501 d->insertRows(row, count, QList<QStandardItem*>()); |
|
1502 } |
|
1503 |
|
1504 /*! |
|
1505 Inserts \a count columns of child items at column \a column. |
|
1506 |
|
1507 \sa insertColumn(), insertRows() |
|
1508 */ |
|
1509 void QStandardItem::insertColumns(int column, int count) |
|
1510 { |
|
1511 Q_D(QStandardItem); |
|
1512 if (columnCount() < column) { |
|
1513 count += column - columnCount(); |
|
1514 column = columnCount(); |
|
1515 } |
|
1516 d->insertColumns(column, count, QList<QStandardItem*>()); |
|
1517 } |
|
1518 |
|
1519 /*! |
|
1520 \fn void QStandardItem::appendRow(const QList<QStandardItem*> &items) |
|
1521 |
|
1522 Appends a row containing \a items. If necessary, the column count is |
|
1523 increased to the size of \a items. |
|
1524 |
|
1525 \sa insertRow() |
|
1526 */ |
|
1527 |
|
1528 /*! |
|
1529 \fn void QStandardItem::appendRows(const QList<QStandardItem*> &items) |
|
1530 |
|
1531 Appends rows containing \a items. The column count will not change. |
|
1532 |
|
1533 \sa insertRow() |
|
1534 */ |
|
1535 |
|
1536 /*! |
|
1537 \fn void QStandardItem::appendColumn(const QList<QStandardItem*> &items) |
|
1538 |
|
1539 Appends a column containing \a items. If necessary, the row count is |
|
1540 increased to the size of \a items. |
|
1541 |
|
1542 \sa insertColumn() |
|
1543 */ |
|
1544 |
|
1545 /*! |
|
1546 \fn bool QStandardItemModel::insertRow(int row, const QModelIndex &parent) |
|
1547 |
|
1548 Inserts a single row before the given \a row in the child items of the |
|
1549 \a parent specified. Returns true if the row is inserted; otherwise |
|
1550 returns false. |
|
1551 |
|
1552 \sa insertRows(), insertColumn(), removeRow() |
|
1553 */ |
|
1554 |
|
1555 /*! |
|
1556 \fn bool QStandardItemModel::insertColumn(int column, const QModelIndex &parent) |
|
1557 |
|
1558 Inserts a single column before the given \a column in the child items of |
|
1559 the \a parent specified. Returns true if the column is inserted; otherwise |
|
1560 returns false. |
|
1561 |
|
1562 \sa insertColumns(), insertRow(), removeColumn() |
|
1563 */ |
|
1564 |
|
1565 /*! |
|
1566 \fn QStandardItem::insertRow(int row, QStandardItem *item) |
|
1567 \overload |
|
1568 |
|
1569 Inserts a row at \a row containing \a item. |
|
1570 |
|
1571 When building a list or a tree that has only one column, this function |
|
1572 provides a convenient way to insert a single new item. |
|
1573 */ |
|
1574 |
|
1575 /*! |
|
1576 \fn QStandardItem::appendRow(QStandardItem *item) |
|
1577 \overload |
|
1578 |
|
1579 Appends a row containing \a item. |
|
1580 |
|
1581 When building a list or a tree that has only one column, this function |
|
1582 provides a convenient way to append a single new item. |
|
1583 */ |
|
1584 |
|
1585 /*! |
|
1586 Removes the given \a row. The items that were in the row are deleted. |
|
1587 |
|
1588 \sa takeRow(), removeRows(), removeColumn() |
|
1589 */ |
|
1590 void QStandardItem::removeRow(int row) |
|
1591 { |
|
1592 removeRows(row, 1); |
|
1593 } |
|
1594 |
|
1595 /*! |
|
1596 Removes the given \a column. The items that were in the |
|
1597 column are deleted. |
|
1598 |
|
1599 \sa takeColumn(), removeColumns(), removeRow() |
|
1600 */ |
|
1601 void QStandardItem::removeColumn(int column) |
|
1602 { |
|
1603 removeColumns(column, 1); |
|
1604 } |
|
1605 |
|
1606 /*! |
|
1607 Removes \a count rows at row \a row. The items that were in those rows are |
|
1608 deleted. |
|
1609 |
|
1610 \sa removeRow(), removeColumn() |
|
1611 */ |
|
1612 void QStandardItem::removeRows(int row, int count) |
|
1613 { |
|
1614 Q_D(QStandardItem); |
|
1615 if ((count < 1) || (row < 0) || ((row + count) > rowCount())) |
|
1616 return; |
|
1617 if (d->model) |
|
1618 d->model->d_func()->rowsAboutToBeRemoved(this, row, row + count - 1); |
|
1619 int i = d->childIndex(row, 0); |
|
1620 int n = count * d->columnCount(); |
|
1621 for (int j = i; j < n+i; ++j) { |
|
1622 QStandardItem *oldItem = d->children.at(j); |
|
1623 if (oldItem) |
|
1624 oldItem->d_func()->setModel(0); |
|
1625 delete oldItem; |
|
1626 } |
|
1627 d->children.remove(qMax(i, 0), n); |
|
1628 d->rows -= count; |
|
1629 if (d->model) |
|
1630 d->model->d_func()->rowsRemoved(this, row, count); |
|
1631 } |
|
1632 |
|
1633 /*! |
|
1634 Removes \a count columns at column \a column. The items that were in those |
|
1635 columns are deleted. |
|
1636 |
|
1637 \sa removeColumn(), removeRows() |
|
1638 */ |
|
1639 void QStandardItem::removeColumns(int column, int count) |
|
1640 { |
|
1641 Q_D(QStandardItem); |
|
1642 if ((count < 1) || (column < 0) || ((column + count) > columnCount())) |
|
1643 return; |
|
1644 if (d->model) |
|
1645 d->model->d_func()->columnsAboutToBeRemoved(this, column, column + count - 1); |
|
1646 for (int row = d->rowCount() - 1; row >= 0; --row) { |
|
1647 int i = d->childIndex(row, column); |
|
1648 for (int j=i; j<i+count; ++j) { |
|
1649 QStandardItem *oldItem = d->children.at(j); |
|
1650 if (oldItem) |
|
1651 oldItem->d_func()->setModel(0); |
|
1652 delete oldItem; |
|
1653 } |
|
1654 d->children.remove(i, count); |
|
1655 } |
|
1656 d->columns -= count; |
|
1657 if (d->model) |
|
1658 d->model->d_func()->columnsRemoved(this, column, count); |
|
1659 } |
|
1660 |
|
1661 /*! |
|
1662 Returns true if this item has any children; otherwise returns false. |
|
1663 |
|
1664 \sa rowCount(), columnCount(), child() |
|
1665 */ |
|
1666 bool QStandardItem::hasChildren() const |
|
1667 { |
|
1668 return (rowCount() > 0) && (columnCount() > 0); |
|
1669 } |
|
1670 |
|
1671 /*! |
|
1672 Sets the child item at (\a row, \a column) to \a item. This item (the parent |
|
1673 item) takes ownership of \a item. If necessary, the row count and column |
|
1674 count are increased to fit the item. |
|
1675 |
|
1676 \sa child() |
|
1677 */ |
|
1678 void QStandardItem::setChild(int row, int column, QStandardItem *item) |
|
1679 { |
|
1680 Q_D(QStandardItem); |
|
1681 d->setChild(row, column, item, true); |
|
1682 } |
|
1683 |
|
1684 /*! |
|
1685 \fn QStandardItem::setChild(int row, QStandardItem *item) |
|
1686 \overload |
|
1687 |
|
1688 Sets the child at \a row to \a item. |
|
1689 */ |
|
1690 |
|
1691 /*! |
|
1692 Returns the child item at (\a row, \a column) if one has been set; otherwise |
|
1693 returns 0. |
|
1694 |
|
1695 \sa setChild(), takeChild(), parent() |
|
1696 */ |
|
1697 QStandardItem *QStandardItem::child(int row, int column) const |
|
1698 { |
|
1699 Q_D(const QStandardItem); |
|
1700 int index = d->childIndex(row, column); |
|
1701 if (index == -1) |
|
1702 return 0; |
|
1703 return d->children.at(index); |
|
1704 } |
|
1705 |
|
1706 /*! |
|
1707 Removes the child item at (\a row, \a column) without deleting it, and returns |
|
1708 a pointer to the item. If there was no child at the given location, then |
|
1709 this function returns 0. |
|
1710 |
|
1711 Note that this function, unlike takeRow() and takeColumn(), does not affect |
|
1712 the dimensions of the child table. |
|
1713 |
|
1714 \sa child(), takeRow(), takeColumn() |
|
1715 */ |
|
1716 QStandardItem *QStandardItem::takeChild(int row, int column) |
|
1717 { |
|
1718 Q_D(QStandardItem); |
|
1719 QStandardItem *item = 0; |
|
1720 int index = d->childIndex(row, column); |
|
1721 if (index != -1) { |
|
1722 item = d->children.at(index); |
|
1723 if (item) |
|
1724 item->d_func()->setParentAndModel(0, 0); |
|
1725 d->children.replace(index, 0); |
|
1726 } |
|
1727 return item; |
|
1728 } |
|
1729 |
|
1730 /*! |
|
1731 Removes \a row without deleting the row items, and returns a list of |
|
1732 pointers to the removed items. For items in the row that have not been |
|
1733 set, the corresponding pointers in the list will be 0. |
|
1734 |
|
1735 \sa removeRow(), insertRow(), takeColumn() |
|
1736 */ |
|
1737 QList<QStandardItem*> QStandardItem::takeRow(int row) |
|
1738 { |
|
1739 Q_D(QStandardItem); |
|
1740 if ((row < 0) || (row >= rowCount())) |
|
1741 return QList<QStandardItem*>(); |
|
1742 if (d->model) |
|
1743 d->model->d_func()->rowsAboutToBeRemoved(this, row, row); |
|
1744 QList<QStandardItem*> items; |
|
1745 int index = d->childIndex(row, 0); // Will return -1 if there are no columns |
|
1746 if (index != -1) { |
|
1747 int col_count = d->columnCount(); |
|
1748 for (int column = 0; column < col_count; ++column) { |
|
1749 QStandardItem *ch = d->children.at(index + column); |
|
1750 if (ch) |
|
1751 ch->d_func()->setParentAndModel(0, 0); |
|
1752 items.append(ch); |
|
1753 } |
|
1754 d->children.remove(index, col_count); |
|
1755 } |
|
1756 d->rows--; |
|
1757 if (d->model) |
|
1758 d->model->d_func()->rowsRemoved(this, row, 1); |
|
1759 return items; |
|
1760 } |
|
1761 |
|
1762 /*! |
|
1763 Removes \a column without deleting the column items, and returns a list of |
|
1764 pointers to the removed items. For items in the column that have not been |
|
1765 set, the corresponding pointers in the list will be 0. |
|
1766 |
|
1767 \sa removeColumn(), insertColumn(), takeRow() |
|
1768 */ |
|
1769 QList<QStandardItem*> QStandardItem::takeColumn(int column) |
|
1770 { |
|
1771 Q_D(QStandardItem); |
|
1772 if ((column < 0) || (column >= columnCount())) |
|
1773 return QList<QStandardItem*>(); |
|
1774 if (d->model) |
|
1775 d->model->d_func()->columnsAboutToBeRemoved(this, column, column); |
|
1776 QList<QStandardItem*> items; |
|
1777 |
|
1778 for (int row = d->rowCount() - 1; row >= 0; --row) { |
|
1779 int index = d->childIndex(row, column); |
|
1780 QStandardItem *ch = d->children.at(index); |
|
1781 if (ch) |
|
1782 ch->d_func()->setParentAndModel(0, 0); |
|
1783 d->children.remove(index); |
|
1784 items.prepend(ch); |
|
1785 } |
|
1786 d->columns--; |
|
1787 if (d->model) |
|
1788 d->model->d_func()->columnsRemoved(this, column, 1); |
|
1789 return items; |
|
1790 } |
|
1791 |
|
1792 /*! |
|
1793 Returns true if this item is less than \a other; otherwise returns false. |
|
1794 |
|
1795 The default implementation uses the data for the item's sort role (see |
|
1796 QStandardItemModel::sortRole) to perform the comparison if the item |
|
1797 belongs to a model; otherwise, the data for the item's Qt::DisplayRole |
|
1798 (text()) is used to perform the comparison. |
|
1799 |
|
1800 sortChildren() and QStandardItemModel::sort() use this function when |
|
1801 sorting items. If you want custom sorting, you can subclass QStandardItem |
|
1802 and reimplement this function. |
|
1803 */ |
|
1804 bool QStandardItem::operator<(const QStandardItem &other) const |
|
1805 { |
|
1806 const int role = model() ? model()->sortRole() : Qt::DisplayRole; |
|
1807 const QVariant l = data(role), r = other.data(role); |
|
1808 // this code is copied from QSortFilterProxyModel::lessThan() |
|
1809 switch (l.userType()) { |
|
1810 case QVariant::Invalid: |
|
1811 return (r.type() == QVariant::Invalid); |
|
1812 case QVariant::Int: |
|
1813 return l.toInt() < r.toInt(); |
|
1814 case QVariant::UInt: |
|
1815 return l.toUInt() < r.toUInt(); |
|
1816 case QVariant::LongLong: |
|
1817 return l.toLongLong() < r.toLongLong(); |
|
1818 case QVariant::ULongLong: |
|
1819 return l.toULongLong() < r.toULongLong(); |
|
1820 case QMetaType::Float: |
|
1821 return l.toFloat() < r.toFloat(); |
|
1822 case QVariant::Double: |
|
1823 return l.toDouble() < r.toDouble(); |
|
1824 case QVariant::Char: |
|
1825 return l.toChar() < r.toChar(); |
|
1826 case QVariant::Date: |
|
1827 return l.toDate() < r.toDate(); |
|
1828 case QVariant::Time: |
|
1829 return l.toTime() < r.toTime(); |
|
1830 case QVariant::DateTime: |
|
1831 return l.toDateTime() < r.toDateTime(); |
|
1832 case QVariant::String: |
|
1833 default: |
|
1834 return l.toString().compare(r.toString()) < 0; |
|
1835 } |
|
1836 } |
|
1837 |
|
1838 /*! |
|
1839 Sorts the children of the item using the given \a order, by the values in |
|
1840 the given \a column. |
|
1841 |
|
1842 \note This function is recursive, therefore it sorts the children of the |
|
1843 item, its grandchildren, etc. |
|
1844 |
|
1845 \sa {operator<()} |
|
1846 */ |
|
1847 void QStandardItem::sortChildren(int column, Qt::SortOrder order) |
|
1848 { |
|
1849 Q_D(QStandardItem); |
|
1850 if ((column < 0) || (rowCount() == 0)) |
|
1851 return; |
|
1852 if (d->model) |
|
1853 emit d->model->layoutAboutToBeChanged(); |
|
1854 d->sortChildren(column, order); |
|
1855 if (d->model) |
|
1856 emit d->model->layoutChanged(); |
|
1857 } |
|
1858 |
|
1859 /*! |
|
1860 Returns a copy of this item. The item's children are not copied. |
|
1861 |
|
1862 When subclassing QStandardItem, you can reimplement this function |
|
1863 to provide QStandardItemModel with a factory that it can use to |
|
1864 create new items on demand. |
|
1865 |
|
1866 \sa QStandardItemModel::setItemPrototype(), operator=() |
|
1867 */ |
|
1868 QStandardItem *QStandardItem::clone() const |
|
1869 { |
|
1870 return new QStandardItem(*this); |
|
1871 } |
|
1872 |
|
1873 /*! |
|
1874 Returns the type of this item. The type is used to distinguish custom |
|
1875 items from the base class. When subclassing QStandardItem, you should |
|
1876 reimplement this function and return a new value greater than or equal |
|
1877 to \l UserType. |
|
1878 |
|
1879 \sa QStandardItem::Type |
|
1880 */ |
|
1881 int QStandardItem::type() const |
|
1882 { |
|
1883 return Type; |
|
1884 } |
|
1885 |
|
1886 #ifndef QT_NO_DATASTREAM |
|
1887 |
|
1888 /*! |
|
1889 Reads the item from stream \a in. Only the data and flags of the item are |
|
1890 read, not the child items. |
|
1891 |
|
1892 \sa write() |
|
1893 */ |
|
1894 void QStandardItem::read(QDataStream &in) |
|
1895 { |
|
1896 Q_D(QStandardItem); |
|
1897 in >> d->values; |
|
1898 qint32 flags; |
|
1899 in >> flags; |
|
1900 setFlags(Qt::ItemFlags(flags)); |
|
1901 } |
|
1902 |
|
1903 /*! |
|
1904 Writes the item to stream \a out. Only the data and flags of the item |
|
1905 are written, not the child items. |
|
1906 |
|
1907 \sa read() |
|
1908 */ |
|
1909 void QStandardItem::write(QDataStream &out) const |
|
1910 { |
|
1911 Q_D(const QStandardItem); |
|
1912 out << d->values; |
|
1913 out << flags(); |
|
1914 } |
|
1915 |
|
1916 /*! |
|
1917 \relates QStandardItem |
|
1918 \since 4.2 |
|
1919 |
|
1920 Reads a QStandardItem from stream \a in into \a item. |
|
1921 |
|
1922 This operator uses QStandardItem::read(). |
|
1923 |
|
1924 \sa {Format of the QDataStream Operators} |
|
1925 */ |
|
1926 QDataStream &operator>>(QDataStream &in, QStandardItem &item) |
|
1927 { |
|
1928 item.read(in); |
|
1929 return in; |
|
1930 } |
|
1931 |
|
1932 /*! |
|
1933 \relates QStandardItem |
|
1934 \since 4.2 |
|
1935 |
|
1936 Writes the QStandardItem \a item to stream \a out. |
|
1937 |
|
1938 This operator uses QStandardItem::write(). |
|
1939 |
|
1940 \sa {Format of the QDataStream Operators} |
|
1941 */ |
|
1942 QDataStream &operator<<(QDataStream &out, const QStandardItem &item) |
|
1943 { |
|
1944 item.write(out); |
|
1945 return out; |
|
1946 } |
|
1947 |
|
1948 #endif // QT_NO_DATASTREAM |
|
1949 |
|
1950 /*! |
|
1951 \class QStandardItemModel |
|
1952 \brief The QStandardItemModel class provides a generic model for storing custom data. |
|
1953 \ingroup model-view |
|
1954 |
|
1955 QStandardItemModel can be used as a repository for standard Qt |
|
1956 data types. It is one of the \l {Model/View Classes} and is part |
|
1957 of Qt's \l {Model/View Programming}{model/view} framework. |
|
1958 |
|
1959 QStandardItemModel provides a classic item-based approach to working with |
|
1960 the model. The items in a QStandardItemModel are provided by |
|
1961 QStandardItem. |
|
1962 |
|
1963 QStandardItemModel implements the QAbstractItemModel interface, which |
|
1964 means that the model can be used to provide data in any view that supports |
|
1965 that interface (such as QListView, QTableView and QTreeView, and your own |
|
1966 custom views). For performance and flexibility, you may want to subclass |
|
1967 QAbstractItemModel to provide support for different kinds of data |
|
1968 repositories. For example, the QDirModel provides a model interface to the |
|
1969 underlying file system. |
|
1970 |
|
1971 When you want a list or tree, you typically create an empty |
|
1972 QStandardItemModel and use appendRow() to add items to the model, and |
|
1973 item() to access an item. If your model represents a table, you typically |
|
1974 pass the dimensions of the table to the QStandardItemModel constructor and |
|
1975 use setItem() to position items into the table. You can also use setRowCount() |
|
1976 and setColumnCount() to alter the dimensions of the model. To insert items, |
|
1977 use insertRow() or insertColumn(), and to remove items, use removeRow() or |
|
1978 removeColumn(). |
|
1979 |
|
1980 You can set the header labels of your model with setHorizontalHeaderLabels() |
|
1981 and setVerticalHeaderLabels(). |
|
1982 |
|
1983 You can search for items in the model with findItems(), and sort the model by |
|
1984 calling sort(). |
|
1985 |
|
1986 Call clear() to remove all items from the model. |
|
1987 |
|
1988 An example usage of QStandardItemModel to create a table: |
|
1989 |
|
1990 \snippet doc/src/snippets/code/src_gui_itemviews_qstandarditemmodel.cpp 0 |
|
1991 |
|
1992 An example usage of QStandardItemModel to create a tree: |
|
1993 |
|
1994 \snippet doc/src/snippets/code/src_gui_itemviews_qstandarditemmodel.cpp 1 |
|
1995 |
|
1996 After setting the model on a view, you typically want to react to user |
|
1997 actions, such as an item being clicked. Since a QAbstractItemView provides |
|
1998 QModelIndex-based signals and functions, you need a way to obtain the |
|
1999 QStandardItem that corresponds to a given QModelIndex, and vice |
|
2000 versa. itemFromIndex() and indexFromItem() provide this mapping. Typical |
|
2001 usage of itemFromIndex() includes obtaining the item at the current index |
|
2002 in a view, and obtaining the item that corresponds to an index carried by |
|
2003 a QAbstractItemView signal, such as QAbstractItemView::clicked(). First |
|
2004 you connect the view's signal to a slot in your class: |
|
2005 |
|
2006 \snippet doc/src/snippets/code/src_gui_itemviews_qstandarditemmodel.cpp 2 |
|
2007 |
|
2008 When you receive the signal, you call itemFromIndex() on the given model |
|
2009 index to get a pointer to the item: |
|
2010 |
|
2011 \snippet doc/src/snippets/code/src_gui_itemviews_qstandarditemmodel.cpp 3 |
|
2012 |
|
2013 Conversely, you must obtain the QModelIndex of an item when you want to |
|
2014 invoke a model/view function that takes an index as argument. You can |
|
2015 obtain the index either by using the model's indexFromItem() function, or, |
|
2016 equivalently, by calling QStandardItem::index(): |
|
2017 |
|
2018 \snippet doc/src/snippets/code/src_gui_itemviews_qstandarditemmodel.cpp 4 |
|
2019 |
|
2020 You are, of course, not required to use the item-based approach; you could |
|
2021 instead rely entirely on the QAbstractItemModel interface when working with |
|
2022 the model, or use a combination of the two as appropriate. |
|
2023 |
|
2024 \sa QStandardItem, {Model/View Programming}, QAbstractItemModel, |
|
2025 {itemviews/simpletreemodel}{Simple Tree Model example}, |
|
2026 {Item View Convenience Classes} |
|
2027 */ |
|
2028 |
|
2029 /*! |
|
2030 \fn void QStandardItemModel::itemChanged(QStandardItem *item) |
|
2031 \since 4.2 |
|
2032 |
|
2033 This signal is emitted whenever the data of \a item has changed. |
|
2034 */ |
|
2035 |
|
2036 /*! |
|
2037 Constructs a new item model with the given \a parent. |
|
2038 */ |
|
2039 QStandardItemModel::QStandardItemModel(QObject *parent) |
|
2040 : QAbstractItemModel(*new QStandardItemModelPrivate, parent) |
|
2041 { |
|
2042 Q_D(QStandardItemModel); |
|
2043 d->init(); |
|
2044 d->root->d_func()->setModel(this); |
|
2045 } |
|
2046 |
|
2047 /*! |
|
2048 Constructs a new item model that initially has \a rows rows and \a columns |
|
2049 columns, and that has the given \a parent. |
|
2050 */ |
|
2051 QStandardItemModel::QStandardItemModel(int rows, int columns, QObject *parent) |
|
2052 : QAbstractItemModel(*new QStandardItemModelPrivate, parent) |
|
2053 { |
|
2054 Q_D(QStandardItemModel); |
|
2055 d->init(); |
|
2056 d->root->insertColumns(0, columns); |
|
2057 d->columnHeaderItems.insert(0, columns, 0); |
|
2058 d->root->insertRows(0, rows); |
|
2059 d->rowHeaderItems.insert(0, rows, 0); |
|
2060 d->root->d_func()->setModel(this); |
|
2061 } |
|
2062 |
|
2063 /*! |
|
2064 \internal |
|
2065 */ |
|
2066 QStandardItemModel::QStandardItemModel(QStandardItemModelPrivate &dd, QObject *parent) |
|
2067 : QAbstractItemModel(dd, parent) |
|
2068 { |
|
2069 Q_D(QStandardItemModel); |
|
2070 d->init(); |
|
2071 } |
|
2072 |
|
2073 /*! |
|
2074 Destructs the model. The model destroys all its items. |
|
2075 */ |
|
2076 QStandardItemModel::~QStandardItemModel() |
|
2077 { |
|
2078 } |
|
2079 |
|
2080 /*! |
|
2081 Removes all items (including header items) from the model and sets the |
|
2082 number of rows and columns to zero. |
|
2083 |
|
2084 \sa removeColumns(), removeRows() |
|
2085 */ |
|
2086 void QStandardItemModel::clear() |
|
2087 { |
|
2088 Q_D(QStandardItemModel); |
|
2089 d->root.reset(new QStandardItem); |
|
2090 d->root->d_func()->setModel(this); |
|
2091 qDeleteAll(d->columnHeaderItems); |
|
2092 d->columnHeaderItems.clear(); |
|
2093 qDeleteAll(d->rowHeaderItems); |
|
2094 d->rowHeaderItems.clear(); |
|
2095 reset(); |
|
2096 } |
|
2097 |
|
2098 /*! |
|
2099 \since 4.2 |
|
2100 |
|
2101 Returns a pointer to the QStandardItem associated with the given \a index. |
|
2102 |
|
2103 Calling this function is typically the initial step when processing |
|
2104 QModelIndex-based signals from a view, such as |
|
2105 QAbstractItemView::activated(). In your slot, you call itemFromIndex(), |
|
2106 with the QModelIndex carried by the signal as argument, to obtain a |
|
2107 pointer to the corresponding QStandardItem. |
|
2108 |
|
2109 Note that this function will lazily create an item for the index (using |
|
2110 itemPrototype()), and set it in the parent item's child table, if no item |
|
2111 already exists at that index. |
|
2112 |
|
2113 If \a index is an invalid index, this function returns 0. |
|
2114 |
|
2115 \sa indexFromItem() |
|
2116 */ |
|
2117 QStandardItem *QStandardItemModel::itemFromIndex(const QModelIndex &index) const |
|
2118 { |
|
2119 Q_D(const QStandardItemModel); |
|
2120 if ((index.row() < 0) || (index.column() < 0) || (index.model() != this)) |
|
2121 return 0; |
|
2122 QStandardItem *parent = static_cast<QStandardItem*>(index.internalPointer()); |
|
2123 if (parent == 0) |
|
2124 return 0; |
|
2125 QStandardItem *item = parent->child(index.row(), index.column()); |
|
2126 // lazy part |
|
2127 if (item == 0) { |
|
2128 item = d->createItem(); |
|
2129 parent->d_func()->setChild(index.row(), index.column(), item); |
|
2130 } |
|
2131 return item; |
|
2132 } |
|
2133 |
|
2134 /*! |
|
2135 \since 4.2 |
|
2136 |
|
2137 Returns the QModelIndex associated with the given \a item. |
|
2138 |
|
2139 Use this function when you want to perform an operation that requires the |
|
2140 QModelIndex of the item, such as |
|
2141 QAbstractItemView::scrollTo(). QStandardItem::index() is provided as |
|
2142 convenience; it is equivalent to calling this function. |
|
2143 |
|
2144 \sa itemFromIndex(), QStandardItem::index() |
|
2145 */ |
|
2146 QModelIndex QStandardItemModel::indexFromItem(const QStandardItem *item) const |
|
2147 { |
|
2148 if (item && item->d_func()->parent) { |
|
2149 QPair<int, int> pos = item->d_func()->position(); |
|
2150 return createIndex(pos.first, pos.second, item->d_func()->parent); |
|
2151 } |
|
2152 return QModelIndex(); |
|
2153 } |
|
2154 |
|
2155 /*! |
|
2156 \since 4.2 |
|
2157 |
|
2158 Sets the number of rows in this model to \a rows. If |
|
2159 this is less than rowCount(), the data in the unwanted rows |
|
2160 is discarded. |
|
2161 |
|
2162 \sa setColumnCount() |
|
2163 */ |
|
2164 void QStandardItemModel::setRowCount(int rows) |
|
2165 { |
|
2166 Q_D(QStandardItemModel); |
|
2167 d->root->setRowCount(rows); |
|
2168 } |
|
2169 |
|
2170 /*! |
|
2171 \since 4.2 |
|
2172 |
|
2173 Sets the number of columns in this model to \a columns. If |
|
2174 this is less than columnCount(), the data in the unwanted columns |
|
2175 is discarded. |
|
2176 |
|
2177 \sa setRowCount() |
|
2178 */ |
|
2179 void QStandardItemModel::setColumnCount(int columns) |
|
2180 { |
|
2181 Q_D(QStandardItemModel); |
|
2182 d->root->setColumnCount(columns); |
|
2183 } |
|
2184 |
|
2185 /*! |
|
2186 \since 4.2 |
|
2187 |
|
2188 Sets the item for the given \a row and \a column to \a item. The model |
|
2189 takes ownership of the item. If necessary, the row count and column count |
|
2190 are increased to fit the item. The previous item at the given location (if |
|
2191 there was one) is deleted. |
|
2192 |
|
2193 \sa item() |
|
2194 */ |
|
2195 void QStandardItemModel::setItem(int row, int column, QStandardItem *item) |
|
2196 { |
|
2197 Q_D(QStandardItemModel); |
|
2198 d->root->d_func()->setChild(row, column, item, true); |
|
2199 } |
|
2200 |
|
2201 /*! |
|
2202 \fn QStandardItemModel::setItem(int row, QStandardItem *item) |
|
2203 \overload |
|
2204 */ |
|
2205 |
|
2206 /*! |
|
2207 \since 4.2 |
|
2208 |
|
2209 Returns the item for the given \a row and \a column if one has been set; |
|
2210 otherwise returns 0. |
|
2211 |
|
2212 \sa setItem(), takeItem(), itemFromIndex() |
|
2213 */ |
|
2214 QStandardItem *QStandardItemModel::item(int row, int column) const |
|
2215 { |
|
2216 Q_D(const QStandardItemModel); |
|
2217 return d->root->child(row, column); |
|
2218 } |
|
2219 |
|
2220 /*! |
|
2221 \since 4.2 |
|
2222 |
|
2223 Returns the model's invisible root item. |
|
2224 |
|
2225 The invisible root item provides access to the model's top-level items |
|
2226 through the QStandardItem API, making it possible to write functions that |
|
2227 can treat top-level items and their children in a uniform way; for |
|
2228 example, recursive functions involving a tree model. |
|
2229 |
|
2230 \note Calling \l{QAbstractItemModel::index()}{index()} on the QStandardItem object |
|
2231 retrieved from this function is not valid. |
|
2232 */ |
|
2233 QStandardItem *QStandardItemModel::invisibleRootItem() const |
|
2234 { |
|
2235 Q_D(const QStandardItemModel); |
|
2236 return d->root.data(); |
|
2237 } |
|
2238 |
|
2239 /*! |
|
2240 \since 4.2 |
|
2241 |
|
2242 Sets the horizontal header item for \a column to \a item. The model takes |
|
2243 ownership of the item. If necessary, the column count is increased to fit |
|
2244 the item. The previous header item (if there was one) is deleted. |
|
2245 |
|
2246 \sa horizontalHeaderItem(), setHorizontalHeaderLabels(), |
|
2247 setVerticalHeaderItem() |
|
2248 */ |
|
2249 void QStandardItemModel::setHorizontalHeaderItem(int column, QStandardItem *item) |
|
2250 { |
|
2251 Q_D(QStandardItemModel); |
|
2252 if (column < 0) |
|
2253 return; |
|
2254 if (columnCount() <= column) |
|
2255 setColumnCount(column + 1); |
|
2256 |
|
2257 QStandardItem *oldItem = d->columnHeaderItems.at(column); |
|
2258 if (item == oldItem) |
|
2259 return; |
|
2260 |
|
2261 if (item) { |
|
2262 if (item->model() == 0) { |
|
2263 item->d_func()->setModel(this); |
|
2264 } else { |
|
2265 qWarning("QStandardItem::setHorizontalHeaderItem: Ignoring duplicate insertion of item %p", |
|
2266 item); |
|
2267 return; |
|
2268 } |
|
2269 } |
|
2270 |
|
2271 if (oldItem) |
|
2272 oldItem->d_func()->setModel(0); |
|
2273 delete oldItem; |
|
2274 |
|
2275 d->columnHeaderItems.replace(column, item); |
|
2276 emit headerDataChanged(Qt::Horizontal, column, column); |
|
2277 } |
|
2278 |
|
2279 /*! |
|
2280 \since 4.2 |
|
2281 |
|
2282 Returns the horizontal header item for \a column if one has been set; |
|
2283 otherwise returns 0. |
|
2284 |
|
2285 \sa setHorizontalHeaderItem(), verticalHeaderItem() |
|
2286 */ |
|
2287 QStandardItem *QStandardItemModel::horizontalHeaderItem(int column) const |
|
2288 { |
|
2289 Q_D(const QStandardItemModel); |
|
2290 if ((column < 0) || (column >= columnCount())) |
|
2291 return 0; |
|
2292 return d->columnHeaderItems.at(column); |
|
2293 } |
|
2294 |
|
2295 /*! |
|
2296 \since 4.2 |
|
2297 |
|
2298 Sets the vertical header item for \a row to \a item. The model takes |
|
2299 ownership of the item. If necessary, the row count is increased to fit the |
|
2300 item. The previous header item (if there was one) is deleted. |
|
2301 |
|
2302 \sa verticalHeaderItem(), setVerticalHeaderLabels(), |
|
2303 setHorizontalHeaderItem() |
|
2304 */ |
|
2305 void QStandardItemModel::setVerticalHeaderItem(int row, QStandardItem *item) |
|
2306 { |
|
2307 Q_D(QStandardItemModel); |
|
2308 if (row < 0) |
|
2309 return; |
|
2310 if (rowCount() <= row) |
|
2311 setRowCount(row + 1); |
|
2312 |
|
2313 QStandardItem *oldItem = d->rowHeaderItems.at(row); |
|
2314 if (item == oldItem) |
|
2315 return; |
|
2316 |
|
2317 if (item) { |
|
2318 if (item->model() == 0) { |
|
2319 item->d_func()->setModel(this); |
|
2320 } else { |
|
2321 qWarning("QStandardItem::setVerticalHeaderItem: Ignoring duplicate insertion of item %p", |
|
2322 item); |
|
2323 return; |
|
2324 } |
|
2325 } |
|
2326 |
|
2327 if (oldItem) |
|
2328 oldItem->d_func()->setModel(0); |
|
2329 delete oldItem; |
|
2330 |
|
2331 d->rowHeaderItems.replace(row, item); |
|
2332 emit headerDataChanged(Qt::Vertical, row, row); |
|
2333 } |
|
2334 |
|
2335 /*! |
|
2336 \since 4.2 |
|
2337 |
|
2338 Returns the vertical header item for row \a row if one has been set; |
|
2339 otherwise returns 0. |
|
2340 |
|
2341 \sa setVerticalHeaderItem(), horizontalHeaderItem() |
|
2342 */ |
|
2343 QStandardItem *QStandardItemModel::verticalHeaderItem(int row) const |
|
2344 { |
|
2345 Q_D(const QStandardItemModel); |
|
2346 if ((row < 0) || (row >= rowCount())) |
|
2347 return 0; |
|
2348 return d->rowHeaderItems.at(row); |
|
2349 } |
|
2350 |
|
2351 /*! |
|
2352 \since 4.2 |
|
2353 |
|
2354 Sets the horizontal header labels using \a labels. If necessary, the |
|
2355 column count is increased to the size of \a labels. |
|
2356 |
|
2357 \sa setHorizontalHeaderItem() |
|
2358 */ |
|
2359 void QStandardItemModel::setHorizontalHeaderLabels(const QStringList &labels) |
|
2360 { |
|
2361 Q_D(QStandardItemModel); |
|
2362 if (columnCount() < labels.count()) |
|
2363 setColumnCount(labels.count()); |
|
2364 for (int i = 0; i < labels.count(); ++i) { |
|
2365 QStandardItem *item = horizontalHeaderItem(i); |
|
2366 if (!item) { |
|
2367 item = d->createItem(); |
|
2368 setHorizontalHeaderItem(i, item); |
|
2369 } |
|
2370 item->setText(labels.at(i)); |
|
2371 } |
|
2372 } |
|
2373 |
|
2374 /*! |
|
2375 \since 4.2 |
|
2376 |
|
2377 Sets the vertical header labels using \a labels. If necessary, the row |
|
2378 count is increased to the size of \a labels. |
|
2379 |
|
2380 \sa setVerticalHeaderItem() |
|
2381 */ |
|
2382 void QStandardItemModel::setVerticalHeaderLabels(const QStringList &labels) |
|
2383 { |
|
2384 Q_D(QStandardItemModel); |
|
2385 if (rowCount() < labels.count()) |
|
2386 setRowCount(labels.count()); |
|
2387 for (int i = 0; i < labels.count(); ++i) { |
|
2388 QStandardItem *item = verticalHeaderItem(i); |
|
2389 if (!item) { |
|
2390 item = d->createItem(); |
|
2391 setVerticalHeaderItem(i, item); |
|
2392 } |
|
2393 item->setText(labels.at(i)); |
|
2394 } |
|
2395 } |
|
2396 |
|
2397 /*! |
|
2398 \since 4.2 |
|
2399 |
|
2400 Sets the item prototype for the model to the specified \a item. The model |
|
2401 takes ownership of the prototype. |
|
2402 |
|
2403 The item prototype acts as a QStandardItem factory, by relying on the |
|
2404 QStandardItem::clone() function. To provide your own prototype, subclass |
|
2405 QStandardItem, reimplement QStandardItem::clone() and set the prototype to |
|
2406 be an instance of your custom class. Whenever QStandardItemModel needs to |
|
2407 create an item on demand (for instance, when a view or item delegate calls |
|
2408 setData())), the new items will be instances of your custom class. |
|
2409 |
|
2410 \sa itemPrototype(), QStandardItem::clone() |
|
2411 */ |
|
2412 void QStandardItemModel::setItemPrototype(const QStandardItem *item) |
|
2413 { |
|
2414 Q_D(QStandardItemModel); |
|
2415 if (d->itemPrototype != item) { |
|
2416 delete d->itemPrototype; |
|
2417 d->itemPrototype = item; |
|
2418 } |
|
2419 } |
|
2420 |
|
2421 /*! |
|
2422 \since 4.2 |
|
2423 |
|
2424 Returns the item prototype used by the model. The model uses the item |
|
2425 prototype as an item factory when it needs to construct new items on |
|
2426 demand (for instance, when a view or item delegate calls setData()). |
|
2427 |
|
2428 \sa setItemPrototype() |
|
2429 */ |
|
2430 const QStandardItem *QStandardItemModel::itemPrototype() const |
|
2431 { |
|
2432 Q_D(const QStandardItemModel); |
|
2433 return d->itemPrototype; |
|
2434 } |
|
2435 |
|
2436 /*! |
|
2437 \since 4.2 |
|
2438 |
|
2439 Returns a list of items that match the given \a text, using the given \a |
|
2440 flags, in the given \a column. |
|
2441 */ |
|
2442 QList<QStandardItem*> QStandardItemModel::findItems(const QString &text, |
|
2443 Qt::MatchFlags flags, int column) const |
|
2444 { |
|
2445 QModelIndexList indexes = match(index(0, column, QModelIndex()), |
|
2446 Qt::DisplayRole, text, -1, flags); |
|
2447 QList<QStandardItem*> items; |
|
2448 for (int i = 0; i < indexes.size(); ++i) |
|
2449 items.append(itemFromIndex(indexes.at(i))); |
|
2450 return items; |
|
2451 } |
|
2452 |
|
2453 /*! |
|
2454 \since 4.2 |
|
2455 |
|
2456 Appends a row containing \a items. If necessary, the column count is |
|
2457 increased to the size of \a items. |
|
2458 |
|
2459 \sa insertRow(), appendColumn() |
|
2460 */ |
|
2461 void QStandardItemModel::appendRow(const QList<QStandardItem*> &items) |
|
2462 { |
|
2463 invisibleRootItem()->appendRow(items); |
|
2464 } |
|
2465 |
|
2466 /*! |
|
2467 \since 4.2 |
|
2468 |
|
2469 Appends a column containing \a items. If necessary, the row count is |
|
2470 increased to the size of \a items. |
|
2471 |
|
2472 \sa insertColumn(), appendRow() |
|
2473 */ |
|
2474 void QStandardItemModel::appendColumn(const QList<QStandardItem*> &items) |
|
2475 { |
|
2476 invisibleRootItem()->appendColumn(items); |
|
2477 } |
|
2478 |
|
2479 /*! |
|
2480 \since 4.2 |
|
2481 \fn QStandardItemModel::appendRow(QStandardItem *item) |
|
2482 \overload |
|
2483 |
|
2484 When building a list or a tree that has only one column, this function |
|
2485 provides a convenient way to append a single new \a item. |
|
2486 */ |
|
2487 |
|
2488 /*! |
|
2489 \since 4.2 |
|
2490 |
|
2491 Inserts a row at \a row containing \a items. If necessary, the column |
|
2492 count is increased to the size of \a items. |
|
2493 |
|
2494 \sa takeRow(), appendRow(), insertColumn() |
|
2495 */ |
|
2496 void QStandardItemModel::insertRow(int row, const QList<QStandardItem*> &items) |
|
2497 { |
|
2498 invisibleRootItem()->insertRow(row, items); |
|
2499 } |
|
2500 |
|
2501 /*! |
|
2502 \since 4.2 |
|
2503 |
|
2504 \fn void QStandardItemModel::insertRow(int row, QStandardItem *item) |
|
2505 \overload |
|
2506 |
|
2507 Inserts a row at \a row containing \a item. |
|
2508 |
|
2509 When building a list or a tree that has only one column, this function |
|
2510 provides a convenient way to append a single new item. |
|
2511 */ |
|
2512 |
|
2513 /*! |
|
2514 \since 4.2 |
|
2515 |
|
2516 Inserts a column at \a column containing \a items. If necessary, the row |
|
2517 count is increased to the size of \a items. |
|
2518 |
|
2519 \sa takeColumn(), appendColumn(), insertRow() |
|
2520 */ |
|
2521 void QStandardItemModel::insertColumn(int column, const QList<QStandardItem*> &items) |
|
2522 { |
|
2523 invisibleRootItem()->insertColumn(column, items); |
|
2524 } |
|
2525 |
|
2526 /*! |
|
2527 \since 4.2 |
|
2528 |
|
2529 Removes the item at (\a row, \a column) without deleting it. The model |
|
2530 releases ownership of the item. |
|
2531 |
|
2532 \sa item(), takeRow(), takeColumn() |
|
2533 */ |
|
2534 QStandardItem *QStandardItemModel::takeItem(int row, int column) |
|
2535 { |
|
2536 Q_D(QStandardItemModel); |
|
2537 return d->root->takeChild(row, column); |
|
2538 } |
|
2539 |
|
2540 /*! |
|
2541 \since 4.2 |
|
2542 |
|
2543 Removes the given \a row without deleting the row items, and returns a |
|
2544 list of pointers to the removed items. The model releases ownership of the |
|
2545 items. For items in the row that have not been set, the corresponding |
|
2546 pointers in the list will be 0. |
|
2547 |
|
2548 \sa takeColumn() |
|
2549 */ |
|
2550 QList<QStandardItem*> QStandardItemModel::takeRow(int row) |
|
2551 { |
|
2552 Q_D(QStandardItemModel); |
|
2553 return d->root->takeRow(row); |
|
2554 } |
|
2555 |
|
2556 /*! |
|
2557 \since 4.2 |
|
2558 |
|
2559 Removes the given \a column without deleting the column items, and returns |
|
2560 a list of pointers to the removed items. The model releases ownership of |
|
2561 the items. For items in the column that have not been set, the |
|
2562 corresponding pointers in the list will be 0. |
|
2563 |
|
2564 \sa takeRow() |
|
2565 */ |
|
2566 QList<QStandardItem*> QStandardItemModel::takeColumn(int column) |
|
2567 { |
|
2568 Q_D(QStandardItemModel); |
|
2569 return d->root->takeColumn(column); |
|
2570 } |
|
2571 |
|
2572 /*! |
|
2573 \since 4.2 |
|
2574 |
|
2575 Removes the horizontal header item at \a column from the header without |
|
2576 deleting it, and returns a pointer to the item. The model releases |
|
2577 ownership of the item. |
|
2578 |
|
2579 \sa horizontalHeaderItem(), takeVerticalHeaderItem() |
|
2580 */ |
|
2581 QStandardItem *QStandardItemModel::takeHorizontalHeaderItem(int column) |
|
2582 { |
|
2583 Q_D(QStandardItemModel); |
|
2584 if ((column < 0) || (column >= columnCount())) |
|
2585 return 0; |
|
2586 QStandardItem *headerItem = d->columnHeaderItems.at(column); |
|
2587 if (headerItem) { |
|
2588 headerItem->d_func()->setParentAndModel(0, 0); |
|
2589 d->columnHeaderItems.replace(column, 0); |
|
2590 } |
|
2591 return headerItem; |
|
2592 } |
|
2593 |
|
2594 /*! |
|
2595 \since 4.2 |
|
2596 |
|
2597 Removes the vertical header item at \a row from the header without |
|
2598 deleting it, and returns a pointer to the item. The model releases |
|
2599 ownership of the item. |
|
2600 |
|
2601 \sa verticalHeaderItem(), takeHorizontalHeaderItem() |
|
2602 */ |
|
2603 QStandardItem *QStandardItemModel::takeVerticalHeaderItem(int row) |
|
2604 { |
|
2605 Q_D(QStandardItemModel); |
|
2606 if ((row < 0) || (row >= rowCount())) |
|
2607 return 0; |
|
2608 QStandardItem *headerItem = d->rowHeaderItems.at(row); |
|
2609 if (headerItem) { |
|
2610 headerItem->d_func()->setParentAndModel(0, 0); |
|
2611 d->rowHeaderItems.replace(row, 0); |
|
2612 } |
|
2613 return headerItem; |
|
2614 } |
|
2615 |
|
2616 /*! |
|
2617 \since 4.2 |
|
2618 \property QStandardItemModel::sortRole |
|
2619 \brief the item role that is used to query the model's data when sorting items |
|
2620 |
|
2621 The default value is Qt::DisplayRole. |
|
2622 |
|
2623 \sa sort(), QStandardItem::sortChildren() |
|
2624 */ |
|
2625 int QStandardItemModel::sortRole() const |
|
2626 { |
|
2627 Q_D(const QStandardItemModel); |
|
2628 return d->sortRole; |
|
2629 } |
|
2630 |
|
2631 void QStandardItemModel::setSortRole(int role) |
|
2632 { |
|
2633 Q_D(QStandardItemModel); |
|
2634 d->sortRole = role; |
|
2635 } |
|
2636 |
|
2637 /*! |
|
2638 \reimp |
|
2639 */ |
|
2640 int QStandardItemModel::columnCount(const QModelIndex &parent) const |
|
2641 { |
|
2642 Q_D(const QStandardItemModel); |
|
2643 QStandardItem *item = d->itemFromIndex(parent); |
|
2644 return item ? item->columnCount() : 0; |
|
2645 } |
|
2646 |
|
2647 /*! |
|
2648 \reimp |
|
2649 */ |
|
2650 QVariant QStandardItemModel::data(const QModelIndex &index, int role) const |
|
2651 { |
|
2652 Q_D(const QStandardItemModel); |
|
2653 QStandardItem *item = d->itemFromIndex(index); |
|
2654 return item ? item->data(role) : QVariant(); |
|
2655 } |
|
2656 |
|
2657 /*! |
|
2658 \reimp |
|
2659 */ |
|
2660 Qt::ItemFlags QStandardItemModel::flags(const QModelIndex &index) const |
|
2661 { |
|
2662 Q_D(const QStandardItemModel); |
|
2663 if (!d->indexValid(index)) |
|
2664 return d->root->flags(); |
|
2665 QStandardItem *item = d->itemFromIndex(index); |
|
2666 if (item) |
|
2667 return item->flags(); |
|
2668 return Qt::ItemIsSelectable |
|
2669 |Qt::ItemIsEnabled |
|
2670 |Qt::ItemIsEditable |
|
2671 |Qt::ItemIsDragEnabled |
|
2672 |Qt::ItemIsDropEnabled; |
|
2673 } |
|
2674 |
|
2675 /*! |
|
2676 \reimp |
|
2677 */ |
|
2678 bool QStandardItemModel::hasChildren(const QModelIndex &parent) const |
|
2679 { |
|
2680 Q_D(const QStandardItemModel); |
|
2681 QStandardItem *item = d->itemFromIndex(parent); |
|
2682 return item ? item->hasChildren() : false; |
|
2683 } |
|
2684 |
|
2685 /*! |
|
2686 \reimp |
|
2687 */ |
|
2688 QVariant QStandardItemModel::headerData(int section, Qt::Orientation orientation, int role) const |
|
2689 { |
|
2690 Q_D(const QStandardItemModel); |
|
2691 if ((section < 0) |
|
2692 || ((orientation == Qt::Horizontal) && (section >= columnCount())) |
|
2693 || ((orientation == Qt::Vertical) && (section >= rowCount()))) { |
|
2694 return QVariant(); |
|
2695 } |
|
2696 QStandardItem *headerItem = 0; |
|
2697 if (orientation == Qt::Horizontal) |
|
2698 headerItem = d->columnHeaderItems.at(section); |
|
2699 else if (orientation == Qt::Vertical) |
|
2700 headerItem = d->rowHeaderItems.at(section); |
|
2701 return headerItem ? headerItem->data(role) |
|
2702 : QAbstractItemModel::headerData(section, orientation, role); |
|
2703 } |
|
2704 |
|
2705 /*! |
|
2706 \reimp |
|
2707 |
|
2708 QStandardItemModel supports both copy and move. |
|
2709 */ |
|
2710 Qt::DropActions QStandardItemModel::supportedDropActions () const |
|
2711 { |
|
2712 return Qt::CopyAction | Qt::MoveAction; |
|
2713 } |
|
2714 |
|
2715 /*! |
|
2716 \reimp |
|
2717 */ |
|
2718 QModelIndex QStandardItemModel::index(int row, int column, const QModelIndex &parent) const |
|
2719 { |
|
2720 Q_D(const QStandardItemModel); |
|
2721 QStandardItem *parentItem = d->itemFromIndex(parent); |
|
2722 if ((parentItem == 0) |
|
2723 || (row < 0) |
|
2724 || (column < 0) |
|
2725 || (row >= parentItem->rowCount()) |
|
2726 || (column >= parentItem->columnCount())) { |
|
2727 return QModelIndex(); |
|
2728 } |
|
2729 return createIndex(row, column, parentItem); |
|
2730 } |
|
2731 |
|
2732 /*! |
|
2733 \reimp |
|
2734 */ |
|
2735 bool QStandardItemModel::insertColumns(int column, int count, const QModelIndex &parent) |
|
2736 { |
|
2737 Q_D(QStandardItemModel); |
|
2738 QStandardItem *item = parent.isValid() ? itemFromIndex(parent) : d->root.data(); |
|
2739 if (item == 0) |
|
2740 return false; |
|
2741 return item->d_func()->insertColumns(column, count, QList<QStandardItem*>()); |
|
2742 } |
|
2743 |
|
2744 /*! |
|
2745 \reimp |
|
2746 */ |
|
2747 bool QStandardItemModel::insertRows(int row, int count, const QModelIndex &parent) |
|
2748 { |
|
2749 Q_D(QStandardItemModel); |
|
2750 QStandardItem *item = parent.isValid() ? itemFromIndex(parent) : d->root.data(); |
|
2751 if (item == 0) |
|
2752 return false; |
|
2753 return item->d_func()->insertRows(row, count, QList<QStandardItem*>()); |
|
2754 } |
|
2755 |
|
2756 /*! |
|
2757 \reimp |
|
2758 */ |
|
2759 QMap<int, QVariant> QStandardItemModel::itemData(const QModelIndex &index) const |
|
2760 { |
|
2761 Q_D(const QStandardItemModel); |
|
2762 QStandardItem *item = d->itemFromIndex(index); |
|
2763 return item ? item->d_func()->itemData() : QMap<int, QVariant>(); |
|
2764 } |
|
2765 |
|
2766 /*! |
|
2767 \reimp |
|
2768 */ |
|
2769 QModelIndex QStandardItemModel::parent(const QModelIndex &child) const |
|
2770 { |
|
2771 Q_D(const QStandardItemModel); |
|
2772 if (!d->indexValid(child)) |
|
2773 return QModelIndex(); |
|
2774 QStandardItem *parentItem = static_cast<QStandardItem*>(child.internalPointer()); |
|
2775 return indexFromItem(parentItem); |
|
2776 } |
|
2777 |
|
2778 /*! |
|
2779 \reimp |
|
2780 */ |
|
2781 bool QStandardItemModel::removeColumns(int column, int count, const QModelIndex &parent) |
|
2782 { |
|
2783 Q_D(QStandardItemModel); |
|
2784 QStandardItem *item = d->itemFromIndex(parent); |
|
2785 if ((item == 0) || (count < 1) || (column < 0) || ((column + count) > item->columnCount())) |
|
2786 return false; |
|
2787 item->removeColumns(column, count); |
|
2788 return true; |
|
2789 } |
|
2790 |
|
2791 /*! |
|
2792 \reimp |
|
2793 */ |
|
2794 bool QStandardItemModel::removeRows(int row, int count, const QModelIndex &parent) |
|
2795 { |
|
2796 Q_D(QStandardItemModel); |
|
2797 QStandardItem *item = d->itemFromIndex(parent); |
|
2798 if ((item == 0) || (count < 1) || (row < 0) || ((row + count) > item->rowCount())) |
|
2799 return false; |
|
2800 item->removeRows(row, count); |
|
2801 return true; |
|
2802 } |
|
2803 |
|
2804 /*! |
|
2805 \reimp |
|
2806 */ |
|
2807 int QStandardItemModel::rowCount(const QModelIndex &parent) const |
|
2808 { |
|
2809 Q_D(const QStandardItemModel); |
|
2810 QStandardItem *item = d->itemFromIndex(parent); |
|
2811 return item ? item->rowCount() : 0; |
|
2812 } |
|
2813 |
|
2814 /*! |
|
2815 \reimp |
|
2816 */ |
|
2817 bool QStandardItemModel::setData(const QModelIndex &index, const QVariant &value, int role) |
|
2818 { |
|
2819 if (!index.isValid()) |
|
2820 return false; |
|
2821 QStandardItem *item = itemFromIndex(index); |
|
2822 if (item == 0) |
|
2823 return false; |
|
2824 item->setData(value, role); |
|
2825 return true; |
|
2826 } |
|
2827 |
|
2828 /*! |
|
2829 \reimp |
|
2830 */ |
|
2831 bool QStandardItemModel::setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role) |
|
2832 { |
|
2833 Q_D(QStandardItemModel); |
|
2834 if ((section < 0) |
|
2835 || ((orientation == Qt::Horizontal) && (section >= columnCount())) |
|
2836 || ((orientation == Qt::Vertical) && (section >= rowCount()))) { |
|
2837 return false; |
|
2838 } |
|
2839 QStandardItem *headerItem = 0; |
|
2840 if (orientation == Qt::Horizontal) { |
|
2841 headerItem = d->columnHeaderItems.at(section); |
|
2842 if (headerItem == 0) { |
|
2843 headerItem = d->createItem(); |
|
2844 headerItem->d_func()->setModel(this); |
|
2845 d->columnHeaderItems.replace(section, headerItem); |
|
2846 } |
|
2847 } else if (orientation == Qt::Vertical) { |
|
2848 headerItem = d->rowHeaderItems.at(section); |
|
2849 if (headerItem == 0) { |
|
2850 headerItem = d->createItem(); |
|
2851 headerItem->d_func()->setModel(this); |
|
2852 d->rowHeaderItems.replace(section, headerItem); |
|
2853 } |
|
2854 } |
|
2855 if (headerItem) { |
|
2856 headerItem->setData(value, role); |
|
2857 return true; |
|
2858 } |
|
2859 return false; |
|
2860 } |
|
2861 |
|
2862 /*! |
|
2863 \reimp |
|
2864 */ |
|
2865 bool QStandardItemModel::setItemData(const QModelIndex &index, const QMap<int, QVariant> &roles) |
|
2866 { |
|
2867 QStandardItem *item = itemFromIndex(index); |
|
2868 if (item == 0) |
|
2869 return false; |
|
2870 item->d_func()->setItemData(roles); |
|
2871 return true; |
|
2872 } |
|
2873 |
|
2874 /*! |
|
2875 \reimp |
|
2876 */ |
|
2877 void QStandardItemModel::sort(int column, Qt::SortOrder order) |
|
2878 { |
|
2879 Q_D(QStandardItemModel); |
|
2880 d->root->sortChildren(column, order); |
|
2881 } |
|
2882 |
|
2883 /*! |
|
2884 \fn QObject *QStandardItemModel::parent() const |
|
2885 \internal |
|
2886 */ |
|
2887 |
|
2888 |
|
2889 /*! |
|
2890 \reimp |
|
2891 */ |
|
2892 QStringList QStandardItemModel::mimeTypes() const |
|
2893 { |
|
2894 return QAbstractItemModel::mimeTypes() << QLatin1String("application/x-qstandarditemmodeldatalist"); |
|
2895 } |
|
2896 |
|
2897 /*! |
|
2898 \reimp |
|
2899 */ |
|
2900 QMimeData *QStandardItemModel::mimeData(const QModelIndexList &indexes) const |
|
2901 { |
|
2902 QMimeData *data = QAbstractItemModel::mimeData(indexes); |
|
2903 if(!data) |
|
2904 return 0; |
|
2905 |
|
2906 QString format = QLatin1String("application/x-qstandarditemmodeldatalist"); |
|
2907 if (!mimeTypes().contains(format)) |
|
2908 return data; |
|
2909 QByteArray encoded; |
|
2910 QDataStream stream(&encoded, QIODevice::WriteOnly); |
|
2911 |
|
2912 QSet<QStandardItem*> itemsSet; |
|
2913 QStack<QStandardItem*> stack; |
|
2914 itemsSet.reserve(indexes.count()); |
|
2915 stack.reserve(indexes.count()); |
|
2916 for (int i = 0; i < indexes.count(); ++i) { |
|
2917 QStandardItem *item = itemFromIndex(indexes.at(i)); |
|
2918 itemsSet << item; |
|
2919 stack.push(item); |
|
2920 } |
|
2921 |
|
2922 //remove duplicates childrens |
|
2923 { |
|
2924 QSet<QStandardItem *> seen; |
|
2925 while (!stack.isEmpty()) { |
|
2926 QStandardItem *itm = stack.pop(); |
|
2927 if (seen.contains(itm)) |
|
2928 continue; |
|
2929 seen.insert(itm); |
|
2930 |
|
2931 const QVector<QStandardItem*> &childList = itm->d_func()->children; |
|
2932 for (int i = 0; i < childList.count(); ++i) { |
|
2933 QStandardItem *chi = childList.at(i); |
|
2934 if (chi) { |
|
2935 QSet<QStandardItem *>::iterator it = itemsSet.find(chi); |
|
2936 if (it != itemsSet.end()) { |
|
2937 itemsSet.erase(it); |
|
2938 } |
|
2939 stack.push(chi); |
|
2940 } |
|
2941 } |
|
2942 } |
|
2943 } |
|
2944 |
|
2945 stack.reserve(itemsSet.count()); |
|
2946 foreach (QStandardItem *item, itemsSet) { |
|
2947 stack.push(item); |
|
2948 } |
|
2949 |
|
2950 //stream everything recursively |
|
2951 while (!stack.isEmpty()) { |
|
2952 QStandardItem *item = stack.pop(); |
|
2953 if(itemsSet.contains(item)) { //if the item is selection 'top-level', strem its position |
|
2954 stream << item->row() << item->column(); |
|
2955 } |
|
2956 if(item) { |
|
2957 stream << *item << item->columnCount() << item->d_ptr->children.count(); |
|
2958 stack += item->d_ptr->children; |
|
2959 } else { |
|
2960 QStandardItem dummy; |
|
2961 stream << dummy << 0 << 0; |
|
2962 } |
|
2963 } |
|
2964 |
|
2965 data->setData(format, encoded); |
|
2966 return data; |
|
2967 } |
|
2968 |
|
2969 |
|
2970 /* \internal |
|
2971 Used by QStandardItemModel::dropMimeData |
|
2972 stream out an item and his children |
|
2973 */ |
|
2974 void QStandardItemModelPrivate::decodeDataRecursive(QDataStream &stream, QStandardItem *item) |
|
2975 { |
|
2976 int colCount, childCount; |
|
2977 stream >> *item; |
|
2978 stream >> colCount >> childCount; |
|
2979 item->setColumnCount(colCount); |
|
2980 |
|
2981 int childPos = childCount; |
|
2982 |
|
2983 while(childPos > 0) { |
|
2984 childPos--; |
|
2985 QStandardItem *child = createItem(); |
|
2986 decodeDataRecursive(stream, child); |
|
2987 item->setChild( childPos / colCount, childPos % colCount, child); |
|
2988 } |
|
2989 } |
|
2990 |
|
2991 |
|
2992 /*! |
|
2993 \reimp |
|
2994 */ |
|
2995 bool QStandardItemModel::dropMimeData(const QMimeData *data, Qt::DropAction action, |
|
2996 int row, int column, const QModelIndex &parent) |
|
2997 { |
|
2998 Q_D(QStandardItemModel); |
|
2999 // check if the action is supported |
|
3000 if (!data || !(action == Qt::CopyAction || action == Qt::MoveAction)) |
|
3001 return false; |
|
3002 // check if the format is supported |
|
3003 QString format = QLatin1String("application/x-qstandarditemmodeldatalist"); |
|
3004 if (!data->hasFormat(format)) |
|
3005 return QAbstractItemModel::dropMimeData(data, action, row, column, parent); |
|
3006 |
|
3007 if (row > rowCount(parent)) |
|
3008 row = rowCount(parent); |
|
3009 if (row == -1) |
|
3010 row = rowCount(parent); |
|
3011 if (column == -1) |
|
3012 column = 0; |
|
3013 |
|
3014 // decode and insert |
|
3015 QByteArray encoded = data->data(format); |
|
3016 QDataStream stream(&encoded, QIODevice::ReadOnly); |
|
3017 |
|
3018 |
|
3019 //code based on QAbstractItemModel::decodeData |
|
3020 // adapted to work with QStandardItem |
|
3021 int top = INT_MAX; |
|
3022 int left = INT_MAX; |
|
3023 int bottom = 0; |
|
3024 int right = 0; |
|
3025 QVector<int> rows, columns; |
|
3026 QVector<QStandardItem *> items; |
|
3027 |
|
3028 while (!stream.atEnd()) { |
|
3029 int r, c; |
|
3030 QStandardItem *item = d->createItem(); |
|
3031 stream >> r >> c; |
|
3032 d->decodeDataRecursive(stream, item); |
|
3033 |
|
3034 rows.append(r); |
|
3035 columns.append(c); |
|
3036 items.append(item); |
|
3037 top = qMin(r, top); |
|
3038 left = qMin(c, left); |
|
3039 bottom = qMax(r, bottom); |
|
3040 right = qMax(c, right); |
|
3041 } |
|
3042 |
|
3043 // insert the dragged items into the table, use a bit array to avoid overwriting items, |
|
3044 // since items from different tables can have the same row and column |
|
3045 int dragRowCount = 0; |
|
3046 int dragColumnCount = right - left + 1; |
|
3047 |
|
3048 // Compute the number of continuous rows upon insertion and modify the rows to match |
|
3049 QVector<int> rowsToInsert(bottom + 1); |
|
3050 for (int i = 0; i < rows.count(); ++i) |
|
3051 rowsToInsert[rows.at(i)] = 1; |
|
3052 for (int i = 0; i < rowsToInsert.count(); ++i) { |
|
3053 if (rowsToInsert[i] == 1){ |
|
3054 rowsToInsert[i] = dragRowCount; |
|
3055 ++dragRowCount; |
|
3056 } |
|
3057 } |
|
3058 for (int i = 0; i < rows.count(); ++i) |
|
3059 rows[i] = top + rowsToInsert[rows[i]]; |
|
3060 |
|
3061 QBitArray isWrittenTo(dragRowCount * dragColumnCount); |
|
3062 |
|
3063 // make space in the table for the dropped data |
|
3064 int colCount = columnCount(parent); |
|
3065 if (colCount < dragColumnCount + column) { |
|
3066 insertColumns(colCount, dragColumnCount + column - colCount, parent); |
|
3067 colCount = columnCount(parent); |
|
3068 } |
|
3069 insertRows(row, dragRowCount, parent); |
|
3070 |
|
3071 row = qMax(0, row); |
|
3072 column = qMax(0, column); |
|
3073 |
|
3074 QStandardItem *parentItem = itemFromIndex (parent); |
|
3075 if (!parentItem) |
|
3076 parentItem = invisibleRootItem(); |
|
3077 |
|
3078 QVector<QPersistentModelIndex> newIndexes(items.size()); |
|
3079 // set the data in the table |
|
3080 for (int j = 0; j < items.size(); ++j) { |
|
3081 int relativeRow = rows.at(j) - top; |
|
3082 int relativeColumn = columns.at(j) - left; |
|
3083 int destinationRow = relativeRow + row; |
|
3084 int destinationColumn = relativeColumn + column; |
|
3085 int flat = (relativeRow * dragColumnCount) + relativeColumn; |
|
3086 // if the item was already written to, or we just can't fit it in the table, create a new row |
|
3087 if (destinationColumn >= colCount || isWrittenTo.testBit(flat)) { |
|
3088 destinationColumn = qBound(column, destinationColumn, colCount - 1); |
|
3089 destinationRow = row + dragRowCount; |
|
3090 insertRows(row + dragRowCount, 1, parent); |
|
3091 flat = (dragRowCount * dragColumnCount) + relativeColumn; |
|
3092 isWrittenTo.resize(++dragRowCount * dragColumnCount); |
|
3093 } |
|
3094 if (!isWrittenTo.testBit(flat)) { |
|
3095 newIndexes[j] = index(destinationRow, destinationColumn, parentItem->index()); |
|
3096 isWrittenTo.setBit(flat); |
|
3097 } |
|
3098 } |
|
3099 |
|
3100 for(int k = 0; k < newIndexes.size(); k++) { |
|
3101 if (newIndexes.at(k).isValid()) { |
|
3102 parentItem->setChild(newIndexes.at(k).row(), newIndexes.at(k).column(), items.at(k)); |
|
3103 } else { |
|
3104 delete items.at(k); |
|
3105 } |
|
3106 } |
|
3107 |
|
3108 return true; |
|
3109 } |
|
3110 |
|
3111 QT_END_NAMESPACE |
|
3112 |
|
3113 #include "moc_qstandarditemmodel.cpp" |
|
3114 |
|
3115 #endif // QT_NO_STANDARDITEMMODEL |