7#include <private/qlistview_p.h>
8#include <private/qwidgetitemdata_p.h>
9#include <private/qlistwidget_p.h>
15class QListWidgetMimeData :
public QMimeData
19 QList<QListWidgetItem*> items;
22QT_BEGIN_INCLUDE_NAMESPACE
23#include "qlistwidget.moc"
24QT_END_INCLUDE_NAMESPACE
26QListModel::QListModel(QListWidget *parent)
27 : QAbstractListModel(parent)
31QListModel::~QListModel()
36void QListModel::clear()
39 for (
int i = 0; i < items.size(); ++i) {
41 items.at(i)->d->theid = -1;
42 items.at(i)->view =
nullptr;
50QListWidgetItem *QListModel::at(
int row)
const
52 return items.value(row);
55void QListModel::remove(QListWidgetItem *item)
59 int row = items.indexOf(item);
61 beginRemoveRows(QModelIndex(), row, row);
62 items.at(row)->d->theid = -1;
63 items.at(row)->view =
nullptr;
68void QListModel::insert(
int row, QListWidgetItem *item)
73 item->view =
this->view();
74 if (item->view && item->view->isSortingEnabled()) {
76 QList<QListWidgetItem*>::iterator it;
77 it = sortedInsertionIterator(items.begin(), items.end(),
78 item->view->sortOrder(), item);
79 row = qMax<qsizetype>(it - items.begin(), 0);
83 else if (row > items.size())
86 beginInsertRows(QModelIndex(), row, row);
87 items.insert(row, item);
92void QListModel::insert(
int row,
const QStringList &labels)
94 const int count = labels.size();
97 QListWidget *view =
this->view();
98 if (view && view->isSortingEnabled()) {
100 for (
int i = 0; i < count; ++i) {
101 QListWidgetItem *item =
new QListWidgetItem(labels.at(i));
107 else if (row > items.size())
109 beginInsertRows(QModelIndex(), row, row + count - 1);
110 for (
int i = 0; i < count; ++i) {
111 QListWidgetItem *item =
new QListWidgetItem(labels.at(i));
112 item->d->theid = row;
113 item->view =
this->view();
114 items.insert(row++, item);
120QListWidgetItem *QListModel::take(
int row)
122 if (row < 0 || row >= items.size())
125 beginRemoveRows(QModelIndex(), row, row);
126 items.at(row)->d->theid = -1;
127 items.at(row)->view =
nullptr;
128 QListWidgetItem *item = items.takeAt(row);
133void QListModel::move(
int srcRow,
int dstRow)
136 || srcRow < 0 || srcRow >= items.size()
137 || dstRow < 0 || dstRow > items.size())
140 if (!beginMoveRows(QModelIndex(), srcRow, srcRow, QModelIndex(), dstRow))
144 items.move(srcRow, dstRow);
148int QListModel::rowCount(
const QModelIndex &parent)
const
150 return parent.isValid() ? 0 : items.size();
153QModelIndex QListModel::index(
const QListWidgetItem *item_)
const
155 QListWidgetItem *item =
const_cast<QListWidgetItem *>(item_);
156 if (!item || !item->view ||
static_cast<
const QListModel *>(item->view->model()) !=
this
158 return QModelIndex();
160 const int theid = item->d->theid;
161 if (theid >= 0 && theid < items.size() && items.at(theid) == item) {
164 row = items.lastIndexOf(item);
166 return QModelIndex();
167 item->d->theid = row;
169 return createIndex(row, 0, item);
172QModelIndex QListModel::index(
int row,
int column,
const QModelIndex &parent)
const
174 if (hasIndex(row, column, parent))
175 return createIndex(row, column, items.at(row));
176 return QModelIndex();
179QVariant QListModel::data(
const QModelIndex &index,
int role)
const
181 if (!index.isValid() || index.row() >= items.size())
183 return items.at(index.row())->data(role);
186bool QListModel::setData(
const QModelIndex &index,
const QVariant &value,
int role)
188 if (!index.isValid() || index.row() >= items.size())
190 items.at(index.row())->setData(role, value);
194bool QListModel::clearItemData(
const QModelIndex &index)
196 if (!checkIndex(index, CheckIndexOption::IndexIsValid))
198 QListWidgetItem *item = items.at(index.row());
199 const auto beginIter = item->d->values.cbegin();
200 const auto endIter = item->d->values.cend();
201 if (std::all_of(beginIter, endIter, [](
const QWidgetItemData& data) ->
bool {
return !data.value.isValid(); }))
203 item->d->values.clear();
204 emit dataChanged(index, index, QList<
int> {});
208QMap<
int, QVariant> QListModel::itemData(
const QModelIndex &index)
const
210 QMap<
int, QVariant> roles;
211 if (!index.isValid() || index.row() >= items.size())
213 QListWidgetItem *itm = items.at(index.row());
214 for (
int i = 0; i < itm->d->values.size(); ++i) {
215 roles.insert(itm->d->values.at(i).role,
216 itm->d->values.at(i).value);
221bool QListModel::insertRows(
int row,
int count,
const QModelIndex &parent)
223 if (count < 1 || row < 0 || row > rowCount() || parent.isValid())
226 beginInsertRows(QModelIndex(), row, row + count - 1);
227 QListWidget *view =
this->view();
228 QListWidgetItem *itm =
nullptr;
230 for (
int r = row; r < row + count; ++r) {
231 itm =
new QListWidgetItem;
234 items.insert(r, itm);
241bool QListModel::removeRows(
int row,
int count,
const QModelIndex &parent)
243 if (count < 1 || row < 0 || (row + count) > rowCount() || parent.isValid())
246 beginRemoveRows(QModelIndex(), row, row + count - 1);
247 QListWidgetItem *itm =
nullptr;
248 for (
int r = row; r < row + count; ++r) {
249 itm = items.takeAt(row);
259
260
261
262
265
266
267
268bool QListModel::moveRows(
const QModelIndex &sourceParent,
int sourceRow,
int count,
const QModelIndex &destinationParent,
int destinationChild)
271 || sourceRow + count - 1 >= rowCount(sourceParent)
272 || destinationChild < 0
273 || destinationChild > rowCount(destinationParent)
274 || sourceRow == destinationChild
275 || sourceRow == destinationChild - 1
277 || sourceParent.isValid()
278 || destinationParent.isValid()) {
281 if (!beginMoveRows(QModelIndex(), sourceRow, sourceRow + count - 1, QModelIndex(), destinationChild))
284 int fromRow = sourceRow;
285 if (destinationChild < sourceRow)
286 fromRow += count - 1;
290 items.move(fromRow, destinationChild);
295Qt::ItemFlags QListModel::flags(
const QModelIndex &index)
const
297 if (!index.isValid() || index.row() >= items.size() || index.model() !=
this)
298 return Qt::ItemIsDropEnabled;
299 return items.at(index.row())->flags();
302void QListModel::sort(
int column, Qt::SortOrder order)
307 emit layoutAboutToBeChanged({}, QAbstractItemModel::VerticalSortHint);
309 QList<std::pair<QListWidgetItem *,
int>> sorting(items.size());
310 for (
int i = 0; i < items.size(); ++i) {
311 QListWidgetItem *item = items.at(i);
312 sorting[i].first = item;
313 sorting[i].second = i;
316 const auto compare = (order == Qt::AscendingOrder ? &itemLessThan : &itemGreaterThan);
317 std::stable_sort(sorting.begin(), sorting.end(), compare);
318 QModelIndexList fromIndexes;
319 QModelIndexList toIndexes;
320 const int sortingCount = sorting.size();
321 fromIndexes.reserve(sortingCount);
322 toIndexes.reserve(sortingCount);
323 for (
int r = 0; r < sortingCount; ++r) {
324 QListWidgetItem *item = sorting.at(r).first;
325 toIndexes.append(createIndex(r, 0, item));
326 fromIndexes.append(createIndex(sorting.at(r).second, 0, sorting.at(r).first));
327 items[r] = sorting.at(r).first;
329 changePersistentIndexList(fromIndexes, toIndexes);
331 emit layoutChanged({}, QAbstractItemModel::VerticalSortHint);
335
336
337
338void QListModel::ensureSorted(
int column, Qt::SortOrder order,
int start,
int end)
343 const auto compareLt = [](
const QListWidgetItem *left,
const QListWidgetItem *right) ->
bool {
344 return *left < *right;
347 const auto compareGt = [](
const QListWidgetItem *left,
const QListWidgetItem *right) ->
bool {
348 return *right < *left;
352
353
354
355
356
357
358 const auto beginChangedIterator = items.constBegin() + qMax(start - 1, 0);
359 const auto endChangedIterator = items.constBegin() + qMin(end + 2, items.size());
360 const bool needsSorting = !std::is_sorted(beginChangedIterator, endChangedIterator,
361 order == Qt::AscendingOrder ? compareLt : compareGt);
367bool QListModel::itemLessThan(
const std::pair<QListWidgetItem*,
int> &left,
368 const std::pair<QListWidgetItem*,
int> &right)
370 return (*left.first) < (*right.first);
373bool QListModel::itemGreaterThan(
const std::pair<QListWidgetItem*,
int> &left,
374 const std::pair<QListWidgetItem*,
int> &right)
376 return (*right.first) < (*left.first);
379QList<QListWidgetItem*>::iterator QListModel::sortedInsertionIterator(
380 const QList<QListWidgetItem*>::iterator &begin,
381 const QList<QListWidgetItem*>::iterator &end,
382 Qt::SortOrder order, QListWidgetItem *item)
384 if (order == Qt::AscendingOrder)
385 return std::lower_bound(begin, end, item, QListModelLessThan());
386 return std::lower_bound(begin, end, item, QListModelGreaterThan());
389void QListModel::itemChanged(QListWidgetItem *item,
const QList<
int> &roles)
391 const QModelIndex idx = index(item);
392 emit dataChanged(idx, idx, roles);
395QStringList QListModel::mimeTypes()
const
397 const QListWidget *view =
this->view();
399 return view->mimeTypes();
403QMimeData *QListModel::internalMimeData()
const
405 return QAbstractItemModel::mimeData(cachedIndexes);
408QMimeData *QListModel::mimeData(
const QModelIndexList &indexes)
const
410 QList<QListWidgetItem*> itemlist;
411 const int indexesCount = indexes.size();
412 itemlist.reserve(indexesCount);
413 for (
int i = 0; i < indexesCount; ++i)
414 itemlist << at(indexes.at(i).row());
416 cachedIndexes = indexes;
417 QMimeData *mimeData = view()->mimeData(itemlist);
418 cachedIndexes.clear();
422#if QT_CONFIG(draganddrop)
423bool QListModel::dropMimeData(
const QMimeData *data, Qt::DropAction action,
424 int row,
int column,
const QModelIndex &index)
432 return view()->dropMimeData(row, data, action);
435Qt::DropActions QListModel::supportedDropActions()
const
437 return view()->supportedDropActions();
440Qt::DropActions QListModel::supportedDragActions()
const
442 return view()->supportedDragActions();
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
501
502
503
504
505
506
507
508
509
510
511
512
513
516
517
518
519
522
523
524
525
528
529
530
531
532
533
536
537
538
539
540
541
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559QListWidgetItem::QListWidgetItem(QListWidget *listview,
int type)
560 : rtti(type), view(listview), d(
new QListWidgetItemPrivate(
this)),
561 itemFlags(Qt::ItemIsSelectable
562 |Qt::ItemIsUserCheckable
564 |Qt::ItemIsDragEnabled)
566 if (QListModel *model = listModel())
567 model->insert(model->rowCount(),
this);
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586QListWidgetItem::QListWidgetItem(
const QString &text, QListWidget *listview,
int type)
587 : rtti(type), view(listview), d(
new QListWidgetItemPrivate(
this)),
588 itemFlags(Qt::ItemIsSelectable
589 |Qt::ItemIsUserCheckable
591 |Qt::ItemIsDragEnabled)
593 QListModel *model = listModel();
595 QSignalBlocker b(view);
596 QSignalBlocker bm(model);
597 setData(Qt::DisplayRole, text);
600 model->insert(model->rowCount(),
this);
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620QListWidgetItem::QListWidgetItem(
const QIcon &icon,
const QString &text,
621 QListWidget *listview,
int type)
622 : rtti(type), view(listview), d(
new QListWidgetItemPrivate(
this)),
623 itemFlags(Qt::ItemIsSelectable
624 |Qt::ItemIsUserCheckable
626 |Qt::ItemIsDragEnabled)
628 QListModel *model = listModel();
630 QSignalBlocker b(view);
631 QSignalBlocker bm(model);
632 setData(Qt::DisplayRole, text);
633 setData(Qt::DecorationRole, icon);
636 model->insert(model->rowCount(),
this);
640
641
642QListWidgetItem::~QListWidgetItem()
644 if (QListModel *model = listModel())
650
651
652QListWidgetItem *QListWidgetItem::clone()
const
654 return new QListWidgetItem(*
this);
658
659
660
661
662
663
664
665
666void QListWidgetItem::setData(
int role,
const QVariant &value)
669 role = (role == Qt::EditRole ? Qt::DisplayRole : role);
670 for (
int i = 0; i < d->values.size(); ++i) {
671 if (d->values.at(i).role == role) {
672 if (d->values.at(i).value == value)
674 d->values[i].value = value;
680 d->values.append(QWidgetItemData(role, value));
681 if (QListModel *model = listModel()) {
682 const QList<
int> roles((role == Qt::DisplayRole)
683 ? QList<
int>({ Qt::DisplayRole, Qt::EditRole })
684 : QList<
int>({ role }));
685 model->itemChanged(
this, roles);
690
691
692
693
694
695QVariant QListWidgetItem::data(
int role)
const
697 role = (role == Qt::EditRole ? Qt::DisplayRole : role);
698 for (
int i = 0; i < d->values.size(); ++i)
699 if (d->values.at(i).role == role)
700 return d->values.at(i).value;
705
706
707
708bool QListWidgetItem::operator<(
const QListWidgetItem &other)
const
710 const QVariant v1 = data(Qt::DisplayRole), v2 = other.data(Qt::DisplayRole);
711 return QAbstractItemModelPrivate::variantLessThan(v1, v2);
714#ifndef QT_NO_DATASTREAM
717
718
719
720
721void QListWidgetItem::read(QDataStream &in)
727
728
729
730
731void QListWidgetItem::write(QDataStream &out)
const
738
739
740
741
742
743
744
745QListWidgetItem::QListWidgetItem(
const QListWidgetItem &other)
746 : rtti(Type), view(
nullptr),
747 d(
new QListWidgetItemPrivate(
this)),
748 itemFlags(other.itemFlags)
750 d->values = other.d->values;
754
755
756
757
758
759
760
761QListWidgetItem &QListWidgetItem::operator=(
const QListWidgetItem &other)
763 d->values = other.d->values;
764 itemFlags = other.itemFlags;
769
770
771
772QListModel *QListWidgetItem::listModel()
const
774 return (view ? qobject_cast<QListModel*>(view->model()) :
nullptr);
777#ifndef QT_NO_DATASTREAM
780
781
782
783
784
785
786
787
795
796
797
798
799
800
801
802
812
813
814
815
818
819
820
821
822
823
826
827
828
829
830
831
834
835
836
837
838
839
842
843
844
845
846
847
850
851
852
853
854
855
858
859
860
861
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
885
886
887
888
889
890
893
894
895
896
897
898
901
902
903
904
905
906
909
910
911
912
915
916
917
918
919
920
923
924
925
926
927
928
929void QListWidgetItem::setSelected(
bool select)
931 const QListModel *model = listModel();
932 if (!model || !view->selectionModel())
934 const QAbstractItemView::SelectionMode selectionMode = view->selectionMode();
935 if (selectionMode == QAbstractItemView::NoSelection)
937 const QModelIndex index = model->index(
this);
938 if (selectionMode == QAbstractItemView::SingleSelection)
939 view->selectionModel()->select(index, select
940 ? QItemSelectionModel::ClearAndSelect
941 : QItemSelectionModel::Deselect);
943 view->selectionModel()->select(index, select
944 ? QItemSelectionModel::Select
945 : QItemSelectionModel::Deselect);
949
950
951
952
953
954
955bool QListWidgetItem::isSelected()
const
957 const QListModel *model = listModel();
958 if (!model || !view->selectionModel())
960 const QModelIndex index = model->index(
this);
961 return view->selectionModel()->isSelected(index);
965
966
967
968
969
970
971void QListWidgetItem::setFlags(Qt::ItemFlags aflags)
974 if (QListModel *model = listModel())
975 model->itemChanged(
this);
980
981
982
983
984
985
988
989
990
991
992
993
996
997
998
999
1000
1001
1002
1003
1006
1007
1008
1009
1010
1011
1014
1015
1016
1017
1018
1019
1020
1023
1024
1025
1026
1029
1030
1031
1032
1033
1034
1035
1036
1039
1040
1041
1042
1043
1044
1047
1048
1049
1052
1053
1054
1055
1056
1057
1058
1059
1062
1063
1064
1065
1066
1067
1068
1069
1072
1073
1074
1075
1076
1077
1079void QListWidgetPrivate::setup()
1082 q->QListView::setModel(
new QListModel(q));
1085 QObjectPrivate::connect(q, &QListWidget::pressed,
1086 this, &QListWidgetPrivate::emitItemPressed),
1087 QObjectPrivate::connect(q, &QListWidget::clicked,
1088 this, &QListWidgetPrivate::emitItemClicked),
1089 QObjectPrivate::connect(q, &QListWidget::doubleClicked,
1090 this, &QListWidgetPrivate::emitItemDoubleClicked),
1091 QObjectPrivate::connect(q, &QListWidget::activated,
1092 this, &QListWidgetPrivate::emitItemActivated),
1093 QObjectPrivate::connect(q, &QListWidget::entered,
1094 this, &QListWidgetPrivate::emitItemEntered),
1095 QObjectPrivate::connect(model, &QAbstractItemModel::dataChanged,
1096 this, &QListWidgetPrivate::emitItemChanged),
1097 QObjectPrivate::connect(model, &QAbstractItemModel::dataChanged,
1098 this, &QListWidgetPrivate::dataChanged),
1099 QObjectPrivate::connect(model, &QAbstractItemModel::columnsRemoved,
1100 this, &QListWidgetPrivate::sort)
1104void QListWidgetPrivate::clearConnections()
1106 for (
const QMetaObject::Connection &connection : connections)
1107 QObject::disconnect(connection);
1108 for (
const QMetaObject::Connection &connection : selectionModelConnections)
1109 QObject::disconnect(connection);
1112void QListWidgetPrivate::emitItemPressed(
const QModelIndex &index)
1115 emit q->itemPressed(listModel()->at(index.row()));
1118void QListWidgetPrivate::emitItemClicked(
const QModelIndex &index)
1121 emit q->itemClicked(listModel()->at(index.row()));
1124void QListWidgetPrivate::emitItemDoubleClicked(
const QModelIndex &index)
1127 emit q->itemDoubleClicked(listModel()->at(index.row()));
1130void QListWidgetPrivate::emitItemActivated(
const QModelIndex &index)
1133 emit q->itemActivated(listModel()->at(index.row()));
1136void QListWidgetPrivate::emitItemEntered(
const QModelIndex &index)
1139 emit q->itemEntered(listModel()->at(index.row()));
1142void QListWidgetPrivate::emitItemChanged(
const QModelIndex &index)
1145 emit q->itemChanged(listModel()->at(index.row()));
1148void QListWidgetPrivate::emitCurrentItemChanged(
const QModelIndex ¤t,
1149 const QModelIndex &previous)
1152 QPersistentModelIndex persistentCurrent = current;
1153 QListWidgetItem *currentItem = listModel()->at(persistentCurrent.row());
1154 emit q->currentItemChanged(currentItem, listModel()->at(previous.row()));
1158 if (!persistentCurrent.isValid()) {
1159 currentItem =
nullptr;
1162 emit q->currentTextChanged(currentItem ? currentItem->text() : QString());
1163 emit q->currentRowChanged(persistentCurrent.row());
1166void QListWidgetPrivate::sort()
1169 model->sort(0, sortOrder);
1172void QListWidgetPrivate::dataChanged(
const QModelIndex &topLeft,
1173 const QModelIndex &bottomRight)
1175 if (sortingEnabled && topLeft.isValid() && bottomRight.isValid())
1176 listModel()->ensureSorted(topLeft.column(), sortOrder,
1177 topLeft.row(), bottomRight.row());
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1248
1249
1250
1251
1254
1255
1256
1257
1258
1259
1262
1263
1264
1265
1266
1267
1268
1271
1272
1273
1274
1275
1276
1277
1280
1281
1282
1283
1284
1285
1286
1289
1290
1291
1292
1293
1294
1295
1296
1299
1300
1301
1302
1303
1304
1305
1306
1309
1310
1311
1312
1315
1316
1317
1318
1319
1320
1321
1324
1325
1326
1327
1328
1329
1330
1333
1334
1335
1336
1337
1338
1339
1342
1343
1344
1345
1346
1347
1350
1351
1352
1353
1354
1355
1356
1357
1358
1361
1362
1364QListWidget::QListWidget(QWidget *parent)
1365 : QListView(*
new QListWidgetPrivate(), parent)
1372
1373
1375QListWidget::~QListWidget()
1378 d->clearConnections();
1382
1383
1385void QListWidget::setSelectionModel(QItemSelectionModel *selectionModel)
1389 for (
const QMetaObject::Connection &connection : d->selectionModelConnections)
1390 disconnect(connection);
1392 QListView::setSelectionModel(selectionModel);
1394 if (d->selectionModel) {
1395 d->selectionModelConnections = {
1396 QObjectPrivate::connect(d->selectionModel, &QItemSelectionModel::currentChanged,
1397 d, &QListWidgetPrivate::emitCurrentItemChanged),
1398 QObject::connect(d->selectionModel, &QItemSelectionModel::selectionChanged,
1399 this, &QListWidget::itemSelectionChanged)
1405
1406
1407
1408
1409
1411QListWidgetItem *QListWidget::item(
int row)
const
1413 Q_D(
const QListWidget);
1414 if (row < 0 || row >= d->model->rowCount())
1416 return d->listModel()->at(row);
1420
1421
1422
1423
1425int QListWidget::row(
const QListWidgetItem *item)
const
1427 Q_D(
const QListWidget);
1428 return d->listModel()->index(
const_cast<QListWidgetItem*>(item)).row();
1433
1434
1435
1436
1438void QListWidget::insertItem(
int row, QListWidgetItem *item)
1441 if (item && !item->view)
1442 d->listModel()->insert(row, item);
1446
1447
1448
1449
1450
1452void QListWidget::insertItem(
int row,
const QString &label)
1455 d->listModel()->insert(row,
new QListWidgetItem(label));
1459
1460
1461
1462
1463
1465void QListWidget::insertItems(
int row,
const QStringList &labels)
1468 d->listModel()->insert(row, labels);
1472
1473
1474
1475
1476
1477
1478
1479
1481QListWidgetItem *QListWidget::takeItem(
int row)
1484 if (row < 0 || row >= d->model->rowCount())
1486 return d->listModel()->take(row);
1490
1491
1492
1494int QListWidget::count()
const
1496 Q_D(
const QListWidget);
1497 return d->model->rowCount();
1501
1502
1503QListWidgetItem *QListWidget::currentItem()
const
1505 Q_D(
const QListWidget);
1506 return d->listModel()->at(currentIndex().row());
1511
1512
1513
1514
1515
1516void QListWidget::setCurrentItem(QListWidgetItem *item)
1518 setCurrentRow(row(item));
1522
1523
1524void QListWidget::setCurrentItem(QListWidgetItem *item, QItemSelectionModel::SelectionFlags command)
1526 setCurrentRow(row(item), command);
1530
1531
1532
1533
1534
1536int QListWidget::currentRow()
const
1538 return currentIndex().row();
1541void QListWidget::setCurrentRow(
int row)
1544 QModelIndex index = d->listModel()->index(row);
1545 if (d->selectionMode == SingleSelection)
1546 selectionModel()->setCurrentIndex(index, QItemSelectionModel::ClearAndSelect);
1547 else if (d->selectionMode == NoSelection)
1548 selectionModel()->setCurrentIndex(index, QItemSelectionModel::NoUpdate);
1550 selectionModel()->setCurrentIndex(index, QItemSelectionModel::SelectCurrent);
1554
1555
1556void QListWidget::setCurrentRow(
int row, QItemSelectionModel::SelectionFlags command)
1559 d->selectionModel->setCurrentIndex(d->listModel()->index(row), command);
1563
1564
1565
1566
1567QListWidgetItem *QListWidget::itemAt(
const QPoint &p)
const
1569 Q_D(
const QListWidget);
1570 return d->listModel()->at(indexAt(p).row());
1575
1576
1577
1578
1579
1580
1581
1582
1586
1587
1588QRect QListWidget::visualItemRect(
const QListWidgetItem *item)
const
1590 Q_D(
const QListWidget);
1591 QModelIndex index = d->listModel()->index(
const_cast<QListWidgetItem*>(item));
1592 return visualRect(index);
1596
1597
1598void QListWidget::sortItems(Qt::SortOrder order)
1601 d->sortOrder = order;
1602 d->listModel()->sort(0, order);
1606
1607
1608
1609
1610
1611
1612
1613
1614void QListWidget::setSortingEnabled(
bool enable)
1617 d->sortingEnabled = enable;
1620bool QListWidget::isSortingEnabled()
const
1622 Q_D(
const QListWidget);
1623 return d->sortingEnabled;
1627
1628
1629Qt::SortOrder QListWidget::sortOrder()
const
1631 Q_D(
const QListWidget);
1632 return d->sortOrder;
1636
1637
1639void QListWidget::editItem(QListWidgetItem *item)
1642 edit(d->listModel()->index(item));
1646
1647
1648
1649
1650
1651void QListWidget::openPersistentEditor(QListWidgetItem *item)
1654 QModelIndex index = d->listModel()->index(item);
1655 QAbstractItemView::openPersistentEditor(index);
1659
1660
1661
1662
1663void QListWidget::closePersistentEditor(QListWidgetItem *item)
1666 QModelIndex index = d->listModel()->index(item);
1667 QAbstractItemView::closePersistentEditor(index);
1671
1672
1673
1674
1675
1676
1677bool QListWidget::isPersistentEditorOpen(QListWidgetItem *item)
const
1679 Q_D(
const QListWidget);
1680 const QModelIndex index = d->listModel()->index(item);
1681 return QAbstractItemView::isPersistentEditorOpen(index);
1685
1686
1687
1688
1689QWidget *QListWidget::itemWidget(QListWidgetItem *item)
const
1691 Q_D(
const QListWidget);
1692 QModelIndex index = d->listModel()->index(item);
1693 return QAbstractItemView::indexWidget(index);
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708void QListWidget::setItemWidget(QListWidgetItem *item, QWidget *widget)
1711 QModelIndex index = d->listModel()->index(item);
1712 QAbstractItemView::setIndexWidget(index, widget);
1716
1717
1719QList<QListWidgetItem*> QListWidget::selectedItems()
const
1721 Q_D(
const QListWidget);
1722 QModelIndexList indexes = selectionModel()->selectedIndexes();
1723 QList<QListWidgetItem*> items;
1724 const int numIndexes = indexes.size();
1725 items.reserve(numIndexes);
1726 for (
int i = 0; i < numIndexes; ++i)
1727 items.append(d->listModel()->at(indexes.at(i).row()));
1732
1733
1734
1736QList<QListWidgetItem*> QListWidget::findItems(
const QString &text, Qt::MatchFlags flags)
const
1738 Q_D(
const QListWidget);
1739 QModelIndexList indexes = d->listModel()->match(model()->index(0, 0, QModelIndex()),
1740 Qt::DisplayRole, text, -1, flags);
1741 QList<QListWidgetItem*> items;
1742 const int indexesSize = indexes.size();
1743 items.reserve(indexesSize);
1744 for (
int i = 0; i < indexesSize; ++i)
1745 items.append(d->listModel()->at(indexes.at(i).row()));
1750
1751
1752
1753
1755void QListWidget::scrollToItem(
const QListWidgetItem *item, QAbstractItemView::ScrollHint hint)
1758 QModelIndex index = d->listModel()->index(
const_cast<QListWidgetItem*>(item));
1759 QListView::scrollTo(index, hint);
1763
1764
1765
1766
1767void QListWidget::clear()
1770 selectionModel()->clear();
1771 d->listModel()->clear();
1775
1776
1777
1778
1779
1780QStringList QListWidget::mimeTypes()
const
1782 return d_func()->listModel()->QAbstractListModel::mimeTypes();
1786
1787
1788
1789
1790
1791
1792
1793QMimeData *QListWidget::mimeData(
const QList<QListWidgetItem *> &items)
const
1795 Q_D(
const QListWidget);
1797 QModelIndexList &cachedIndexes = d->listModel()->cachedIndexes;
1800 if (cachedIndexes.isEmpty()) {
1801 cachedIndexes.reserve(items.size());
1802 for (QListWidgetItem *item : items)
1803 cachedIndexes << indexFromItem(item);
1805 QMimeData *result = d->listModel()->internalMimeData();
1807 cachedIndexes.clear();
1811 return d->listModel()->internalMimeData();
1814#if QT_CONFIG(draganddrop)
1817
1818
1819
1820
1821
1822
1823bool QListWidget::dropMimeData(
int index,
const QMimeData *data, Qt::DropAction action)
1828 if (dropIndicatorPosition() == QAbstractItemView::OnItem) {
1830 idx = model()->index(row, column);
1834 return d_func()->listModel()->QAbstractListModel::dropMimeData(data, action , row, column, idx);
1838void QListWidget::dropEvent(QDropEvent *event)
1840 QListView::dropEvent(event);
1844
1845
1846
1847
1848Qt::DropActions QListWidget::supportedDropActions()
const
1850 Q_D(
const QListWidget);
1851 return d->listModel()->QAbstractListModel::supportedDropActions() | Qt::MoveAction;
1855
1856
1857
1858
1859
1860
1861Qt::DropActions QListWidget::supportedDragActions()
const
1863 Q_D(
const QListWidget);
1864 return d->supportedDragActions.value_or(supportedDropActions());
1867void QListWidget::setSupportedDragActions(Qt::DropActions actions)
1870 d->supportedDragActions = actions;
1876
1877
1878
1879
1880QList<QListWidgetItem*> QListWidget::items(
const QMimeData *data)
const
1882 const QListWidgetMimeData *lwd = qobject_cast<
const QListWidgetMimeData*>(data);
1885 return QList<QListWidgetItem*>();
1889
1890
1891
1892
1894QModelIndex QListWidget::indexFromItem(
const QListWidgetItem *item)
const
1896 Q_D(
const QListWidget);
1897 return d->listModel()->index(item);
1901
1902
1904QListWidgetItem *QListWidget::itemFromIndex(
const QModelIndex &index)
const
1906 Q_D(
const QListWidget);
1907 if (d->isIndexValid(index))
1908 return d->listModel()->at(index.row());
1913
1914
1915void QListWidget::setModel(QAbstractItemModel * )
1917 Q_ASSERT(!
"QListWidget::setModel() - Changing the model of the QListWidget is not allowed.");
1921
1922
1923bool QListWidget::event(QEvent *e)
1925 return QListView::event(e);
1930#include "moc_qlistwidget.cpp"
1931#include "moc_qlistwidget_p.cpp"
QDataStream & operator<<(QDataStream &stream, const QImage &image)
[0]
QDataStream & operator>>(QDataStream &stream, QImage &image)