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));
83
84
85QColumnView::~QColumnView()
89#if QT_CONFIG(animation)
90 disconnect(d->animationConnection);
92 for (QMetaObject::Connection &conn : d->gripConnections)
94 for (
auto &&[_, conns] : d->viewConnections) {
95 for (QMetaObject::Connection &conn : conns)
101
102
103
104
105
106
107
108void QColumnView::setResizeGripsVisible(
bool visible)
111 if (d->showResizeGrips == visible)
113 d->showResizeGrips = visible;
114 d->gripConnections.clear();
115 for (QAbstractItemView *view : std::as_const(d->columns)) {
117 QColumnViewGrip *grip =
new QColumnViewGrip(view);
118 view->setCornerWidget(grip);
119 d->gripConnections.push_back(
120 QObjectPrivate::connect(grip, &QColumnViewGrip::gripMoved,
121 d, &QColumnViewPrivate::gripMoved)
124 QWidget *widget = view->cornerWidget();
125 view->setCornerWidget(
nullptr);
126 widget->deleteLater();
131bool QColumnView::resizeGripsVisible()
const
133 Q_D(
const QColumnView);
134 return d->showResizeGrips;
138
139
140
141
142
143
144void QColumnView::setPreviewColumnVisible(
bool visible)
147 if (d->showPreviewColumn == visible)
149 d->showPreviewColumn = visible;
150 if (d->columns.constLast() == d->previewColumn)
151 d->columns.constLast()->setVisible(d->showPreviewColumn);
154bool QColumnView::isPreviewColumnVisible()
const
156 Q_D(
const QColumnView);
157 return d->showPreviewColumn;
161
162
163void QColumnView::setModel(QAbstractItemModel *model)
166 if (model == d->model)
169 QAbstractItemView::setModel(model);
173
174
175void QColumnView::setRootIndex(
const QModelIndex &index)
182 Q_ASSERT(d->columns.size() == 0);
184 QAbstractItemView *view = d->createColumn(index,
true);
185 if (view->selectionModel())
186 view->selectionModel()->deleteLater();
188 view->setSelectionModel(selectionModel());
190 QAbstractItemView::setRootIndex(index);
191 d->updateScrollbars();
195
196
197bool QColumnView::isIndexHidden(
const QModelIndex &index)
const
204
205
206QModelIndex QColumnView::indexAt(
const QPoint &point)
const
208 Q_D(
const QColumnView);
209 for (
int i = 0; i < d->columns.size(); ++i) {
210 QPoint topLeft = d->columns.at(i)->frameGeometry().topLeft();
211 QPoint adjustedPoint(point.x() - topLeft.x(), point.y() - topLeft.y());
212 QModelIndex index = d->columns.at(i)->indexAt(adjustedPoint);
216 return QModelIndex();
220
221
222QRect QColumnView::visualRect(
const QModelIndex &index)
const
224 if (!index.isValid())
227 Q_D(
const QColumnView);
228 for (
int i = 0; i < d->columns.size(); ++i) {
229 QRect rect = d->columns.at(i)->visualRect(index);
230 if (!rect.isNull()) {
231 rect.translate(d->columns.at(i)->frameGeometry().topLeft());
239
240
241void QColumnView::scrollContentsBy(
int dx,
int dy)
244 if (d->columns.isEmpty() || dx == 0)
247 dx = isRightToLeft() ? -dx : dx;
248 for (
int i = 0; i < d->columns.size(); ++i)
249 d->columns.at(i)->move(d->columns.at(i)->x() + dx, 0);
251 QAbstractItemView::scrollContentsBy(dx, dy);
255
256
257void QColumnView::scrollTo(
const QModelIndex &index, ScrollHint hint)
261 if (!index.isValid() || d->columns.isEmpty())
264#if QT_CONFIG(animation)
265 if (d->currentAnimation.state() == QPropertyAnimation::Running)
268 d->currentAnimation.stop();
272 d->closeColumns(index,
true);
274 QModelIndex indexParent = index.parent();
276 int currentColumn = 0;
278 while (currentColumn < d->columns.size()) {
279 if (indexParent == d->columns.at(currentColumn)->rootIndex())
281 leftEdge += d->columns.at(currentColumn)->width();
286 if (currentColumn == d->columns.size())
289 int indexColumn = currentColumn;
291 int visibleWidth = d->columns.at(currentColumn)->width();
293 if (currentColumn + 1 < d->columns.size()) {
295 visibleWidth += d->columns.at(currentColumn)->width();
298 int rightEdge = leftEdge + visibleWidth;
299 if (isRightToLeft()) {
300 leftEdge = viewport()->width() - leftEdge;
301 rightEdge = leftEdge - visibleWidth;
302 qSwap(rightEdge, leftEdge);
306 if (leftEdge > -horizontalOffset()
307 && rightEdge <= ( -horizontalOffset() + viewport()->size().width())) {
308 d->columns.at(indexColumn)->scrollTo(index);
309 d->changeCurrentColumn();
313 int newScrollbarValue = 0;
314 if (isRightToLeft()) {
317 newScrollbarValue = viewport()->size().width() - leftEdge;
320 newScrollbarValue = rightEdge + horizontalOffset();
323 if (leftEdge > -horizontalOffset()) {
325 newScrollbarValue = rightEdge - viewport()->size().width();
328 newScrollbarValue = leftEdge;
332#if QT_CONFIG(animation)
333 if (
const int animationDuration = style()->styleHint(QStyle::SH_Widget_Animation_Duration,
nullptr,
this)) {
334 d->currentAnimation.setDuration(animationDuration);
335 d->currentAnimation.setEndValue(newScrollbarValue);
336 d->currentAnimation.start();
340 horizontalScrollBar()->setValue(newScrollbarValue);
345
346
347
348
349QModelIndex QColumnView::moveCursor(CursorAction cursorAction, Qt::KeyboardModifiers modifiers)
355 return QModelIndex();
357 QModelIndex current = currentIndex();
358 if (isRightToLeft()) {
359 if (cursorAction == MoveLeft)
360 cursorAction = MoveRight;
361 else if (cursorAction == MoveRight)
362 cursorAction = MoveLeft;
364 switch (cursorAction) {
366 if (current.parent().isValid() && current.parent() != rootIndex())
367 return (current.parent());
372 if (model()->hasChildren(current))
373 return model()->index(0, 0, current);
375 return current.sibling(current.row() + 1, current.column());
381 return QModelIndex();
385
386
387void QColumnView::resizeEvent(QResizeEvent *event)
391 d->updateScrollbars();
392 if (!isRightToLeft()) {
393 int diff = event->oldSize().width() - event->size().width();
394 if (diff < 0 && horizontalScrollBar()->isVisible()
395 && horizontalScrollBar()->value() == horizontalScrollBar()->maximum()) {
396 horizontalScrollBar()->setMaximum(horizontalScrollBar()->maximum() + diff);
399 QAbstractItemView::resizeEvent(event);
403
404
405void QColumnViewPrivate::updateScrollbars()
408#if QT_CONFIG(animation)
409 if (currentAnimation.state() == QPropertyAnimation::Running)
414 int horizontalLength = 0;
415 if (!columns.isEmpty()) {
416 horizontalLength = (columns.constLast()->x() + columns.constLast()->width()) - columns.constFirst()->x();
417 if (horizontalLength <= 0)
418 horizontalLength = (columns.constFirst()->x() + columns.constFirst()->width()) - columns.constLast()->x();
421 QSize viewportSize = viewport->size();
422 if (horizontalLength < viewportSize.width() && hbar->value() == 0) {
423 hbar->setRange(0, 0);
425 int visibleLength = qMin(horizontalLength + q->horizontalOffset(), viewportSize.width());
426 int hiddenLength = horizontalLength - visibleLength;
427 if (hiddenLength != hbar->maximum())
428 hbar->setRange(0, hiddenLength);
430 if (!columns.isEmpty()) {
431 int pageStepSize = columns.at(0)->width();
432 if (pageStepSize != hbar->pageStep())
433 hbar->setPageStep(pageStepSize);
435 bool visible = (hbar->maximum() > 0);
436 if (visible != hbar->isVisible())
437 hbar->setVisible(visible);
441
442
443int QColumnView::horizontalOffset()
const
445 Q_D(
const QColumnView);
450
451
452int QColumnView::verticalOffset()
const
458
459
460QRegion QColumnView::visualRegionForSelection(
const QItemSelection &selection)
const
462 int ranges = selection.size();
469 int firstRow = selection.at(0).top();
470 int lastRow = selection.at(0).top();
471 for (
int i = 0; i < ranges; ++i) {
472 firstRow = qMin(firstRow, selection.at(i).top());
473 lastRow = qMax(lastRow, selection.at(i).bottom());
476 QModelIndex firstIdx = model()->index(qMin(firstRow, lastRow), 0, rootIndex());
477 QModelIndex lastIdx = model()->index(qMax(firstRow, lastRow), 0, rootIndex());
479 if (firstIdx == lastIdx)
480 return visualRect(firstIdx);
482 QRegion firstRegion = visualRect(firstIdx);
483 QRegion lastRegion = visualRect(lastIdx);
484 return firstRegion.united(lastRegion);
488
489
490void QColumnView::setSelection(
const QRect &rect, QItemSelectionModel::SelectionFlags command)
497
498
499void QColumnView::setSelectionModel(QItemSelectionModel *newSelectionModel)
501 Q_D(
const QColumnView);
502 for (
int i = 0; i < d->columns.size(); ++i) {
503 if (d->columns.at(i)->selectionModel() == selectionModel()) {
504 d->columns.at(i)->setSelectionModel(newSelectionModel);
508 QAbstractItemView::setSelectionModel(newSelectionModel);
512
513
514QSize QColumnView::sizeHint()
const
516 Q_D(
const QColumnView);
518 for (
int i = 0; i < d->columns.size(); ++i) {
519 sizeHint += d->columns.at(i)->sizeHint();
521 return sizeHint.expandedTo(QAbstractItemView::sizeHint());
525
526
527
528void QColumnViewPrivate::gripMoved(
int offset)
532 QObject *grip = q->sender();
535 if (q->isRightToLeft())
536 offset = -1 * offset;
539 for (
int i = 0; i < columns.size(); ++i) {
540 if (!found && columns.at(i)->cornerWidget() == grip) {
542 columnSizes[i] = columns.at(i)->width();
543 if (q->isRightToLeft())
544 columns.at(i)->move(columns.at(i)->x() + offset, 0);
550 int currentX = columns.at(i)->x();
551 columns.at(i)->move(currentX + offset, 0);
558
559
560
561
562
563
564void QColumnViewPrivate::closeColumns(
const QModelIndex &parent,
bool build)
566 if (columns.isEmpty())
569 bool clearAll = !parent.isValid();
570 bool passThroughRoot =
false;
572 QList<QModelIndex> dirsToAppend;
575 int currentColumn = -1;
576 QModelIndex parentIndex = parent;
577 while (currentColumn == -1 && parentIndex.isValid()) {
578 if (columns.isEmpty())
580 parentIndex = parentIndex.parent();
581 if (root == parentIndex)
582 passThroughRoot =
true;
583 if (!parentIndex.isValid())
585 for (
int i = columns.size() - 1; i >= 0; --i) {
586 if (columns.at(i)->rootIndex() == parentIndex) {
591 if (currentColumn == -1)
592 dirsToAppend.append(parentIndex);
597 if (!clearAll && !passThroughRoot && currentColumn == -1)
600 if (currentColumn == -1 && parent.isValid())
604 bool alreadyExists =
false;
605 if (build && columns.size() > currentColumn + 1) {
606 bool viewingParent = (columns.at(currentColumn + 1)->rootIndex() == parent);
607 bool viewingChild = (!model->hasChildren(parent)
608 && !columns.at(currentColumn + 1)->rootIndex().isValid());
609 if (viewingParent || viewingChild) {
611 alreadyExists =
true;
616 for (
int i = columns.size() - 1; i > currentColumn; --i) {
617 QAbstractItemView* notShownAnymore = columns.at(i);
619 notShownAnymore->setVisible(
false);
620 if (notShownAnymore != previewColumn) {
621 notShownAnymore->deleteLater();
622 disconnectView(notShownAnymore);
626 if (columns.isEmpty()) {
632 while (!dirsToAppend.isEmpty()) {
633 QAbstractItemView *newView = createColumn(dirsToAppend.takeLast(),
true);
634 if (!dirsToAppend.isEmpty())
635 newView->setCurrentIndex(dirsToAppend.constLast());
638 if (build && !alreadyExists)
639 createColumn(parent,
false);
642void QColumnViewPrivate::disconnectView(QAbstractItemView *view)
644 const auto it = viewConnections.find(view);
645 if (it == viewConnections.end())
647 for (QMetaObject::Connection &connection : it.value())
648 QObject::disconnect(connection);
649 viewConnections.erase(it);
652void QColumnViewPrivate::clicked(
const QModelIndex &index)
655 QModelIndex parent = index.parent();
656 QAbstractItemView *columnClicked =
nullptr;
657 for (
int column = 0; column < columns.size(); ++column) {
658 if (columns.at(column)->rootIndex() == parent) {
659 columnClicked = columns[column];
663 if (q->selectionModel() && columnClicked) {
664 QItemSelectionModel::SelectionFlags flags = QItemSelectionModel::Current;
665 if (columnClicked->selectionModel()->isSelected(index))
666 flags |= QItemSelectionModel::Select;
667 q->selectionModel()->setCurrentIndex(index, flags);
672
673
674
675
676
677
678
679
680
681QAbstractItemView *QColumnViewPrivate::createColumn(
const QModelIndex &index,
bool show)
684 QAbstractItemView *view =
nullptr;
685 QMetaObject::Connection clickedConnection;
686 if (model->hasChildren(index)) {
687 view = q->createColumn(index);
688 clickedConnection = QObjectPrivate::connect(view, &QAbstractItemView::clicked,
689 this, &QColumnViewPrivate::clicked);
692 previewColumn = createPreviewColumn();
693 view = previewColumn;
695 view->setMinimumWidth(qMax(view->minimumWidth(), previewWidget->minimumWidth()));
698 viewConnections[view] = {
699 QObject::connect(view, &QAbstractItemView::activated, q, &QColumnView::activated),
700 QObject::connect(view, &QAbstractItemView::clicked, q, &QColumnView::clicked),
701 QObject::connect(view, &QAbstractItemView::doubleClicked, q, &QColumnView::doubleClicked),
702 QObject::connect(view, &QAbstractItemView::entered, q, &QColumnView::entered),
703 QObject::connect(view, &QAbstractItemView::pressed, q, &QColumnView::pressed),
704 std::move(clickedConnection),
707 view->setFocusPolicy(Qt::NoFocus);
708 view->setParent(viewport);
712 if (showResizeGrips) {
713 QColumnViewGrip *grip =
new QColumnViewGrip(view);
714 view->setCornerWidget(grip);
715 gripConnections.push_back(
716 QObjectPrivate::connect(grip, &QColumnViewGrip::gripMoved,
717 this, &QColumnViewPrivate::gripMoved)
721 if (columnSizes.size() > columns.size()) {
722 view->setGeometry(0, 0, columnSizes.at(columns.size()), viewport->height());
724 int initialWidth = view->sizeHint().width();
725 if (q->isRightToLeft())
726 view->setGeometry(viewport->width() - initialWidth, 0, initialWidth, viewport->height());
728 view->setGeometry(0, 0, initialWidth, viewport->height());
729 columnSizes.resize(qMax(columnSizes.size(), columns.size() + 1));
730 columnSizes[columns.size()] = initialWidth;
732 if (!columns.isEmpty() && columns.constLast()->isHidden())
733 columns.constLast()->setVisible(
true);
735 columns.append(view);
738 if (show && view->isHidden() && view != previewColumn)
739 view->setVisible(
true);
740 if (view == previewColumn)
741 view->setVisible(showPreviewColumn);
746
747
748
749
750
751
752
755
756
757
758
759
760
761
762
763QAbstractItemView *QColumnView::createColumn(
const QModelIndex &index)
765 QListView *view =
new QListView(viewport());
767 initializeColumn(view);
769 view->setRootIndex(index);
770 if (model()->canFetchMore(index))
771 model()->fetchMore(index);
777
778
779
780
781
782
783
784void QColumnView::initializeColumn(QAbstractItemView *column)
const
786 Q_D(
const QColumnView);
788 column->setFrameShape(QFrame::NoFrame);
789 column->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
790 column->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
791 column->setMinimumWidth(100);
792 column->setAttribute(Qt::WA_MacShowFocusRect,
false);
794#if QT_CONFIG(draganddrop)
795 column->setDragDropMode(dragDropMode());
796 column->setDragDropOverwriteMode(dragDropOverwriteMode());
797 column->setDropIndicatorShown(showDropIndicator());
799 column->setAlternatingRowColors(alternatingRowColors());
800 column->setAutoScroll(hasAutoScroll());
801 column->setEditTriggers(editTriggers());
802 column->setHorizontalScrollMode(horizontalScrollMode());
803 column->setIconSize(iconSize());
804 column->setSelectionBehavior(selectionBehavior());
805 column->setSelectionMode(selectionMode());
806 column->setTabKeyNavigation(tabKeyNavigation());
807 column->setTextElideMode(textElideMode());
808 column->setVerticalScrollMode(verticalScrollMode());
810 column->setModel(model());
813 for (
auto i = d->rowDelegates.cbegin(), end = d->rowDelegates.cend(); i != end; ++i)
814 column->setItemDelegateForRow(i.key(), i.value());
817 QAbstractItemDelegate *delegate = column->itemDelegate();
818 column->setItemDelegate(d->itemDelegate);
823
824
825
826
827QWidget *QColumnView::previewWidget()
const
829 Q_D(
const QColumnView);
830 return d->previewWidget;
834
835
836
837
838
839
840
841
842void QColumnView::setPreviewWidget(QWidget *widget)
845 d->setPreviewWidget(widget);
849
850
851void QColumnViewPrivate::setPreviewWidget(QWidget *widget)
853 QColumnViewPreviewColumn *column = createPreviewColumn();
854 previewColumn = column;
855 column->setPreviewWidget(widget);
856 previewWidget = widget;
858 previewWidget->setParent(column->viewport());
862
863
864QColumnViewPreviewColumn *QColumnViewPrivate::createPreviewColumn()
868 if (!columns.isEmpty() && columns.constLast() == previewColumn)
869 columns.removeLast();
870 previewColumn->deleteLater();
872 QColumnViewPreviewColumn *column =
new QColumnViewPreviewColumn(q);
874 column->setFrameShape(QFrame::NoFrame);
875 column->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
876 column->setSelectionMode(QAbstractItemView::NoSelection);
877 column->setMinimumWidth(qMax(column->verticalScrollBar()->width(),
878 column->minimumWidth()));
879 column->setPreviewWidget(
nullptr);
884
885
886
887
888
889
890
891void QColumnView::setColumnWidths(
const QList<
int> &list)
895 const int listCount = list.size();
896 const int count = qMin(listCount, d->columns.size());
897 for (; i < count; ++i) {
898 d->columns.at(i)->resize(list.at(i), d->columns.at(i)->height());
899 d->columnSizes[i] = list.at(i);
902 d->columnSizes.reserve(listCount);
903 for (; i < listCount; ++i)
904 d->columnSizes.append(list.at(i));
908
909
910
911
912QList<
int> QColumnView::columnWidths()
const
914 Q_D(
const QColumnView);
916 const int columnCount = d->columns.size();
917 list.reserve(columnCount);
918 for (
int i = 0; i < columnCount; ++i)
919 list.append(d->columnSizes.at(i));
924
925
926void QColumnView::rowsInserted(
const QModelIndex &parent,
int start,
int end)
928 QAbstractItemView::rowsInserted(parent, start, end);
929 d_func()->checkColumnCreation(parent);
933
934
935void QColumnView::currentChanged(
const QModelIndex ¤t,
const QModelIndex &previous)
938 if (!current.isValid()) {
939 QAbstractItemView::currentChanged(current, previous);
943 QModelIndex currentParent = current.parent();
945 if (currentParent == previous.parent()
946 && model()->hasChildren(current) && model()->hasChildren(previous)) {
947 for (
int i = 0; i < d->columns.size(); ++i) {
948 if (currentParent == d->columns.at(i)->rootIndex()) {
949 if (d->columns.size() > i + 1) {
950 QAbstractItemView::currentChanged(current, previous);
960 if (currentParent == previous) {
961 for (
int i = 0; i < d->columns.size(); ++i) {
962 if (currentParent == d->columns.at(i)->rootIndex()) {
964 if (d->columns.size() < i + 2) {
965 d->createColumn(current,
false);
972 d->closeColumns(current,
true);
974 if (!model()->hasChildren(current))
975 emit updatePreviewWidget(current);
977 QAbstractItemView::currentChanged(current, previous);
981
982
983
984void QColumnViewPrivate::changeCurrentColumn()
987 if (columns.isEmpty())
990 QModelIndex current = q->currentIndex();
991 if (!current.isValid())
995 closeColumns(current,
true);
998 int currentColumn = qMax(0, columns.size() - 2);
999 QAbstractItemView *parentColumn = columns.at(currentColumn);
1001 parentColumn->setFocus(Qt::OtherFocusReason);
1002 q->setFocusProxy(parentColumn);
1005 for (
int i = 0; i < columns.size(); ++i) {
1006 if (columns.at(i)->selectionModel() == q->selectionModel()) {
1007 QItemSelectionModel *replacementSelectionModel =
1008 new QItemSelectionModel(parentColumn->model());
1009 replacementSelectionModel->setCurrentIndex(
1010 q->selectionModel()->currentIndex(), QItemSelectionModel::Current);
1011 replacementSelectionModel->select(
1012 q->selectionModel()->selection(), QItemSelectionModel::Select);
1013 QAbstractItemView *view = columns.at(i);
1014 view->setSelectionModel(replacementSelectionModel);
1015 view->setFocusPolicy(Qt::NoFocus);
1016 if (columns.size() > i + 1) {
1017 const QModelIndex newRootIndex = columns.at(i + 1)->rootIndex();
1018 if (newRootIndex.isValid())
1019 view->setCurrentIndex(newRootIndex);
1024 parentColumn->selectionModel()->deleteLater();
1025 parentColumn->setFocusPolicy(Qt::StrongFocus);
1026 parentColumn->setSelectionModel(q->selectionModel());
1028 if (currentColumn > 0) {
1029 parentColumn = columns.at(currentColumn - 1);
1030 if (parentColumn->currentIndex() != current.parent())
1031 parentColumn->setCurrentIndex(current.parent());
1034 if (columns.constLast()->isHidden()) {
1035 if (columns.constLast() != previewColumn)
1036 columns.constLast()->setVisible(
true);
1038 columns.constLast()->setVisible(showPreviewColumn);
1040 if (columns.constLast()->selectionModel())
1041 columns.constLast()->selectionModel()->clear();
1046
1047
1048void QColumnView::selectAll()
1050 if (!model() || !selectionModel())
1053 QModelIndexList indexList = selectionModel()->selectedIndexes();
1054 QModelIndex parent = rootIndex();
1055 QItemSelection selection;
1056 if (indexList.size() >= 1)
1057 parent = indexList.at(0).parent();
1058 if (indexList.size() == 1) {
1059 parent = indexList.at(0);
1060 if (!model()->hasChildren(parent))
1061 parent = parent.parent();
1063 selection.append(QItemSelectionRange(parent, parent));
1066 QModelIndex tl = model()->index(0, 0, parent);
1067 QModelIndex br = model()->index(model()->rowCount(parent) - 1,
1068 model()->columnCount(parent) - 1,
1070 selection.append(QItemSelectionRange(tl, br));
1071 selectionModel()->select(selection, QItemSelectionModel::ClearAndSelect);
1075
1076
1077QColumnViewPrivate::QColumnViewPrivate()
1078: QAbstractItemViewPrivate()
1079,showResizeGrips(
true)
1080,showPreviewColumn(
true)
1082,previewWidget(
nullptr)
1083,previewColumn(
nullptr)
1087QColumnViewPrivate::~QColumnViewPrivate()
1092
1093
1094
1095void QColumnViewPrivate::columnsInserted(
const QModelIndex &parent,
int start,
int end)
1097 QAbstractItemViewPrivate::columnsInserted(parent, start, end);
1098 checkColumnCreation(parent);
1102
1103
1104
1105
1106
1107void QColumnViewPrivate::checkColumnCreation(
const QModelIndex &parent)
1109 if (parent == q_func()->currentIndex() && model->hasChildren(parent)) {
1112 for (
int i = 0; i < columns.size(); ++i) {
1113 QAbstractItemView *view = columns.at(i);
1114 if (view->rootIndex() == parent) {
1115 if (view == previewColumn) {
1117 closeColumns(parent,
false);
1118 createColumn(parent,
true );
1127
1128
1129
1130void QColumnViewPrivate::doLayout()
1133 if (!model || columns.isEmpty())
1136 int viewportHeight = viewport->height();
1137 int x = columns.at(0)->x();
1139 if (q->isRightToLeft()) {
1140 x = viewport->width() + q->horizontalOffset();
1141 for (
int i = 0; i < columns.size(); ++i) {
1142 QAbstractItemView *view = columns.at(i);
1144 if (x != view->x() || viewportHeight != view->height())
1145 view->setGeometry(x, 0, view->width(), viewportHeight);
1148 for (
int i = 0; i < columns.size(); ++i) {
1149 QAbstractItemView *view = columns.at(i);
1150 int currentColumnWidth = view->width();
1151 if (x != view->x() || viewportHeight != view->height())
1152 view->setGeometry(x, 0, currentColumnWidth, viewportHeight);
1153 x += currentColumnWidth;
1159
1160
1161
1162
1163
1164
1165void QColumnViewDelegate::paint(QPainter *painter,
1166 const QStyleOptionViewItem &option,
1167 const QModelIndex &index)
const
1169 bool reverse = (option.direction == Qt::RightToLeft);
1170 int width = ((option.rect.height() * 2) / 3);
1172 QStyleOptionViewItem opt = option;
1174 opt.rect.adjust(width,0,0,0);
1176 opt.rect.adjust(0,0,-width,0);
1178 if (!(index.model()->flags(index) & Qt::ItemIsEnabled)) {
1179 opt.showDecorationSelected =
true;
1180 opt.state |= QStyle::State_Selected;
1183 QStyledItemDelegate::paint(painter, opt, index);
1186 opt.rect = QRect(option.rect.x(), option.rect.y(), width, option.rect.height());
1188 opt.rect = QRect(option.rect.x() + option.rect.width() - width, option.rect.y(),
1189 width, option.rect.height());
1192 if (index.model()->hasChildren(index)) {
1193 const QWidget *view = opt.widget;
1194 QStyle *style = view ? view->style() : QApplication::style();
1195 style->drawPrimitive(QStyle::PE_IndicatorColumnViewArrow, &opt, painter, view);
1201#include "moc_qcolumnview.cpp"