8#if QT_CONFIG(columnview)
10#include "qcolumnview_p.h"
11#include "qcolumnviewgrip_p.h"
14#include <qabstractitemdelegate.h>
15#include <qscrollbar.h>
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
44
45
46
47
48
49QColumnView::QColumnView(QWidget * parent)
50: QAbstractItemView(*
new QColumnViewPrivate, parent)
57
58
59QColumnView::QColumnView(QColumnViewPrivate & dd, QWidget * parent)
60: QAbstractItemView(dd, parent)
66void QColumnViewPrivate::initialize()
69 q->setTextElideMode(Qt::ElideMiddle);
70#if QT_CONFIG(animation)
72 QObjectPrivate::connect(¤tAnimation, &QPropertyAnimation::finished,
73 this, &QColumnViewPrivate::changeCurrentColumn);
74 currentAnimation.setTargetObject(hbar);
75 currentAnimation.setPropertyName(
"value");
76 currentAnimation.setEasingCurve(QEasingCurve::InOutQuad);
79 q->setItemDelegate(
new QColumnViewDelegate(q));
82void QColumnViewPrivate::clearConnections()
84#if QT_CONFIG(animation)
85 QObject::disconnect(animationConnection);
87 for (
const QMetaObject::Connection &connection : gripConnections)
88 QObject::disconnect(connection);
89 const auto copy = viewConnections;
90 for (
auto it = copy.keyBegin(); it != copy.keyEnd(); ++it)
96
97
98QColumnView::~QColumnView()
101 d->clearConnections();
105
106
107
108
109
110
111
112void QColumnView::setResizeGripsVisible(
bool visible)
115 if (d->showResizeGrips == visible)
117 d->showResizeGrips = visible;
118 d->gripConnections.clear();
119 for (QAbstractItemView *view : std::as_const(d->columns)) {
121 QColumnViewGrip *grip =
new QColumnViewGrip(view);
122 view->setCornerWidget(grip);
123 d->gripConnections.push_back(
124 QObjectPrivate::connect(grip, &QColumnViewGrip::gripMoved,
125 d, &QColumnViewPrivate::gripMoved)
128 QWidget *widget = view->cornerWidget();
129 view->setCornerWidget(
nullptr);
130 widget->deleteLater();
135bool QColumnView::resizeGripsVisible()
const
137 Q_D(
const QColumnView);
138 return d->showResizeGrips;
142
143
144
145
146
147
148void QColumnView::setPreviewColumnVisible(
bool visible)
151 if (d->showPreviewColumn == visible)
153 d->showPreviewColumn = visible;
154 if (d->columns.constLast() == d->previewColumn)
155 d->columns.constLast()->setVisible(d->showPreviewColumn);
158bool QColumnView::previewColumnVisible()
const
160 Q_D(
const QColumnView);
161 return d->showPreviewColumn;
165
166
167void QColumnView::setModel(QAbstractItemModel *model)
170 if (model == d->model)
173 QAbstractItemView::setModel(model);
177
178
179void QColumnView::setRootIndex(
const QModelIndex &index)
186 Q_ASSERT(d->columns.size() == 0);
188 QAbstractItemView *view = d->createColumn(index,
true);
189 if (view->selectionModel())
190 view->selectionModel()->deleteLater();
192 view->setSelectionModel(selectionModel());
194 QAbstractItemView::setRootIndex(index);
195 d->updateScrollbars();
199
200
201bool QColumnView::isIndexHidden(
const QModelIndex &index)
const
208
209
210QModelIndex QColumnView::indexAt(
const QPoint &point)
const
212 Q_D(
const QColumnView);
213 for (
int i = 0; i < d->columns.size(); ++i) {
214 QPoint topLeft = d->columns.at(i)->frameGeometry().topLeft();
215 QPoint adjustedPoint(point.x() - topLeft.x(), point.y() - topLeft.y());
216 QModelIndex index = d->columns.at(i)->indexAt(adjustedPoint);
220 return QModelIndex();
224
225
226QRect QColumnView::visualRect(
const QModelIndex &index)
const
228 if (!index.isValid())
231 Q_D(
const QColumnView);
232 for (
int i = 0; i < d->columns.size(); ++i) {
233 QRect rect = d->columns.at(i)->visualRect(index);
234 if (!rect.isNull()) {
235 rect.translate(d->columns.at(i)->frameGeometry().topLeft());
243
244
245void QColumnView::scrollContentsBy(
int dx,
int dy)
248 if (d->columns.isEmpty() || dx == 0)
251 dx = isRightToLeft() ? -dx : dx;
252 for (
int i = 0; i < d->columns.size(); ++i)
253 d->columns.at(i)->move(d->columns.at(i)->x() + dx, 0);
255 QAbstractItemView::scrollContentsBy(dx, dy);
259
260
261void QColumnView::scrollTo(
const QModelIndex &index, ScrollHint hint)
265 if (!index.isValid() || d->columns.isEmpty())
268#if QT_CONFIG(animation)
269 if (d->currentAnimation.state() == QPropertyAnimation::Running)
272 d->currentAnimation.stop();
276 d->closeColumns(index,
true);
278 QModelIndex indexParent = index.parent();
280 int currentColumn = 0;
282 while (currentColumn < d->columns.size()) {
283 if (indexParent == d->columns.at(currentColumn)->rootIndex())
285 leftEdge += d->columns.at(currentColumn)->width();
290 if (currentColumn == d->columns.size())
293 int indexColumn = currentColumn;
295 int visibleWidth = d->columns.at(currentColumn)->width();
297 if (currentColumn + 1 < d->columns.size()) {
299 visibleWidth += d->columns.at(currentColumn)->width();
302 int rightEdge = leftEdge + visibleWidth;
303 if (isRightToLeft()) {
304 leftEdge = viewport()->width() - leftEdge;
305 rightEdge = leftEdge - visibleWidth;
306 qSwap(rightEdge, leftEdge);
310 if (leftEdge > -horizontalOffset()
311 && rightEdge <= ( -horizontalOffset() + viewport()->size().width())) {
312 d->columns.at(indexColumn)->scrollTo(index);
313 d->changeCurrentColumn();
317 int newScrollbarValue = 0;
318 if (isRightToLeft()) {
321 newScrollbarValue = viewport()->size().width() - leftEdge;
324 newScrollbarValue = rightEdge + horizontalOffset();
327 if (leftEdge > -horizontalOffset()) {
329 newScrollbarValue = rightEdge - viewport()->size().width();
332 newScrollbarValue = leftEdge;
336#if QT_CONFIG(animation)
337 if (
const int animationDuration = style()->styleHint(QStyle::SH_Widget_Animation_Duration,
nullptr,
this)) {
338 d->currentAnimation.setDuration(animationDuration);
339 d->currentAnimation.setEndValue(newScrollbarValue);
340 d->currentAnimation.start();
344 horizontalScrollBar()->setValue(newScrollbarValue);
349
350
351
352
353QModelIndex QColumnView::moveCursor(CursorAction cursorAction, Qt::KeyboardModifiers modifiers)
359 return QModelIndex();
361 QModelIndex current = currentIndex();
362 if (isRightToLeft()) {
363 if (cursorAction == MoveLeft)
364 cursorAction = MoveRight;
365 else if (cursorAction == MoveRight)
366 cursorAction = MoveLeft;
368 switch (cursorAction) {
370 if (current.parent().isValid() && current.parent() != rootIndex())
371 return (current.parent());
376 if (model()->hasChildren(current))
377 return model()->index(0, 0, current);
379 return current.sibling(current.row() + 1, current.column());
385 return QModelIndex();
389
390
391void QColumnView::resizeEvent(QResizeEvent *event)
395 d->updateScrollbars();
396 if (!isRightToLeft()) {
397 int diff = event->oldSize().width() - event->size().width();
398 if (diff < 0 && horizontalScrollBar()->isVisible()
399 && horizontalScrollBar()->value() == horizontalScrollBar()->maximum()) {
400 horizontalScrollBar()->setMaximum(horizontalScrollBar()->maximum() + diff);
403 QAbstractItemView::resizeEvent(event);
407
408
409void QColumnViewPrivate::updateScrollbars()
412#if QT_CONFIG(animation)
413 if (currentAnimation.state() == QPropertyAnimation::Running)
418 int horizontalLength = 0;
419 if (!columns.isEmpty()) {
420 horizontalLength = (columns.constLast()->x() + columns.constLast()->width()) - columns.constFirst()->x();
421 if (horizontalLength <= 0)
422 horizontalLength = (columns.constFirst()->x() + columns.constFirst()->width()) - columns.constLast()->x();
425 QSize viewportSize = viewport->size();
426 if (horizontalLength < viewportSize.width() && hbar->value() == 0) {
427 hbar->setRange(0, 0);
429 int visibleLength = qMin(horizontalLength + q->horizontalOffset(), viewportSize.width());
430 int hiddenLength = horizontalLength - visibleLength;
431 if (hiddenLength != hbar->maximum())
432 hbar->setRange(0, hiddenLength);
434 if (!columns.isEmpty()) {
435 int pageStepSize = columns.at(0)->width();
436 if (pageStepSize != hbar->pageStep())
437 hbar->setPageStep(pageStepSize);
439 bool visible = (hbar->maximum() > 0);
440 if (visible != hbar->isVisible())
441 hbar->setVisible(visible);
445
446
447int QColumnView::horizontalOffset()
const
449 Q_D(
const QColumnView);
454
455
456int QColumnView::verticalOffset()
const
462
463
464QRegion QColumnView::visualRegionForSelection(
const QItemSelection &selection)
const
466 int ranges = selection.size();
473 int firstRow = selection.at(0).top();
474 int lastRow = selection.at(0).top();
475 for (
int i = 0; i < ranges; ++i) {
476 firstRow = qMin(firstRow, selection.at(i).top());
477 lastRow = qMax(lastRow, selection.at(i).bottom());
480 QModelIndex firstIdx = model()->index(qMin(firstRow, lastRow), 0, rootIndex());
481 QModelIndex lastIdx = model()->index(qMax(firstRow, lastRow), 0, rootIndex());
483 if (firstIdx == lastIdx)
484 return visualRect(firstIdx);
486 QRegion firstRegion = visualRect(firstIdx);
487 QRegion lastRegion = visualRect(lastIdx);
488 return firstRegion.united(lastRegion);
492
493
494void QColumnView::setSelection(
const QRect &rect, QItemSelectionModel::SelectionFlags command)
501
502
503void QColumnView::setSelectionModel(QItemSelectionModel *newSelectionModel)
505 Q_D(
const QColumnView);
506 for (
int i = 0; i < d->columns.size(); ++i) {
507 if (d->columns.at(i)->selectionModel() == selectionModel()) {
508 d->columns.at(i)->setSelectionModel(newSelectionModel);
512 QAbstractItemView::setSelectionModel(newSelectionModel);
516
517
518QSize QColumnView::sizeHint()
const
520 Q_D(
const QColumnView);
522 for (
int i = 0; i < d->columns.size(); ++i) {
523 sizeHint += d->columns.at(i)->sizeHint();
525 return sizeHint.expandedTo(QAbstractItemView::sizeHint());
529
530
531
532void QColumnViewPrivate::gripMoved(
int offset)
536 QObject *grip = q->sender();
539 if (q->isRightToLeft())
540 offset = -1 * offset;
543 for (
int i = 0; i < columns.size(); ++i) {
544 if (!found && columns.at(i)->cornerWidget() == grip) {
546 columnSizes[i] = columns.at(i)->width();
547 if (q->isRightToLeft())
548 columns.at(i)->move(columns.at(i)->x() + offset, 0);
554 int currentX = columns.at(i)->x();
555 columns.at(i)->move(currentX + offset, 0);
562
563
564
565
566
567
568void QColumnViewPrivate::closeColumns(
const QModelIndex &parent,
bool build)
570 if (columns.isEmpty())
573 bool clearAll = !parent.isValid();
574 bool passThroughRoot =
false;
576 QList<QModelIndex> dirsToAppend;
579 int currentColumn = -1;
580 QModelIndex parentIndex = parent;
581 while (currentColumn == -1 && parentIndex.isValid()) {
582 if (columns.isEmpty())
584 parentIndex = parentIndex.parent();
585 if (root == parentIndex)
586 passThroughRoot =
true;
587 if (!parentIndex.isValid())
589 for (
int i = columns.size() - 1; i >= 0; --i) {
590 if (columns.at(i)->rootIndex() == parentIndex) {
595 if (currentColumn == -1)
596 dirsToAppend.append(parentIndex);
601 if (!clearAll && !passThroughRoot && currentColumn == -1)
604 if (currentColumn == -1 && parent.isValid())
608 bool alreadyExists =
false;
609 if (build && columns.size() > currentColumn + 1) {
610 bool viewingParent = (columns.at(currentColumn + 1)->rootIndex() == parent);
611 bool viewingChild = (!model->hasChildren(parent)
612 && !columns.at(currentColumn + 1)->rootIndex().isValid());
613 if (viewingParent || viewingChild) {
615 alreadyExists =
true;
620 for (
int i = columns.size() - 1; i > currentColumn; --i) {
621 QAbstractItemView* notShownAnymore = columns.at(i);
623 notShownAnymore->setVisible(
false);
624 if (notShownAnymore != previewColumn) {
625 notShownAnymore->deleteLater();
626 disconnectView(notShownAnymore);
630 if (columns.isEmpty()) {
636 while (!dirsToAppend.isEmpty()) {
637 QAbstractItemView *newView = createColumn(dirsToAppend.takeLast(),
true);
638 if (!dirsToAppend.isEmpty())
639 newView->setCurrentIndex(dirsToAppend.constLast());
642 if (build && !alreadyExists)
643 createColumn(parent,
false);
646void QColumnViewPrivate::disconnectView(QAbstractItemView *view)
648 const auto it = viewConnections.find(view);
649 if (it == viewConnections.end())
651 for (
const QMetaObject::Connection &connection : it.value())
652 QObject::disconnect(connection);
653 viewConnections.erase(it);
656void QColumnViewPrivate::clicked(
const QModelIndex &index)
659 QModelIndex parent = index.parent();
660 QAbstractItemView *columnClicked =
nullptr;
661 for (
int column = 0; column < columns.size(); ++column) {
662 if (columns.at(column)->rootIndex() == parent) {
663 columnClicked = columns[column];
667 if (q->selectionModel() && columnClicked) {
668 QItemSelectionModel::SelectionFlags flags = QItemSelectionModel::Current;
669 if (columnClicked->selectionModel()->isSelected(index))
670 flags |= QItemSelectionModel::Select;
671 q->selectionModel()->setCurrentIndex(index, flags);
676
677
678
679
680
681
682
683
684
685QAbstractItemView *QColumnViewPrivate::createColumn(
const QModelIndex &index,
bool show)
688 QAbstractItemView *view =
nullptr;
689 QMetaObject::Connection clickedConnection;
690 if (model->hasChildren(index)) {
691 view = q->createColumn(index);
692 clickedConnection = QObjectPrivate::connect(view, &QAbstractItemView::clicked,
693 this, &QColumnViewPrivate::clicked);
696 previewColumn = createPreviewColumn();
697 view = previewColumn;
699 view->setMinimumWidth(qMax(view->minimumWidth(), previewWidget->minimumWidth()));
702 viewConnections[view] = {
703 QObject::connect(view, &QAbstractItemView::activated, q, &QColumnView::activated),
704 QObject::connect(view, &QAbstractItemView::clicked, q, &QColumnView::clicked),
705 QObject::connect(view, &QAbstractItemView::doubleClicked, q, &QColumnView::doubleClicked),
706 QObject::connect(view, &QAbstractItemView::entered, q, &QColumnView::entered),
707 QObject::connect(view, &QAbstractItemView::pressed, q, &QColumnView::pressed),
711 view->setFocusPolicy(Qt::NoFocus);
712 view->setParent(viewport);
716 if (showResizeGrips) {
717 QColumnViewGrip *grip =
new QColumnViewGrip(view);
718 view->setCornerWidget(grip);
719 gripConnections.push_back(
720 QObjectPrivate::connect(grip, &QColumnViewGrip::gripMoved,
721 this, &QColumnViewPrivate::gripMoved)
725 if (columnSizes.size() > columns.size()) {
726 view->setGeometry(0, 0, columnSizes.at(columns.size()), viewport->height());
728 int initialWidth = view->sizeHint().width();
729 if (q->isRightToLeft())
730 view->setGeometry(viewport->width() - initialWidth, 0, initialWidth, viewport->height());
732 view->setGeometry(0, 0, initialWidth, viewport->height());
733 columnSizes.resize(qMax(columnSizes.size(), columns.size() + 1));
734 columnSizes[columns.size()] = initialWidth;
736 if (!columns.isEmpty() && columns.constLast()->isHidden())
737 columns.constLast()->setVisible(
true);
739 columns.append(view);
742 if (show && view->isHidden() && view != previewColumn)
743 view->setVisible(
true);
744 if (view == previewColumn)
745 view->setVisible(showPreviewColumn);
750
751
752
753
754
755
756
759
760
761
762
763
764
765
766
767QAbstractItemView *QColumnView::createColumn(
const QModelIndex &index)
769 QListView *view =
new QListView(viewport());
771 initializeColumn(view);
773 view->setRootIndex(index);
774 if (model()->canFetchMore(index))
775 model()->fetchMore(index);
781
782
783
784
785
786
787
788void QColumnView::initializeColumn(QAbstractItemView *column)
const
790 Q_D(
const QColumnView);
792 column->setFrameShape(QFrame::NoFrame);
793 column->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
794 column->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
795 column->setMinimumWidth(100);
796 column->setAttribute(Qt::WA_MacShowFocusRect,
false);
798#if QT_CONFIG(draganddrop)
799 column->setDragDropMode(dragDropMode());
800 column->setDragDropOverwriteMode(dragDropOverwriteMode());
801 column->setDropIndicatorShown(showDropIndicator());
803 column->setAlternatingRowColors(alternatingRowColors());
804 column->setAutoScroll(hasAutoScroll());
805 column->setEditTriggers(editTriggers());
806 column->setHorizontalScrollMode(horizontalScrollMode());
807 column->setIconSize(iconSize());
808 column->setSelectionBehavior(selectionBehavior());
809 column->setSelectionMode(selectionMode());
810 column->setTabKeyNavigation(tabKeyNavigation());
811 column->setTextElideMode(textElideMode());
812 column->setVerticalScrollMode(verticalScrollMode());
814 column->setModel(model());
817 for (
auto i = d->rowDelegates.cbegin(), end = d->rowDelegates.cend(); i != end; ++i)
818 column->setItemDelegateForRow(i.key(), i.value());
821 QAbstractItemDelegate *delegate = column->itemDelegate();
822 column->setItemDelegate(d->itemDelegate);
827
828
829
830
831QWidget *QColumnView::previewWidget()
const
833 Q_D(
const QColumnView);
834 return d->previewWidget;
838
839
840
841
842
843
844
845
846void QColumnView::setPreviewWidget(QWidget *widget)
849 d->setPreviewWidget(widget);
853
854
855void QColumnViewPrivate::setPreviewWidget(QWidget *widget)
857 QColumnViewPreviewColumn *column = createPreviewColumn();
858 previewColumn = column;
859 column->setPreviewWidget(widget);
860 previewWidget = widget;
862 previewWidget->setParent(column->viewport());
866
867
868QColumnViewPreviewColumn *QColumnViewPrivate::createPreviewColumn()
872 if (!columns.isEmpty() && columns.constLast() == previewColumn)
873 columns.removeLast();
874 previewColumn->deleteLater();
876 QColumnViewPreviewColumn *column =
new QColumnViewPreviewColumn(q);
878 column->setFrameShape(QFrame::NoFrame);
879 column->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
880 column->setSelectionMode(QAbstractItemView::NoSelection);
881 column->setMinimumWidth(qMax(column->verticalScrollBar()->width(),
882 column->minimumWidth()));
883 column->setPreviewWidget(
nullptr);
888
889
890
891
892
893
894
895void QColumnView::setColumnWidths(
const QList<
int> &list)
899 const int listCount = list.size();
900 const int count = qMin(listCount, d->columns.size());
901 for (; i < count; ++i) {
902 d->columns.at(i)->resize(list.at(i), d->columns.at(i)->height());
903 d->columnSizes[i] = list.at(i);
906 d->columnSizes.reserve(listCount);
907 for (; i < listCount; ++i)
908 d->columnSizes.append(list.at(i));
912
913
914
915
916QList<
int> QColumnView::columnWidths()
const
918 Q_D(
const QColumnView);
920 const int columnCount = d->columns.size();
921 list.reserve(columnCount);
922 for (
int i = 0; i < columnCount; ++i)
923 list.append(d->columnSizes.at(i));
928
929
930void QColumnView::rowsInserted(
const QModelIndex &parent,
int start,
int end)
932 QAbstractItemView::rowsInserted(parent, start, end);
933 d_func()->checkColumnCreation(parent);
937
938
939void QColumnView::currentChanged(
const QModelIndex ¤t,
const QModelIndex &previous)
942 if (!current.isValid()) {
943 QAbstractItemView::currentChanged(current, previous);
947 QModelIndex currentParent = current.parent();
949 if (currentParent == previous.parent()
950 && model()->hasChildren(current) && model()->hasChildren(previous)) {
951 for (
int i = 0; i < d->columns.size(); ++i) {
952 if (currentParent == d->columns.at(i)->rootIndex()) {
953 if (d->columns.size() > i + 1) {
954 QAbstractItemView::currentChanged(current, previous);
964 if (currentParent == previous) {
965 for (
int i = 0; i < d->columns.size(); ++i) {
966 if (currentParent == d->columns.at(i)->rootIndex()) {
968 if (d->columns.size() < i + 2) {
969 d->createColumn(current,
false);
976 d->closeColumns(current,
true);
978 if (!model()->hasChildren(current))
979 emit updatePreviewWidget(current);
981 QAbstractItemView::currentChanged(current, previous);
985
986
987
988void QColumnViewPrivate::changeCurrentColumn()
991 if (columns.isEmpty())
994 QModelIndex current = q->currentIndex();
995 if (!current.isValid())
999 closeColumns(current,
true);
1002 int currentColumn = qMax(0, columns.size() - 2);
1003 QAbstractItemView *parentColumn = columns.at(currentColumn);
1005 parentColumn->setFocus(Qt::OtherFocusReason);
1006 q->setFocusProxy(parentColumn);
1009 for (
int i = 0; i < columns.size(); ++i) {
1010 if (columns.at(i)->selectionModel() == q->selectionModel()) {
1011 QItemSelectionModel *replacementSelectionModel =
1012 new QItemSelectionModel(parentColumn->model());
1013 replacementSelectionModel->setCurrentIndex(
1014 q->selectionModel()->currentIndex(), QItemSelectionModel::Current);
1015 replacementSelectionModel->select(
1016 q->selectionModel()->selection(), QItemSelectionModel::Select);
1017 QAbstractItemView *view = columns.at(i);
1018 view->setSelectionModel(replacementSelectionModel);
1019 view->setFocusPolicy(Qt::NoFocus);
1020 if (columns.size() > i + 1) {
1021 const QModelIndex newRootIndex = columns.at(i + 1)->rootIndex();
1022 if (newRootIndex.isValid())
1023 view->setCurrentIndex(newRootIndex);
1028 parentColumn->selectionModel()->deleteLater();
1029 parentColumn->setFocusPolicy(Qt::StrongFocus);
1030 parentColumn->setSelectionModel(q->selectionModel());
1032 if (currentColumn > 0) {
1033 parentColumn = columns.at(currentColumn - 1);
1034 if (parentColumn->currentIndex() != current.parent())
1035 parentColumn->setCurrentIndex(current.parent());
1038 if (columns.constLast()->isHidden()) {
1039 if (columns.constLast() != previewColumn)
1040 columns.constLast()->setVisible(
true);
1042 columns.constLast()->setVisible(showPreviewColumn);
1044 if (columns.constLast()->selectionModel())
1045 columns.constLast()->selectionModel()->clear();
1050
1051
1052void QColumnView::selectAll()
1054 if (!model() || !selectionModel())
1057 QModelIndexList indexList = selectionModel()->selectedIndexes();
1058 QModelIndex parent = rootIndex();
1059 QItemSelection selection;
1060 if (indexList.size() >= 1)
1061 parent = indexList.at(0).parent();
1062 if (indexList.size() == 1) {
1063 parent = indexList.at(0);
1064 if (!model()->hasChildren(parent))
1065 parent = parent.parent();
1067 selection.append(QItemSelectionRange(parent, parent));
1070 QModelIndex tl = model()->index(0, 0, parent);
1071 QModelIndex br = model()->index(model()->rowCount(parent) - 1,
1072 model()->columnCount(parent) - 1,
1074 selection.append(QItemSelectionRange(tl, br));
1075 selectionModel()->select(selection, QItemSelectionModel::ClearAndSelect);
1079
1080
1081QColumnViewPrivate::QColumnViewPrivate()
1082: QAbstractItemViewPrivate()
1083,showResizeGrips(
true)
1084,showPreviewColumn(
true)
1086,previewWidget(
nullptr)
1087,previewColumn(
nullptr)
1091QColumnViewPrivate::~QColumnViewPrivate()
1096
1097
1098
1099void QColumnViewPrivate::columnsInserted(
const QModelIndex &parent,
int start,
int end)
1101 QAbstractItemViewPrivate::columnsInserted(parent, start, end);
1102 checkColumnCreation(parent);
1106
1107
1108
1109
1110
1111void QColumnViewPrivate::checkColumnCreation(
const QModelIndex &parent)
1113 if (parent == q_func()->currentIndex() && model->hasChildren(parent)) {
1116 for (
int i = 0; i < columns.size(); ++i) {
1117 QAbstractItemView *view = columns.at(i);
1118 if (view->rootIndex() == parent) {
1119 if (view == previewColumn) {
1121 closeColumns(parent,
false);
1122 createColumn(parent,
true );
1131
1132
1133
1134void QColumnViewPrivate::doLayout()
1137 if (!model || columns.isEmpty())
1140 int viewportHeight = viewport->height();
1141 int x = columns.at(0)->x();
1143 if (q->isRightToLeft()) {
1144 x = viewport->width() + q->horizontalOffset();
1145 for (
int i = 0; i < columns.size(); ++i) {
1146 QAbstractItemView *view = columns.at(i);
1148 if (x != view->x() || viewportHeight != view->height())
1149 view->setGeometry(x, 0, view->width(), viewportHeight);
1152 for (
int i = 0; i < columns.size(); ++i) {
1153 QAbstractItemView *view = columns.at(i);
1154 int currentColumnWidth = view->width();
1155 if (x != view->x() || viewportHeight != view->height())
1156 view->setGeometry(x, 0, currentColumnWidth, viewportHeight);
1157 x += currentColumnWidth;
1163
1164
1165
1166
1167
1168
1169void QColumnViewDelegate::paint(QPainter *painter,
1170 const QStyleOptionViewItem &option,
1171 const QModelIndex &index)
const
1173 bool reverse = (option.direction == Qt::RightToLeft);
1174 int width = ((option.rect.height() * 2) / 3);
1176 QStyleOptionViewItem opt = option;
1178 opt.rect.adjust(width,0,0,0);
1180 opt.rect.adjust(0,0,-width,0);
1182 if (!(index.model()->flags(index) & Qt::ItemIsEnabled)) {
1183 opt.showDecorationSelected =
true;
1184 opt.state |= QStyle::State_Selected;
1187 QStyledItemDelegate::paint(painter, opt, index);
1190 opt.rect = QRect(option.rect.x(), option.rect.y(), width, option.rect.height());
1192 opt.rect = QRect(option.rect.x() + option.rect.width() - width, option.rect.y(),
1193 width, option.rect.height());
1196 if (index.model()->hasChildren(index)) {
1197 const QWidget *view = opt.widget;
1198 QStyle *style = view ? view->style() : QApplication::style();
1199 style->drawPrimitive(QStyle::PE_IndicatorColumnViewArrow, &opt, painter, view);
1205#include "moc_qcolumnview.cpp"