diff options
Diffstat (limited to 'src/widgets/itemviews')
-rw-r--r-- | src/widgets/itemviews/qheaderview.cpp | 29 | ||||
-rw-r--r-- | src/widgets/itemviews/qitemdelegate.cpp | 6 | ||||
-rw-r--r-- | src/widgets/itemviews/qlistview.cpp | 35 | ||||
-rw-r--r-- | src/widgets/itemviews/qlistview_p.h | 8 | ||||
-rw-r--r-- | src/widgets/itemviews/qlistwidget.cpp | 93 | ||||
-rw-r--r-- | src/widgets/itemviews/qlistwidget.h | 24 | ||||
-rw-r--r-- | src/widgets/itemviews/qlistwidget_p.h | 4 | ||||
-rw-r--r-- | src/widgets/itemviews/qstyleditemdelegate.cpp | 4 | ||||
-rw-r--r-- | src/widgets/itemviews/qtableview.cpp | 41 | ||||
-rw-r--r-- | src/widgets/itemviews/qtableview.h | 6 | ||||
-rw-r--r-- | src/widgets/itemviews/qtableview_p.h | 1 | ||||
-rw-r--r-- | src/widgets/itemviews/qtablewidget.cpp | 122 | ||||
-rw-r--r-- | src/widgets/itemviews/qtablewidget.h | 33 | ||||
-rw-r--r-- | src/widgets/itemviews/qtablewidget_p.h | 3 | ||||
-rw-r--r-- | src/widgets/itemviews/qtreeview.cpp | 99 | ||||
-rw-r--r-- | src/widgets/itemviews/qtreeview.h | 6 | ||||
-rw-r--r-- | src/widgets/itemviews/qtreewidget.cpp | 215 | ||||
-rw-r--r-- | src/widgets/itemviews/qtreewidget.h | 53 | ||||
-rw-r--r-- | src/widgets/itemviews/qtreewidget_p.h | 4 |
19 files changed, 525 insertions, 261 deletions
diff --git a/src/widgets/itemviews/qheaderview.cpp b/src/widgets/itemviews/qheaderview.cpp index 7bfa51337d..62abf56751 100644 --- a/src/widgets/itemviews/qheaderview.cpp +++ b/src/widgets/itemviews/qheaderview.cpp @@ -2321,9 +2321,10 @@ void QHeaderView::initializeSections() if (stretchLastSection()) // we've already gotten the size hint d->maybeRestorePrevLastSectionAndStretchLast(); - //make sure we update the hidden sections + // make sure we update the hidden sections + // simulate remove from newCount to oldCount if (newCount < oldCount) - d->updateHiddenSections(0, newCount-1); + d->updateHiddenSections(newCount, oldCount); } } @@ -3116,9 +3117,25 @@ void QHeaderView::scrollContentsBy(int dx, int dy) \reimp \internal */ -void QHeaderView::dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector<int> &) +void QHeaderView::dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector<int> &roles) { Q_D(QHeaderView); + if (!roles.isEmpty()) { + const auto doesRoleAffectSize = [](int role) -> bool { + switch (role) { + case Qt::DisplayRole: + case Qt::DecorationRole: + case Qt::SizeHintRole: + case Qt::FontRole: + return true; + default: + // who knows what a subclass or custom style might do + return role >= Qt::UserRole; + } + }; + if (std::none_of(roles.begin(), roles.end(), doesRoleAffectSize)) + return; + } d->invalidateCachedSizeHint(); if (d->hasAutoResizeSections()) { bool resizeRequired = d->globalResizeMode == ResizeToContents; @@ -3874,9 +3891,9 @@ void QHeaderViewPrivate::updateDefaultSectionSizeFromStyle() void QHeaderViewPrivate::recalcSectionStartPos() const // linear (but fast) { int pixelpos = 0; - for (QVector<SectionItem>::const_iterator i = sectionItems.constBegin(); i != sectionItems.constEnd(); ++i) { - i->calculated_startpos = pixelpos; // write into const mutable - pixelpos += i->size; + for (const SectionItem &i : sectionItems) { + i.calculated_startpos = pixelpos; // write into const mutable + pixelpos += i.size; } sectionStartposRecalc = false; } diff --git a/src/widgets/itemviews/qitemdelegate.cpp b/src/widgets/itemviews/qitemdelegate.cpp index dff4cc4593..16d4a21f50 100644 --- a/src/widgets/itemviews/qitemdelegate.cpp +++ b/src/widgets/itemviews/qitemdelegate.cpp @@ -266,7 +266,7 @@ QSizeF QItemDelegatePrivate::doTextLayout(int lineWidth) const \row \li \l Qt::AccessibleDescriptionRole \li QString \row \li \l Qt::AccessibleTextRole \li QString \endomit - \row \li \l Qt::BackgroundRole \li QBrush + \row \li \l Qt::BackgroundRole \li QBrush (\since 4.2) \row \li \l Qt::BackgroundColorRole \li QColor (obsolete; use Qt::BackgroundRole instead) \row \li \l Qt::CheckStateRole \li Qt::CheckState \row \li \l Qt::DecorationRole \li QIcon, QPixmap and QColor @@ -278,7 +278,7 @@ QSizeF QItemDelegatePrivate::doTextLayout(int lineWidth) const \row \li \l Qt::StatusTipRole \li \endomit \row \li \l Qt::TextAlignmentRole \li Qt::Alignment - \row \li \l Qt::ForegroundRole \li QBrush + \row \li \l Qt::ForegroundRole \li QBrush (\since 4.2) \row \li \l Qt::TextColorRole \li QColor (obsolete; use Qt::ForegroundRole instead) \omit \row \li \l Qt::ToolTipRole @@ -1089,7 +1089,7 @@ QRect QItemDelegate::doCheck(const QStyleOptionViewItem &option, opt.rect = bounding; const QWidget *widget = d->widget(option); // cast QStyle *style = widget ? widget->style() : QApplication::style(); - return style->subElementRect(QStyle::SE_ViewItemCheckIndicator, &opt, widget); + return style->subElementRect(QStyle::SE_ItemViewItemCheckIndicator, &opt, widget); } return QRect(); } diff --git a/src/widgets/itemviews/qlistview.cpp b/src/widgets/itemviews/qlistview.cpp index e5769940d4..fdac332367 100644 --- a/src/widgets/itemviews/qlistview.cpp +++ b/src/widgets/itemviews/qlistview.cpp @@ -2246,8 +2246,8 @@ int QListModeViewBase::verticalScrollToValue(int index, QListView::ScrollHint hi } else { int scrollBarValue = verticalScrollBar()->value(); int numHidden = 0; - for (int i = 0; i < flowPositions.count() - 1 && i <= scrollBarValue; ++i) - if (isHidden(i)) + for (const auto &idx : qAsConst(dd->hiddenRows)) + if (idx.row() <= scrollBarValue) ++numHidden; value = qBound(0, scrollValueMap.at(verticalScrollBar()->value()) - numHidden, flowPositions.count() - 1); } @@ -2687,21 +2687,24 @@ int QListModeViewBase::perItemScrollToValue(int index, int scrollValue, int view return scrollValue; itemExtent += spacing(); - QVector<int> visibleFlowPositions; - visibleFlowPositions.reserve(flowPositions.count() - 1); - for (int i = 0; i < flowPositions.count() - 1; i++) { // flowPositions count is +1 larger than actual row count - if (!isHidden(i)) - visibleFlowPositions.append(flowPositions.at(i)); - } - + QVector<int> hiddenRows = dd->hiddenRowIds(); + std::sort(hiddenRows.begin(), hiddenRows.end()); + int hiddenRowsBefore = 0; + for (int i = 0; i < hiddenRows.size() - 1; ++i) + if (hiddenRows.at(i) > index + hiddenRowsBefore) + break; + else + ++hiddenRowsBefore; if (!wrap) { int topIndex = index; const int bottomIndex = topIndex; - const int bottomCoordinate = visibleFlowPositions.at(index); - + const int bottomCoordinate = flowPositions.at(index + hiddenRowsBefore); while (topIndex > 0 && - (bottomCoordinate - visibleFlowPositions.at(topIndex - 1) + itemExtent) <= (viewportSize)) { + (bottomCoordinate - flowPositions.at(topIndex + hiddenRowsBefore - 1) + itemExtent) <= (viewportSize)) { topIndex--; + // will the next one be a hidden row -> skip + while (hiddenRowsBefore > 0 && hiddenRows.at(hiddenRowsBefore - 1) >= topIndex + hiddenRowsBefore - 1) + hiddenRowsBefore--; } const int itemCount = bottomIndex - topIndex + 1; @@ -2720,7 +2723,7 @@ int QListModeViewBase::perItemScrollToValue(int index, int scrollValue, int view ? Qt::Horizontal : Qt::Vertical); if (flowOrientation == orientation) { // scrolling in the "flow" direction // ### wrapped scrolling in the flow direction - return visibleFlowPositions.at(index); // ### always pixel based for now + return flowPositions.at(index + hiddenRowsBefore); // ### always pixel based for now } else if (!segmentStartRows.isEmpty()) { // we are scrolling in the "segment" direction int segment = qBinarySearch<int>(segmentStartRows, index, 0, segmentStartRows.count() - 1); int leftSegment = segment; @@ -3354,9 +3357,9 @@ int QListView::visualIndex(const QModelIndex &index) const d->executePostedLayout(); QListViewItem itm = d->indexToListViewItem(index); int visualIndex = d->commonListView->itemIndex(itm); - for (int row = 0; row <= index.row() && visualIndex >= 0; row++) { - if (d->isHidden(row)) - visualIndex--; + for (const auto &idx : qAsConst(d->hiddenRows)) { + if (idx.row() <= index.row()) + --visualIndex; } return visualIndex; } diff --git a/src/widgets/itemviews/qlistview_p.h b/src/widgets/itemviews/qlistview_p.h index 181386d4d0..3f997ef7e3 100644 --- a/src/widgets/itemviews/qlistview_p.h +++ b/src/widgets/itemviews/qlistview_p.h @@ -377,6 +377,14 @@ public: QModelIndex idx = model->index(row, 0, root); return isPersistent(idx) && hiddenRows.contains(idx); } + // helper to avoid checking for isPersistent and creating persistent indexes as above in isHidden + QVector<int> hiddenRowIds() const { + QVector<int> rowIds; + rowIds.reserve(hiddenRows.size()); + for (const auto &idx : hiddenRows) + rowIds += idx.row(); + return rowIds; + } inline bool isHiddenOrDisabled(int row) const { return isHidden(row) || !isIndexEnabled(modelIndex(row)); } void removeCurrentAndDisabled(QVector<QModelIndex> *indexes, const QModelIndex ¤t) const; diff --git a/src/widgets/itemviews/qlistwidget.cpp b/src/widgets/itemviews/qlistwidget.cpp index 72e0a67a64..6e0bdb3f22 100644 --- a/src/widgets/itemviews/qlistwidget.cpp +++ b/src/widgets/itemviews/qlistwidget.cpp @@ -227,6 +227,22 @@ bool QListModel::setData(const QModelIndex &index, const QVariant &value, int ro return true; } +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) +bool QListModel::clearItemData(const QModelIndex &index) +{ + if (!checkIndex(index, CheckIndexOption::IndexIsValid)) + return false; + QListWidgetItem *item = items.at(index.row()); + const auto beginIter = item->d->values.cbegin(); + const auto endIter = item->d->values.cend(); + if (std::all_of(beginIter, endIter, [](const QWidgetItemData& data) -> bool { return !data.value.isValid(); })) + return true; //it's already cleared + item->d->values.clear(); + emit dataChanged(index, index, QVector<int>{}); + return true; +} +#endif + QMap<int, QVariant> QListModel::itemData(const QModelIndex &index) const { QMap<int, QVariant> roles; @@ -277,6 +293,30 @@ bool QListModel::removeRows(int row, int count, const QModelIndex &parent) return true; } +/*! + \since 5.13 + \reimp +*/ +bool QListModel::moveRows(const QModelIndex &sourceParent, int sourceRow, int count, const QModelIndex &destinationParent, int destinationChild) +{ + if (sourceRow < 0 + || sourceRow + count - 1 >= rowCount(sourceParent) + || destinationChild <= 0 + || destinationChild > rowCount(destinationParent) + || sourceRow == destinationChild - 1 + || count <= 0) { + return false; + } + if (!beginMoveRows(QModelIndex(), sourceRow, sourceRow + count - 1, QModelIndex(), destinationChild)) + return false; + destinationChild--; + const int fromRow = destinationChild < sourceRow ? (sourceRow + count - 1) : sourceRow; + while (count--) + items.move(fromRow, destinationChild); + endMoveRows(); + return true; +} + Qt::ItemFlags QListModel::flags(const QModelIndex &index) const { if (!index.isValid() || index.row() >= items.count() || index.model() != this) @@ -289,7 +329,7 @@ void QListModel::sort(int column, Qt::SortOrder order) if (column != 0) return; - emit layoutAboutToBeChanged(); + emit layoutAboutToBeChanged({}, QAbstractItemModel::VerticalSortHint); QVector < QPair<QListWidgetItem*,int> > sorting(items.count()); for (int i = 0; i < items.count(); ++i) { @@ -313,7 +353,7 @@ void QListModel::sort(int column, Qt::SortOrder order) } changePersistentIndexList(fromIndexes, toIndexes); - emit layoutChanged(); + emit layoutChanged({}, QAbstractItemModel::VerticalSortHint); } /** @@ -594,14 +634,14 @@ Qt::DropActions QListModel::supportedDropActions() const \sa type() */ -QListWidgetItem::QListWidgetItem(QListWidget *view, int type) - : rtti(type), view(view), d(new QListWidgetItemPrivate(this)), +QListWidgetItem::QListWidgetItem(QListWidget *listview, int type) + : rtti(type), view(listview), d(new QListWidgetItemPrivate(this)), itemFlags(Qt::ItemIsSelectable |Qt::ItemIsUserCheckable |Qt::ItemIsEnabled |Qt::ItemIsDragEnabled) { - if (QListModel *model = (view ? qobject_cast<QListModel*>(view->model()) : 0)) + if (QListModel *model = listModel()) model->insert(model->rowCount(), this); } @@ -621,16 +661,18 @@ QListWidgetItem::QListWidgetItem(QListWidget *view, int type) \sa type() */ -QListWidgetItem::QListWidgetItem(const QString &text, QListWidget *view, int type) - : rtti(type), view(0), d(new QListWidgetItemPrivate(this)), +QListWidgetItem::QListWidgetItem(const QString &text, QListWidget *listview, int type) + : rtti(type), view(listview), d(new QListWidgetItemPrivate(this)), itemFlags(Qt::ItemIsSelectable |Qt::ItemIsUserCheckable |Qt::ItemIsEnabled |Qt::ItemIsDragEnabled) { - setData(Qt::DisplayRole, text); - this->view = view; - if (QListModel *model = (view ? qobject_cast<QListModel*>(view->model()) : 0)) + { + QSignalBlocker b(view); + setData(Qt::DisplayRole, text); + } + if (QListModel *model = listModel()) model->insert(model->rowCount(), this); } @@ -652,17 +694,19 @@ QListWidgetItem::QListWidgetItem(const QString &text, QListWidget *view, int typ \sa type() */ QListWidgetItem::QListWidgetItem(const QIcon &icon,const QString &text, - QListWidget *view, int type) - : rtti(type), view(0), d(new QListWidgetItemPrivate(this)), + QListWidget *listview, int type) + : rtti(type), view(listview), d(new QListWidgetItemPrivate(this)), itemFlags(Qt::ItemIsSelectable |Qt::ItemIsUserCheckable |Qt::ItemIsEnabled |Qt::ItemIsDragEnabled) { - setData(Qt::DisplayRole, text); - setData(Qt::DecorationRole, icon); - this->view = view; - if (QListModel *model = (view ? qobject_cast<QListModel*>(view->model()) : 0)) + { + QSignalBlocker b(view); + setData(Qt::DisplayRole, text); + setData(Qt::DecorationRole, icon); + } + if (QListModel *model = listModel()) model->insert(model->rowCount(), this); } @@ -671,7 +715,7 @@ QListWidgetItem::QListWidgetItem(const QIcon &icon,const QString &text, */ QListWidgetItem::~QListWidgetItem() { - if (QListModel *model = (view ? qobject_cast<QListModel*>(view->model()) : 0)) + if (QListModel *model = listModel()) model->remove(this); delete d; } @@ -708,7 +752,7 @@ void QListWidgetItem::setData(int role, const QVariant &value) } if (!found) d->values.append(QWidgetItemData(role, value)); - if (QListModel *model = (view ? qobject_cast<QListModel*>(view->model()) : nullptr)) { + if (QListModel *model = listModel()) { const QVector<int> roles((role == Qt::DisplayRole) ? QVector<int>({Qt::DisplayRole, Qt::EditRole}) : QVector<int>({role})); @@ -775,7 +819,7 @@ void QListWidgetItem::write(QDataStream &out) const \sa data(), flags() */ QListWidgetItem::QListWidgetItem(const QListWidgetItem &other) - : rtti(Type), view(0), + : rtti(Type), view(nullptr), d(new QListWidgetItemPrivate(this)), itemFlags(other.itemFlags) { @@ -797,6 +841,15 @@ QListWidgetItem &QListWidgetItem::operator=(const QListWidgetItem &other) return *this; } +/*! + \internal + returns the QListModel if a view is set + */ +QListModel *QListWidgetItem::listModel() const +{ + return (view ? qobject_cast<QListModel*>(view->model()) : nullptr); +} + #ifndef QT_NO_DATASTREAM /*! @@ -958,7 +1011,7 @@ QDataStream &operator>>(QDataStream &in, QListWidgetItem &item) void QListWidgetItem::setFlags(Qt::ItemFlags aflags) { itemFlags = aflags; - if (QListModel *model = (view ? qobject_cast<QListModel*>(view->model()) : 0)) + if (QListModel *model = listModel()) model->itemChanged(this); } diff --git a/src/widgets/itemviews/qlistwidget.h b/src/widgets/itemviews/qlistwidget.h index 947fdb1a2f..e96f639502 100644 --- a/src/widgets/itemviews/qlistwidget.h +++ b/src/widgets/itemviews/qlistwidget.h @@ -61,10 +61,10 @@ class Q_WIDGETS_EXPORT QListWidgetItem friend class QListWidget; public: enum ItemType { Type = 0, UserType = 1000 }; - explicit QListWidgetItem(QListWidget *view = nullptr, int type = Type); - explicit QListWidgetItem(const QString &text, QListWidget *view = nullptr, int type = Type); + explicit QListWidgetItem(QListWidget *listview = nullptr, int type = Type); + explicit QListWidgetItem(const QString &text, QListWidget *listview = nullptr, int type = Type); explicit QListWidgetItem(const QIcon &icon, const QString &text, - QListWidget *view = nullptr, int type = Type); + QListWidget *listview = nullptr, int type = Type); QListWidgetItem(const QListWidgetItem &other); virtual ~QListWidgetItem(); @@ -114,20 +114,28 @@ public: inline void setTextAlignment(int alignment) { setData(Qt::TextAlignmentRole, alignment); } +#if QT_DEPRECATED_SINCE(5, 13) + QT_DEPRECATED_X ("Use QListWidgetItem::background() instead") inline QColor backgroundColor() const - { return qvariant_cast<QColor>(data(Qt::BackgroundColorRole)); } + { return qvariant_cast<QColor>(data(Qt::BackgroundRole)); } + QT_DEPRECATED_X ("Use QListWidgetItem::setBackground() instead") virtual void setBackgroundColor(const QColor &color) - { setData(Qt::BackgroundColorRole, color); } + { setData(Qt::BackgroundRole, color); } +#endif inline QBrush background() const { return qvariant_cast<QBrush>(data(Qt::BackgroundRole)); } inline void setBackground(const QBrush &brush) { setData(Qt::BackgroundRole, brush); } +#if QT_DEPRECATED_SINCE(5, 13) + QT_DEPRECATED_X ("Use QListWidgetItem::foreground() instead") inline QColor textColor() const - { return qvariant_cast<QColor>(data(Qt::TextColorRole)); } + { return qvariant_cast<QColor>(data(Qt::ForegroundRole)); } + QT_DEPRECATED_X ("Use QListWidgetItem::setForeground() instead") inline void setTextColor(const QColor &color) - { setData(Qt::TextColorRole, color); } + { setData(Qt::ForegroundRole, color); } +#endif inline QBrush foreground() const { return qvariant_cast<QBrush>(data(Qt::ForegroundRole)); } @@ -158,6 +166,8 @@ public: inline int type() const { return rtti; } private: + QListModel *listModel() const; +private: int rtti; QVector<void *> dummy; QListWidget *view; diff --git a/src/widgets/itemviews/qlistwidget_p.h b/src/widgets/itemviews/qlistwidget_p.h index 9cb3d5966b..65a7124322 100644 --- a/src/widgets/itemviews/qlistwidget_p.h +++ b/src/widgets/itemviews/qlistwidget_p.h @@ -100,11 +100,15 @@ public: QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; bool setData(const QModelIndex &index, const QVariant &value, int role) override; +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + bool clearItemData(const QModelIndex &index) override; +#endif QMap<int, QVariant> itemData(const QModelIndex &index) const override; bool insertRows(int row, int count = 1, const QModelIndex &parent = QModelIndex()) override; bool removeRows(int row, int count = 1, const QModelIndex &parent = QModelIndex()) override; + bool moveRows(const QModelIndex &sourceParent, int sourceRow, int count, const QModelIndex &destinationParent, int destinationChild) override; Qt::ItemFlags flags(const QModelIndex &index) const override; diff --git a/src/widgets/itemviews/qstyleditemdelegate.cpp b/src/widgets/itemviews/qstyleditemdelegate.cpp index 0f7566e8ec..22067851cb 100644 --- a/src/widgets/itemviews/qstyleditemdelegate.cpp +++ b/src/widgets/itemviews/qstyleditemdelegate.cpp @@ -139,7 +139,7 @@ public: \row \li \l Qt::AccessibleDescriptionRole \li QString \row \li \l Qt::AccessibleTextRole \li QString \endomit - \row \li \l Qt::BackgroundRole \li QBrush + \row \li \l Qt::BackgroundRole \li QBrush (\since 4.2) \row \li \l Qt::BackgroundColorRole \li QColor (obsolete; use Qt::BackgroundRole instead) \row \li \l Qt::CheckStateRole \li Qt::CheckState \row \li \l Qt::DecorationRole \li QIcon, QPixmap, QImage and QColor @@ -151,7 +151,7 @@ public: \row \li \l Qt::StatusTipRole \li \endomit \row \li \l Qt::TextAlignmentRole \li Qt::Alignment - \row \li \l Qt::ForegroundRole \li QBrush + \row \li \l Qt::ForegroundRole \li QBrush (\since 4.2) \row \li \l Qt::TextColorRole \li QColor (obsolete; use Qt::ForegroundRole instead) \omit \row \li \l Qt::ToolTipRole diff --git a/src/widgets/itemviews/qtableview.cpp b/src/widgets/itemviews/qtableview.cpp index 9725a768de..dac8174a2a 100644 --- a/src/widgets/itemviews/qtableview.cpp +++ b/src/widgets/itemviews/qtableview.cpp @@ -904,6 +904,15 @@ void QTableViewPrivate::_q_updateSpanRemovedColumns(const QModelIndex &parent, i /*! \internal + Sort the model when the header sort indicator changed +*/ +void QTableViewPrivate::_q_sortIndicatorChanged(int column, Qt::SortOrder order) +{ + model->sort(column, order); +} + +/*! + \internal Draws a table cell. */ void QTableViewPrivate::drawCell(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) @@ -1111,8 +1120,6 @@ QSize QTableView::viewportSizeHint() const Q_D(const QTableView); QSize result( (d->verticalHeader->isHidden() ? 0 : d->verticalHeader->width()) + d->horizontalHeader->length(), (d->horizontalHeader->isHidden() ? 0 : d->horizontalHeader->height()) + d->verticalHeader->length()); - result += QSize(verticalScrollBar()->isVisible() ? verticalScrollBar()->width() : 0, - horizontalScrollBar()->isVisible() ? horizontalScrollBar()->height() : 0); return result; } @@ -1383,12 +1390,12 @@ void QTableView::paintEvent(QPaintEvent *event) //firstVisualRow is the visual index of the first visible row. lastVisualRow is the visual index of the last visible Row. //same goes for ...VisualColumn int firstVisualRow = qMax(verticalHeader->visualIndexAt(0),0); - int lastVisualRow = verticalHeader->visualIndexAt(verticalHeader->viewport()->height()); + int lastVisualRow = verticalHeader->visualIndexAt(verticalHeader->height()); if (lastVisualRow == -1) lastVisualRow = d->model->rowCount(d->root) - 1; int firstVisualColumn = horizontalHeader->visualIndexAt(0); - int lastVisualColumn = horizontalHeader->visualIndexAt(horizontalHeader->viewport()->width()); + int lastVisualColumn = horizontalHeader->visualIndexAt(horizontalHeader->width()); if (rightToLeft) qSwap(firstVisualColumn, lastVisualColumn); if (firstVisualColumn == -1) @@ -2575,25 +2582,27 @@ void QTableView::setColumnHidden(int column, bool hide) void QTableView::setSortingEnabled(bool enable) { Q_D(QTableView); - d->sortingEnabled = enable; horizontalHeader()->setSortIndicatorShown(enable); if (enable) { disconnect(d->horizontalHeader, SIGNAL(sectionEntered(int)), this, SLOT(_q_selectColumn(int))); disconnect(horizontalHeader(), SIGNAL(sectionPressed(int)), this, SLOT(selectColumn(int))); - connect(horizontalHeader(), SIGNAL(sortIndicatorChanged(int,Qt::SortOrder)), - this, SLOT(sortByColumn(int)), Qt::UniqueConnection); + //sortByColumn has to be called before we connect or set the sortingEnabled flag + // because otherwise it will not call sort on the model. sortByColumn(horizontalHeader()->sortIndicatorSection(), horizontalHeader()->sortIndicatorOrder()); + connect(horizontalHeader(), SIGNAL(sortIndicatorChanged(int,Qt::SortOrder)), + this, SLOT(_q_sortIndicatorChanged(int,Qt::SortOrder)), Qt::UniqueConnection); } else { connect(d->horizontalHeader, SIGNAL(sectionEntered(int)), this, SLOT(_q_selectColumn(int)), Qt::UniqueConnection); connect(horizontalHeader(), SIGNAL(sectionPressed(int)), this, SLOT(selectColumn(int)), Qt::UniqueConnection); disconnect(horizontalHeader(), SIGNAL(sortIndicatorChanged(int,Qt::SortOrder)), - this, SLOT(sortByColumn(int))); + this, SLOT(_q_sortIndicatorChanged(int,Qt::SortOrder))); } + d->sortingEnabled = enable; } bool QTableView::isSortingEnabled() const @@ -3122,19 +3131,21 @@ void QTableView::resizeColumnsToContents() d->horizontalHeader->resizeSections(QHeaderView::ResizeToContents); } +#if QT_DEPRECATED_SINCE(5, 13) /*! \obsolete \overload + This function is deprecated. Use + sortByColumn(int column, Qt::SortOrder order) instead. Sorts the model by the values in the given \a column. */ void QTableView::sortByColumn(int column) { Q_D(QTableView); - if (column == -1) - return; - d->model->sort(column, d->horizontalHeader->sortIndicatorOrder()); + sortByColumn(column, d->horizontalHeader->sortIndicatorOrder()); } +#endif /*! \since 4.2 @@ -3146,8 +3157,14 @@ void QTableView::sortByColumn(int column) void QTableView::sortByColumn(int column, Qt::SortOrder order) { Q_D(QTableView); + if (column < 0) + return; + // If sorting is enabled it will emit a signal connected to + // _q_sortIndicatorChanged, which then actually sorts d->horizontalHeader->setSortIndicator(column, order); - sortByColumn(column); + // If sorting is not enabled, force to sort now + if (!d->sortingEnabled) + d->model->sort(column, order); } /*! diff --git a/src/widgets/itemviews/qtableview.h b/src/widgets/itemviews/qtableview.h index 60c2f34103..3275c09f88 100644 --- a/src/widgets/itemviews/qtableview.h +++ b/src/widgets/itemviews/qtableview.h @@ -118,7 +118,6 @@ public: int columnSpan(int row, int column) const; void clearSpans(); - void sortByColumn(int column, Qt::SortOrder order); public Q_SLOTS: void selectRow(int row); @@ -131,7 +130,11 @@ public Q_SLOTS: void resizeRowsToContents(); void resizeColumnToContents(int column); void resizeColumnsToContents(); +#if QT_DEPRECATED_SINCE(5, 13) + QT_DEPRECATED_X ("Use QTableView::sortByColumn(int column, Qt::SortOrder order) instead") void sortByColumn(int column); +#endif + void sortByColumn(int column, Qt::SortOrder order); void setShowGrid(bool show); protected Q_SLOTS: @@ -188,6 +191,7 @@ private: Q_PRIVATE_SLOT(d_func(), void _q_updateSpanInsertedColumns(QModelIndex,int,int)) Q_PRIVATE_SLOT(d_func(), void _q_updateSpanRemovedRows(QModelIndex,int,int)) Q_PRIVATE_SLOT(d_func(), void _q_updateSpanRemovedColumns(QModelIndex,int,int)) + Q_PRIVATE_SLOT(d_func(), void _q_sortIndicatorChanged(int column, Qt::SortOrder order)) }; QT_END_NAMESPACE diff --git a/src/widgets/itemviews/qtableview_p.h b/src/widgets/itemviews/qtableview_p.h index 805787597c..520fd9a3af 100644 --- a/src/widgets/itemviews/qtableview_p.h +++ b/src/widgets/itemviews/qtableview_p.h @@ -257,6 +257,7 @@ public: void _q_updateSpanInsertedColumns(const QModelIndex &parent, int start, int end); void _q_updateSpanRemovedRows(const QModelIndex &parent, int start, int end); void _q_updateSpanRemovedColumns(const QModelIndex &parent, int start, int end); + void _q_sortIndicatorChanged(int column, Qt::SortOrder order); }; QT_END_NAMESPACE diff --git a/src/widgets/itemviews/qtablewidget.cpp b/src/widgets/itemviews/qtablewidget.cpp index 2d539e10ba..0916079cfc 100644 --- a/src/widgets/itemviews/qtablewidget.cpp +++ b/src/widgets/itemviews/qtablewidget.cpp @@ -189,7 +189,7 @@ void QTableModel::setItem(int row, int column, QTableWidgetItem *item) sortedRow = qMax((int)(it - colItems.begin()), 0); } if (sortedRow != row) { - emit layoutAboutToBeChanged(); + emit layoutAboutToBeChanged({}, QAbstractItemModel::VerticalSortHint); // move the items @ row to sortedRow int cc = columnCount(); QVector<QTableWidgetItem*> rowItems(cc); @@ -209,7 +209,7 @@ void QTableModel::setItem(int row, int column, QTableWidgetItem *item) changePersistentIndexList(oldPersistentIndexes, newPersistentIndexes); - emit layoutChanged(); + emit layoutChanged({}, QAbstractItemModel::VerticalSortHint); return; } } @@ -480,6 +480,24 @@ bool QTableModel::setItemData(const QModelIndex &index, const QMap<int, QVariant return true; } +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) +bool QTableModel::clearItemData(const QModelIndex &index) +{ + if (!checkIndex(index, CheckIndexOption::IndexIsValid)) + return false; + QTableWidgetItem *itm = item(index); + if (!itm) + return false; + const auto beginIter = itm->values.cbegin(); + const auto endIter = itm->values.cend(); + if (std::all_of(beginIter, endIter, [](const QWidgetItemData& data) -> bool { return !data.value.isValid(); })) + return true; //it's already cleared + itm->values.clear(); + emit dataChanged(index, index, QVector<int>{}); + return true; +} +#endif + Qt::ItemFlags QTableModel::flags(const QModelIndex &index) const { if (!index.isValid()) @@ -530,12 +548,12 @@ void QTableModel::sort(int column, Qt::SortOrder order) } } - emit layoutAboutToBeChanged(); + emit layoutAboutToBeChanged({}, QAbstractItemModel::VerticalSortHint); tableItems = sorted_table; changePersistentIndexList(from, to); // ### slow - emit layoutChanged(); + emit layoutChanged({}, QAbstractItemModel::VerticalSortHint); } /* @@ -580,7 +598,7 @@ void QTableModel::ensureSorted(int column, Qt::SortOrder order, vit = colItems.insert(vit, item); if (newRow != oldRow) { if (!changed) { - emit layoutAboutToBeChanged(); + emit layoutAboutToBeChanged({}, QAbstractItemModel::VerticalSortHint); oldPersistentIndexes = persistentIndexList(); newPersistentIndexes = oldPersistentIndexes; changed = true; @@ -615,7 +633,7 @@ void QTableModel::ensureSorted(int column, Qt::SortOrder order, verticalHeaderItems = newVertical; changePersistentIndexList(oldPersistentIndexes, newPersistentIndexes); - emit layoutChanged(); + emit layoutChanged({}, QAbstractItemModel::VerticalSortHint); } } @@ -1037,24 +1055,6 @@ QTableWidgetSelectionRange::~QTableWidgetSelectionRange() */ /*! - \fn void QTableWidgetItem::setSelected(bool select) - \since 4.2 - - Sets the selected state of the item to \a select. - - \sa isSelected() -*/ - -/*! - \fn bool QTableWidgetItem::isSelected() const - \since 4.2 - - Returns \c true if the item is selected, otherwise returns \c false. - - \sa setSelected() -*/ - -/*! \fn QSize QTableWidgetItem::sizeHint() const \since 4.1 @@ -1091,6 +1091,44 @@ QTableWidgetSelectionRange::~QTableWidgetSelectionRange() */ /*! + \fn bool QTableWidgetItem::isSelected() const + \since 4.2 + + Returns \c true if the item is selected, otherwise returns \c false. + + \sa setSelected() +*/ +bool QTableWidgetItem::isSelected() const +{ + if (!view || !view->selectionModel()) + return false; + const QTableModel *model = qobject_cast<const QTableModel*>(view->model()); + if (!model) + return false; + const QModelIndex index = model->index(this); + return view->selectionModel()->isSelected(index); +} + +/*! + \fn void QTableWidgetItem::setSelected(bool select) + \since 4.2 + + Sets the selected state of the item to \a select. + + \sa isSelected() +*/ +void QTableWidgetItem::setSelected(bool select) +{ + if (!view || !view->selectionModel()) + return; + const QTableModel *model = qobject_cast<const QTableModel*>(view->model()); + if (!model) + return; + const QModelIndex index = model->index(this); + view->selectionModel()->select(index, select ? QItemSelectionModel::Select : QItemSelectionModel::Deselect); +} + +/*! \fn Qt::ItemFlags QTableWidgetItem::flags() const Returns the flags used to describe the item. These determine whether @@ -1110,7 +1148,7 @@ QTableWidgetSelectionRange::~QTableWidgetSelectionRange() void QTableWidgetItem::setFlags(Qt::ItemFlags aflags) { itemFlags = aflags; - if (QTableModel *model = (view ? qobject_cast<QTableModel*>(view->model()) : 0)) + if (QTableModel *model = tableModel()) model->itemChanged(this); } @@ -1301,7 +1339,7 @@ void QTableWidgetItem::setFlags(Qt::ItemFlags aflags) \sa type() */ QTableWidgetItem::QTableWidgetItem(int type) - : rtti(type), view(0), d(new QTableWidgetItemPrivate(this)), + : rtti(type), view(nullptr), d(new QTableWidgetItemPrivate(this)), itemFlags(Qt::ItemIsEditable |Qt::ItemIsSelectable |Qt::ItemIsUserCheckable @@ -1317,7 +1355,7 @@ QTableWidgetItem::QTableWidgetItem(int type) \sa type() */ QTableWidgetItem::QTableWidgetItem(const QString &text, int type) - : rtti(type), view(0), d(new QTableWidgetItemPrivate(this)), + : rtti(type), view(nullptr), d(new QTableWidgetItemPrivate(this)), itemFlags(Qt::ItemIsEditable |Qt::ItemIsSelectable |Qt::ItemIsUserCheckable @@ -1334,7 +1372,7 @@ QTableWidgetItem::QTableWidgetItem(const QString &text, int type) \sa type() */ QTableWidgetItem::QTableWidgetItem(const QIcon &icon, const QString &text, int type) - : rtti(type), view(0), d(new QTableWidgetItemPrivate(this)), + : rtti(type), view(nullptr), d(new QTableWidgetItemPrivate(this)), itemFlags(Qt::ItemIsEditable |Qt::ItemIsSelectable |Qt::ItemIsUserCheckable @@ -1351,9 +1389,8 @@ QTableWidgetItem::QTableWidgetItem(const QIcon &icon, const QString &text, int t */ QTableWidgetItem::~QTableWidgetItem() { - if (QTableModel *model = (view ? qobject_cast<QTableModel*>(view->model()) : 0)) + if (QTableModel *model = tableModel()) model->removeItem(this); - view = 0; delete d; } @@ -1389,7 +1426,7 @@ void QTableWidgetItem::setData(int role, const QVariant &value) } if (!found) values.append(QWidgetItemData(role, value)); - if (QTableModel *model = (view ? qobject_cast<QTableModel*>(view->model()) : nullptr)) + if (QTableModel *model = tableModel()) { const QVector<int> roles((role == Qt::DisplayRole) ? QVector<int>({Qt::DisplayRole, Qt::EditRole}) : @@ -1444,6 +1481,16 @@ void QTableWidgetItem::write(QDataStream &out) const } /*! + \internal + returns the QTableModel if a view is set +*/ +QTableModel *QTableWidgetItem::tableModel() const +{ + return (view ? qobject_cast<QTableModel*>(view->model()) : nullptr); +} + + +/*! \relates QTableWidgetItem Reads a table widget item from stream \a in into \a item. @@ -1486,7 +1533,7 @@ QDataStream &operator<<(QDataStream &out, const QTableWidgetItem &item) \sa data(), flags() */ QTableWidgetItem::QTableWidgetItem(const QTableWidgetItem &other) - : rtti(Type), values(other.values), view(0), + : rtti(Type), values(other.values), view(nullptr), d(new QTableWidgetItemPrivate(this)), itemFlags(other.itemFlags) { @@ -2305,6 +2352,7 @@ void QTableWidget::setCellWidget(int row, int column, QWidget *widget) QAbstractItemView::setIndexWidget(index, widget); } +#if QT_DEPRECATED_SINCE(5, 13) /*! Returns \c true if the \a item is selected, otherwise returns \c false. @@ -2315,9 +2363,7 @@ void QTableWidget::setCellWidget(int row, int column, QWidget *widget) bool QTableWidget::isItemSelected(const QTableWidgetItem *item) const { - Q_D(const QTableWidget); - QModelIndex index = d->tableModel()->index(item); - return selectionModel()->isSelected(index); + return ((item && item->tableWidget() == this) ? item->isSelected() : false); } /*! @@ -2329,10 +2375,10 @@ bool QTableWidget::isItemSelected(const QTableWidgetItem *item) const */ void QTableWidget::setItemSelected(const QTableWidgetItem *item, bool select) { - Q_D(QTableWidget); - QModelIndex index = d->tableModel()->index(item); - selectionModel()->select(index, select ? QItemSelectionModel::Select : QItemSelectionModel::Deselect); + if (item && item->tableWidget() == this) + const_cast<QTableWidgetItem*>(item)->setSelected(select); } +#endif /*! Selects or deselects the \a range depending on \a select. diff --git a/src/widgets/itemviews/qtablewidget.h b/src/widgets/itemviews/qtablewidget.h index 9de27d164f..d93032f3f0 100644 --- a/src/widgets/itemviews/qtablewidget.h +++ b/src/widgets/itemviews/qtablewidget.h @@ -92,8 +92,8 @@ public: inline int row() const; inline int column() const; - inline void setSelected(bool select); - inline bool isSelected() const; + void setSelected(bool select); + bool isSelected() const; inline Qt::ItemFlags flags() const { return itemFlags; } void setFlags(Qt::ItemFlags flags); @@ -131,20 +131,28 @@ public: inline void setTextAlignment(int alignment) { setData(Qt::TextAlignmentRole, alignment); } +#if QT_DEPRECATED_SINCE(5, 13) + QT_DEPRECATED_X ("Use QTableWidgetItem::background() instead") inline QColor backgroundColor() const - { return qvariant_cast<QColor>(data(Qt::BackgroundColorRole)); } + { return qvariant_cast<QColor>(data(Qt::BackgroundRole)); } + QT_DEPRECATED_X ("Use QTableWidgetItem::setBackground() instead") inline void setBackgroundColor(const QColor &color) - { setData(Qt::BackgroundColorRole, color); } + { setData(Qt::BackgroundRole, color); } +#endif inline QBrush background() const { return qvariant_cast<QBrush>(data(Qt::BackgroundRole)); } inline void setBackground(const QBrush &brush) { setData(Qt::BackgroundRole, brush); } +#if QT_DEPRECATED_SINCE(5, 13) + QT_DEPRECATED_X ("Use QTableWidgetItem::foreground() instead") inline QColor textColor() const - { return qvariant_cast<QColor>(data(Qt::TextColorRole)); } + { return qvariant_cast<QColor>(data(Qt::ForegroundRole)); } + QT_DEPRECATED_X ("Use QTableWidgetItem::setForeground() instead") inline void setTextColor(const QColor &color) - { setData(Qt::TextColorRole, color); } + { setData(Qt::ForegroundRole, color); } +#endif inline QBrush foreground() const { return qvariant_cast<QBrush>(data(Qt::ForegroundRole)); } @@ -175,6 +183,9 @@ public: inline int type() const { return rtti; } private: + QTableModel *tableModel() const; + +private: int rtti; QVector<QWidgetItemData> values; QTableWidget *view; @@ -268,8 +279,12 @@ public: void setCellWidget(int row, int column, QWidget *widget); inline void removeCellWidget(int row, int column); +#if QT_DEPRECATED_SINCE(5, 13) + QT_DEPRECATED_X ("Use QTableWidgetItem::isSelected() instead") bool isItemSelected(const QTableWidgetItem *item) const; + QT_DEPRECATED_X ("Use QTableWidgetItem::setSelected() instead") void setItemSelected(const QTableWidgetItem *item, bool select); +#endif void setRangeSelected(const QTableWidgetSelectionRange &range, bool select); QList<QTableWidgetSelectionRange> selectedRanges() const; @@ -375,12 +390,6 @@ inline int QTableWidgetItem::row() const inline int QTableWidgetItem::column() const { return (view ? view->column(this) : -1); } -inline void QTableWidgetItem::setSelected(bool aselect) -{ if (view) view->setItemSelected(this, aselect); } - -inline bool QTableWidgetItem::isSelected() const -{ return (view ? view->isItemSelected(this) : false); } - QT_END_NAMESPACE #endif // QTABLEWIDGET_H diff --git a/src/widgets/itemviews/qtablewidget_p.h b/src/widgets/itemviews/qtablewidget_p.h index 9899272fce..d88326f129 100644 --- a/src/widgets/itemviews/qtablewidget_p.h +++ b/src/widgets/itemviews/qtablewidget_p.h @@ -129,6 +129,9 @@ public: QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; bool setData(const QModelIndex &index, const QVariant &value, int role) override; bool setItemData(const QModelIndex &index, const QMap<int, QVariant> &roles) override; +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + bool clearItemData(const QModelIndex &index) override; +#endif QMap<int, QVariant> itemData(const QModelIndex &index) const override; diff --git a/src/widgets/itemviews/qtreeview.cpp b/src/widgets/itemviews/qtreeview.cpp index f3647f656a..e7196c9d5d 100644 --- a/src/widgets/itemviews/qtreeview.cpp +++ b/src/widgets/itemviews/qtreeview.cpp @@ -1089,15 +1089,8 @@ void QTreeView::keyboardSearch(const QString &search) if (start.column() > 0) index = index.sibling(index.row(), start.column()); - if (index.isValid()) { - QItemSelectionModel::SelectionFlags flags = (d->selectionMode == SingleSelection - ? QItemSelectionModel::SelectionFlags( - QItemSelectionModel::ClearAndSelect - |d->selectionBehaviorFlags()) - : QItemSelectionModel::SelectionFlags( - QItemSelectionModel::NoUpdate)); - selectionModel()->setCurrentIndex(index, flags); - } + if (index.isValid()) + setCurrentIndex(index); } /*! @@ -1992,21 +1985,7 @@ void QTreeView::keyPressEvent(QKeyEvent *event) if (d->isIndexValid(current) && d->model && d->itemsExpandable) { switch (event->key()) { case Qt::Key_Asterisk: { - // do layouting only once after expanding is done - d->doDelayedItemsLayout(); - QStack<QModelIndex> parents; - parents.push(current); - while (!parents.isEmpty()) { - QModelIndex parent = parents.pop(); - for (int row = 0; row < d->model->rowCount(parent); ++row) { - QModelIndex child = d->model->index(row, 0, parent); - if (!d->isIndexValid(child)) - break; - parents.push(child); - expand(child); - } - } - expand(current); + expandRecursively(current); break; } case Qt::Key_Plus: expand(current); @@ -2160,12 +2139,10 @@ int QTreeView::verticalOffset() const // ### find a faster way to do this d->executePostedLayout(); int offset = 0; - for (int i = 0; i < d->viewItems.count(); ++i) { - if (i == verticalScrollBar()->value()) - return offset; + const int cnt = std::min(d->viewItems.count(), verticalScrollBar()->value()); + for (int i = 0; i < cnt; ++i) offset += d->itemHeight(i); - } - return 0; + return offset; } // scroll per pixel return verticalScrollBar()->value(); @@ -2621,10 +2598,13 @@ void QTreeView::resizeColumnToContents(int column) d->header->resizeSection(column, qMax(contents, header)); } +#if QT_DEPRECATED_SINCE(5, 13) /*! \obsolete \overload + This function is deprecated. Use + sortByColumn(int column, Qt::SortOrder order) instead. Sorts the model by the values in the given \a column. */ void QTreeView::sortByColumn(int column) @@ -2632,6 +2612,7 @@ void QTreeView::sortByColumn(int column) Q_D(QTreeView); sortByColumn(column, d->header->sortIndicatorOrder()); } +#endif /*! \since 4.2 @@ -2647,10 +2628,12 @@ void QTreeView::sortByColumn(int column) void QTreeView::sortByColumn(int column, Qt::SortOrder order) { Q_D(QTreeView); - - //If sorting is enabled will emit a signal connected to _q_sortIndicatorChanged, which then actually sorts + if (column < 0) + return; + // If sorting is enabled it will emit a signal connected to + // _q_sortIndicatorChanged, which then actually sorts d->header->setSortIndicator(column, order); - //If sorting is not enabled, force to sort now. + // If sorting is not enabled, force to sort now if (!d->sortingEnabled) d->model->sort(column, order); } @@ -2694,11 +2677,7 @@ QSize QTreeView::viewportSizeHint() const QSize result = QSize(d->header->length(), deepestRect.bottom() + 1); // add size for header - result += QSize(0, d->header->isVisible() ? d->header->height() : 0); - - // add size for scrollbars - result += QSize(verticalScrollBar()->isVisible() ? verticalScrollBar()->width() : 0, - horizontalScrollBar()->isVisible() ? horizontalScrollBar()->height() : 0); + result += QSize(0, d->header->isHidden() ? 0 : d->header->height()); return result; } @@ -2707,7 +2686,7 @@ QSize QTreeView::viewportSizeHint() const \since 4.2 Expands all expandable items. - Warning: if the model contains a large number of items, + \warning: if the model contains a large number of items, this function will take some time to execute. \sa collapseAll(), expand(), collapse(), setExpanded() @@ -2723,6 +2702,50 @@ void QTreeView::expandAll() } /*! + \since 5.13 + Expands the item at the given \a index and all its children to the + given \a depth. The \a depth is relative to the given \a index. + A \a depth of -1 will expand all children, a \a depth of 0 will + only expand the given \a index. + + \warning: if the model contains a large number of items, + this function will take some time to execute. + + \sa expandAll() +*/ +void QTreeView::expandRecursively(const QModelIndex &index, int depth) +{ + Q_D(QTreeView); + + if (depth < -1) + return; + // do layouting only once after expanding is done + d->doDelayedItemsLayout(); + expand(index); + if (depth == 0) + return; + QStack<QPair<QModelIndex, int>> parents; + parents.push({index, 0}); + while (!parents.isEmpty()) { + const QPair<QModelIndex, int> elem = parents.pop(); + const QModelIndex &parent = elem.first; + const int curDepth = elem.second; + const int rowCount = d->model->rowCount(parent); + for (int row = 0; row < rowCount; ++row) { + const QModelIndex child = d->model->index(row, 0, parent); + if (!d->isIndexValid(child)) + break; + if (depth == -1 || curDepth + 1 < depth) + parents.push({child, curDepth + 1}); + if (d->isIndexExpanded(child)) + continue; + if (d->storeExpanded(child)) + emit expanded(child); + } + } +} + +/*! \since 4.2 Collapses all expanded items. diff --git a/src/widgets/itemviews/qtreeview.h b/src/widgets/itemviews/qtreeview.h index 33dbf1c1ce..e9cc1beedb 100644 --- a/src/widgets/itemviews/qtreeview.h +++ b/src/widgets/itemviews/qtreeview.h @@ -143,7 +143,6 @@ public: void doItemsLayout() override; void reset() override; - void sortByColumn(int column, Qt::SortOrder order); void dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector<int> &roles = QVector<int>()) override; void selectAll() override; @@ -158,8 +157,13 @@ public Q_SLOTS: void expand(const QModelIndex &index); void collapse(const QModelIndex &index); void resizeColumnToContents(int column); +#if QT_DEPRECATED_SINCE(5, 13) + QT_DEPRECATED_X ("Use QTreeeView::sortByColumn(int column, Qt::SortOrder order) instead") void sortByColumn(int column); +#endif + void sortByColumn(int column, Qt::SortOrder order); void expandAll(); + void expandRecursively(const QModelIndex &index, int depth = -1); void collapseAll(); void expandToDepth(int depth); diff --git a/src/widgets/itemviews/qtreewidget.cpp b/src/widgets/itemviews/qtreewidget.cpp index a0af27115d..acd6ad6e41 100644 --- a/src/widgets/itemviews/qtreewidget.cpp +++ b/src/widgets/itemviews/qtreewidget.cpp @@ -390,6 +390,27 @@ bool QTreeModel::setData(const QModelIndex &index, const QVariant &value, int ro return false; } +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) +bool QTreeModel::clearItemData(const QModelIndex &index) +{ + if (!checkIndex(index, CheckIndexOption::IndexIsValid)) + return false; + QTreeWidgetItem *itm = item(index); + if (!itm) + return false; + const auto beginIter = itm->values.at(index.column()).cbegin(); + const auto endIter = itm->values.at(index.column()).cend(); + if (std::all_of(beginIter, endIter, [](const QWidgetItemData& data) -> bool { return !data.value.isValid(); }) + && !itm->d->display.at(index.column()).isValid()) { + return true; //it's already cleared + } + itm->d->display[index.column()] = QVariant(); + itm->values[index.column()].clear(); + emit dataChanged(index, index, QVector<int>{}); + return true; +} +#endif + QMap<int, QVariant> QTreeModel::itemData(const QModelIndex &index) const { QMap<int, QVariant> roles; @@ -635,7 +656,7 @@ void QTreeModel::ensureSorted(int column, Qt::SortOrder order, // we are going to change the persistent indexes, so we need to prepare if (!changed) { // this will only happen once changed = true; - emit layoutAboutToBeChanged(); // the selection model needs to know + emit layoutAboutToBeChanged({parent}, QAbstractItemModel::VerticalSortHint); // the selection model needs to know oldPersistentIndexes = persistentIndexList(); newPersistentIndexes = oldPersistentIndexes; } @@ -668,7 +689,7 @@ void QTreeModel::ensureSorted(int column, Qt::SortOrder order, if (changed) { itm->children = lst; changePersistentIndexList(oldPersistentIndexes, newPersistentIndexes); - emit layoutChanged(); + emit layoutChanged({parent}, QAbstractItemModel::VerticalSortHint); } } @@ -988,8 +1009,18 @@ void QTreeModel::timerEvent(QTimerEvent *ev) Sets the selected state of the item to \a select. \sa isSelected() - */ +void QTreeWidgetItem::setSelected(bool select) +{ + const QTreeModel *model = treeModel(); + if (!model || !view->selectionModel()) + return; + const QModelIndex index = model->index(this, 0); + view->selectionModel()->select(index, (select ? QItemSelectionModel::Select + : QItemSelectionModel::Deselect) + | QItemSelectionModel::Rows); + d->selected = select; +} /*! \fn bool QTreeWidgetItem::isSelected() const @@ -999,6 +1030,10 @@ void QTreeModel::timerEvent(QTimerEvent *ev) \sa setSelected() */ +bool QTreeWidgetItem::isSelected() const +{ + return d->selected; +} /*! \fn void QTreeWidgetItem::setHidden(bool hide) @@ -1012,12 +1047,18 @@ void QTreeModel::timerEvent(QTimerEvent *ev) \sa isHidden() */ -void QTreeWidgetItem::setHidden(bool ahide) +void QTreeWidgetItem::setHidden(bool hide) { - if (view) { - view->setItemHidden(this, ahide); - d->hidden = ahide; + const QTreeModel *model = treeModel(); + if (!model) + return; + if (this == model->headerItem) { + view->header()->setHidden(hide); + } else { + const QModelIndex index = view->d_func()->index(this); + view->setRowHidden(index.row(), index.parent(), hide); } + d->hidden = hide; } /*! @@ -1031,7 +1072,15 @@ void QTreeWidgetItem::setHidden(bool ahide) bool QTreeWidgetItem::isHidden() const { - return (view ? d->hidden : false); + const QTreeModel *model = treeModel(); + if (!model) + return false; + if (this == model->headerItem) + return view->header()->isHidden(); + if (view->d_func()->hiddenIndexes.isEmpty()) + return false; + QTreeModel::SkipSorting skipSorting(model); + return view->d_func()->isRowHidden(view->d_func()->index(this)); } /*! @@ -1043,6 +1092,14 @@ bool QTreeWidgetItem::isHidden() const \sa isExpanded() */ +void QTreeWidgetItem::setExpanded(bool expand) +{ + const QTreeModel *model = treeModel(); + if (!model) + return; + QTreeModel::SkipSorting skipSorting(model); + view->setExpanded(view->d_func()->index(this), expand); +} /*! \fn bool QTreeWidgetItem::isExpanded() const @@ -1052,6 +1109,14 @@ bool QTreeWidgetItem::isHidden() const \sa setExpanded() */ +bool QTreeWidgetItem::isExpanded() const +{ + const QTreeModel *model = treeModel(); + if (!model) + return false; + QTreeModel::SkipSorting skipSorting(model); + return view->isExpanded(view->d_func()->index(this)); +} /*! \fn void QTreeWidgetItem::setFirstColumnSpanned(bool span) @@ -1325,7 +1390,7 @@ bool QTreeWidgetItem::isHidden() const \sa type() */ QTreeWidgetItem::QTreeWidgetItem(int type) - : rtti(type), view(0), d(new QTreeWidgetItemPrivate(this)), par(0), + : rtti(type), view(nullptr), d(new QTreeWidgetItemPrivate(this)), par(nullptr), itemFlags(Qt::ItemIsSelectable |Qt::ItemIsUserCheckable |Qt::ItemIsEnabled @@ -1344,7 +1409,7 @@ QTreeWidgetItem::QTreeWidgetItem(int type) \sa type() */ QTreeWidgetItem::QTreeWidgetItem(const QStringList &strings, int type) - : rtti(type), view(0), d(new QTreeWidgetItemPrivate(this)), par(0), + : rtti(type), view(nullptr), d(new QTreeWidgetItemPrivate(this)), par(nullptr), itemFlags(Qt::ItemIsSelectable |Qt::ItemIsUserCheckable |Qt::ItemIsEnabled @@ -1364,16 +1429,16 @@ QTreeWidgetItem::QTreeWidgetItem(const QStringList &strings, int type) \sa type() */ -QTreeWidgetItem::QTreeWidgetItem(QTreeWidget *view, int type) - : rtti(type), view(0), d(new QTreeWidgetItemPrivate(this)), par(0), +QTreeWidgetItem::QTreeWidgetItem(QTreeWidget *treeview, int type) + : rtti(type), view(nullptr), d(new QTreeWidgetItemPrivate(this)), par(nullptr), itemFlags(Qt::ItemIsSelectable |Qt::ItemIsUserCheckable |Qt::ItemIsEnabled |Qt::ItemIsDragEnabled |Qt::ItemIsDropEnabled) { - if (view && view->model()) { - QTreeModel *model = qobject_cast<QTreeModel*>(view->model()); + // do not set this->view here otherwise insertChild() will fail + if (QTreeModel *model = treeModel(treeview)) { model->rootItem->addChild(this); values.reserve(model->headerItem->columnCount()); } @@ -1389,8 +1454,8 @@ QTreeWidgetItem::QTreeWidgetItem(QTreeWidget *view, int type) \sa type() */ -QTreeWidgetItem::QTreeWidgetItem(QTreeWidget *view, const QStringList &strings, int type) - : rtti(type), view(0), d(new QTreeWidgetItemPrivate(this)), par(0), +QTreeWidgetItem::QTreeWidgetItem(QTreeWidget *treeview, const QStringList &strings, int type) + : rtti(type), view(nullptr), d(new QTreeWidgetItemPrivate(this)), par(nullptr), itemFlags(Qt::ItemIsSelectable |Qt::ItemIsUserCheckable |Qt::ItemIsEnabled @@ -1399,8 +1464,8 @@ QTreeWidgetItem::QTreeWidgetItem(QTreeWidget *view, const QStringList &strings, { for (int i = 0; i < strings.count(); ++i) setText(i, strings.at(i)); - if (view && view->model()) { - QTreeModel *model = qobject_cast<QTreeModel*>(view->model()); + // do not set this->view here otherwise insertChild() will fail + if (QTreeModel *model = treeModel(treeview)) { model->rootItem->addChild(this); values.reserve(model->headerItem->columnCount()); } @@ -1414,21 +1479,19 @@ QTreeWidgetItem::QTreeWidgetItem(QTreeWidget *view, const QStringList &strings, \sa type() */ -QTreeWidgetItem::QTreeWidgetItem(QTreeWidget *view, QTreeWidgetItem *after, int type) - : rtti(type), view(0), d(new QTreeWidgetItemPrivate(this)), par(0), +QTreeWidgetItem::QTreeWidgetItem(QTreeWidget *treeview, QTreeWidgetItem *after, int type) + : rtti(type), view(nullptr), d(new QTreeWidgetItemPrivate(this)), par(nullptr), itemFlags(Qt::ItemIsSelectable |Qt::ItemIsUserCheckable |Qt::ItemIsEnabled |Qt::ItemIsDragEnabled |Qt::ItemIsDropEnabled) { - if (view) { - QTreeModel *model = qobject_cast<QTreeModel*>(view->model()); - if (model) { - int i = model->rootItem->children.indexOf(after) + 1; - model->rootItem->insertChild(i, this); - values.reserve(model->headerItem->columnCount()); - } + // do not set this->view here otherwise insertChild() will fail + if (QTreeModel *model = treeModel(treeview)) { + int i = model->rootItem->children.indexOf(after) + 1; + model->rootItem->insertChild(i, this); + values.reserve(model->headerItem->columnCount()); } } @@ -1438,7 +1501,7 @@ QTreeWidgetItem::QTreeWidgetItem(QTreeWidget *view, QTreeWidgetItem *after, int \sa type() */ QTreeWidgetItem::QTreeWidgetItem(QTreeWidgetItem *parent, int type) - : rtti(type), view(0), d(new QTreeWidgetItemPrivate(this)), par(0), + : rtti(type), view(nullptr), d(new QTreeWidgetItemPrivate(this)), par(nullptr), itemFlags(Qt::ItemIsSelectable |Qt::ItemIsUserCheckable |Qt::ItemIsEnabled @@ -1456,7 +1519,7 @@ QTreeWidgetItem::QTreeWidgetItem(QTreeWidgetItem *parent, int type) \sa type() */ QTreeWidgetItem::QTreeWidgetItem(QTreeWidgetItem *parent, const QStringList &strings, int type) - : rtti(type), view(0), d(new QTreeWidgetItemPrivate(this)), par(0), + : rtti(type), view(nullptr), d(new QTreeWidgetItemPrivate(this)), par(nullptr), itemFlags(Qt::ItemIsSelectable |Qt::ItemIsUserCheckable |Qt::ItemIsEnabled @@ -1478,7 +1541,7 @@ QTreeWidgetItem::QTreeWidgetItem(QTreeWidgetItem *parent, const QStringList &str \sa type() */ QTreeWidgetItem::QTreeWidgetItem(QTreeWidgetItem *parent, QTreeWidgetItem *after, int type) - : rtti(type), view(0), d(new QTreeWidgetItemPrivate(this)), par(0), + : rtti(type), view(nullptr), d(new QTreeWidgetItemPrivate(this)), par(nullptr), itemFlags(Qt::ItemIsSelectable |Qt::ItemIsUserCheckable |Qt::ItemIsEnabled @@ -1501,7 +1564,7 @@ QTreeWidgetItem::QTreeWidgetItem(QTreeWidgetItem *parent, QTreeWidgetItem *after QTreeWidgetItem::~QTreeWidgetItem() { - QTreeModel *model = (view ? qobject_cast<QTreeModel*>(view->model()) : 0); + QTreeModel *model = treeModel(); bool wasSkipSort = false; if (model) { wasSkipSort = model->skipPendingSort; @@ -1663,16 +1726,17 @@ void QTreeWidgetItem::setFlags(Qt::ItemFlags flags) void QTreeWidgetItemPrivate::updateHiddenStatus(QTreeWidgetItem *item, bool inserting) { - QTreeModel *model = (item->view ? qobject_cast<QTreeModel*>(item->view->model()) : 0); + QTreeModel *model = item->treeModel(); if (!model) return; QStack<QTreeWidgetItem *> parents; parents.push(item); while (!parents.isEmpty()) { QTreeWidgetItem *parent = parents.pop(); - QModelIndex index = model->index(parent, 0); - if (parent->d->hidden) + if (parent->d->hidden) { + const QModelIndex index = model->index(parent, 0); item->view->setRowHidden(index.row(), index.parent(), inserting); + } for (int i = 0; i < parent->children.count(); ++i) { QTreeWidgetItem *child = parent->children.at(i); parents.push(child); @@ -1737,7 +1801,7 @@ void QTreeWidgetItem::setData(int column, int role, const QVariant &value) if (column < 0) return; - QTreeModel *model = (view ? qobject_cast<QTreeModel*>(view->model()) : 0); + QTreeModel *model = treeModel(); switch (role) { case Qt::EditRole: case Qt::DisplayRole: { @@ -1945,7 +2009,7 @@ void QTreeWidgetItem::insertChild(int index, QTreeWidgetItem *child) if (index < 0 || index > children.count() || child == 0 || child->view != 0 || child->par != 0) return; - if (QTreeModel *model = (view ? qobject_cast<QTreeModel*>(view->model()) : 0)) { + if (QTreeModel *model = treeModel()) { const bool wasSkipSort = model->skipPendingSort; model->skipPendingSort = true; if (model->rootItem == this) @@ -1996,7 +2060,7 @@ QTreeWidgetItem *QTreeWidgetItem::takeChild(int index) { // we move this outside the check of the index to allow executing // pending sorts from inline functions, using this function (hack) - QTreeModel *model = (view ? qobject_cast<QTreeModel*>(view->model()) : 0); + QTreeModel *model = treeModel(); if (model) { // This will trigger a layoutChanged signal, thus we might want to optimize // this function by not emitting the rowsRemoved signal etc to the view. @@ -2054,7 +2118,7 @@ void QTreeWidgetItem::insertChildren(int index, const QList<QTreeWidgetItem*> &c insertChild(index, children.at(n)); return; } - QTreeModel *model = (view ? qobject_cast<QTreeModel*>(view->model()) : 0); + QTreeModel *model = treeModel(); QStack<QTreeWidgetItem*> stack; QList<QTreeWidgetItem*> itemsToInsert; for (int n = 0; n < children.count(); ++n) { @@ -2101,7 +2165,7 @@ QList<QTreeWidgetItem*> QTreeWidgetItem::takeChildren() { QList<QTreeWidgetItem*> removed; if (children.count() > 0) { - QTreeModel *model = (view ? qobject_cast<QTreeModel*>(view->model()) : 0); + QTreeModel *model = treeModel(); if (model) { // This will trigger a layoutChanged signal, thus we might want to optimize // this function by not emitting the rowsRemoved signal etc to the view. @@ -2133,7 +2197,7 @@ QList<QTreeWidgetItem*> QTreeWidgetItem::takeChildren() void QTreeWidgetItemPrivate::sortChildren(int column, Qt::SortOrder order, bool climb) { - QTreeModel *model = (q->view ? qobject_cast<QTreeModel*>(q->view->model()) : 0); + QTreeModel *model = q->treeModel(); if (!model) return; model->sortItems(&q->children, column, order); @@ -2156,7 +2220,7 @@ void QTreeWidgetItemPrivate::sortChildren(int column, Qt::SortOrder order, bool */ void QTreeWidgetItem::sortChildren(int column, Qt::SortOrder order, bool climb) { - QTreeModel *model = (view ? qobject_cast<QTreeModel*>(view->model()) : 0); + QTreeModel *model = treeModel(); if (!model) return; if (model->isChanging()) @@ -2164,9 +2228,9 @@ void QTreeWidgetItem::sortChildren(int column, Qt::SortOrder order, bool climb) QTreeModel::SkipSorting skipSorting(model); int oldSortColumn = view->d_func()->explicitSortColumn; view->d_func()->explicitSortColumn = column; - emit model->layoutAboutToBeChanged(); + emit model->layoutAboutToBeChanged({}, QAbstractItemModel::VerticalSortHint); d->sortChildren(column, order, climb); - emit model->layoutChanged(); + emit model->layoutChanged({}, QAbstractItemModel::VerticalSortHint); view->d_func()->explicitSortColumn = oldSortColumn; } @@ -2236,7 +2300,7 @@ void QTreeWidgetItem::emitDataChanged() */ void QTreeWidgetItem::itemChanged() { - if (QTreeModel *model = (view ? qobject_cast<QTreeModel*>(view->model()) : 0)) + if (QTreeModel *model = treeModel()) model->itemChanged(this); } @@ -2245,10 +2309,21 @@ void QTreeWidgetItem::itemChanged() */ void QTreeWidgetItem::executePendingSort() const { - if (QTreeModel *model = (view ? qobject_cast<QTreeModel*>(view->model()) : 0)) + if (QTreeModel *model = treeModel()) model->executePendingSort(); } +/*! + \internal + returns the QTreeModel if a view is set +*/ +QTreeModel *QTreeWidgetItem::treeModel(QTreeWidget *v) const +{ + if (!v) + v = view; + return (v ? qobject_cast<QTreeModel*>(v->model()) : nullptr); +} + #ifndef QT_NO_DATASTREAM /*! @@ -3027,6 +3102,7 @@ void QTreeWidget::setItemWidget(QTreeWidgetItem *item, int column, QWidget *widg QAbstractItemView::setIndexWidget(d->index(item, column), widget); } +#if QT_DEPRECATED_SINCE(5, 13) /*! Returns \c true if the \a item is selected; otherwise returns \c false. @@ -3038,9 +3114,7 @@ void QTreeWidget::setItemWidget(QTreeWidgetItem *item, int column, QWidget *widg */ bool QTreeWidget::isItemSelected(const QTreeWidgetItem *item) const { - if (!item) - return false; - return item->d->selected; + return ((item && item->treeWidget() == this) ? item->isSelected() : false); } /*! @@ -3055,16 +3129,10 @@ bool QTreeWidget::isItemSelected(const QTreeWidgetItem *item) const */ void QTreeWidget::setItemSelected(const QTreeWidgetItem *item, bool select) { - Q_D(QTreeWidget); - - if (!item) - return; - - selectionModel()->select(d->index(item), (select ? QItemSelectionModel::Select - : QItemSelectionModel::Deselect) - |QItemSelectionModel::Rows); - item->d->selected = select; + if (item && item->treeWidget() == this) + const_cast<QTreeWidgetItem*>(item)->setSelected(select); } +#endif /*! Returns a list of all selected non-hidden items. @@ -3081,7 +3149,7 @@ QList<QTreeWidgetItem*> QTreeWidget::selectedItems() const seen.reserve(indexes.count()); for (const auto &index : indexes) { QTreeWidgetItem *item = d->item(index); - if (isItemHidden(item) || seen.contains(item)) + if (item->isHidden() || seen.contains(item)) continue; seen.insert(item); items.append(item); @@ -3105,6 +3173,7 @@ QList<QTreeWidgetItem*> QTreeWidget::findItems(const QString &text, Qt::MatchFla return items; } +#if QT_DEPRECATED_SINCE(5, 13) /*! Returns \c true if the \a item is explicitly hidden, otherwise returns \c false. @@ -3114,13 +3183,7 @@ QList<QTreeWidgetItem*> QTreeWidget::findItems(const QString &text, Qt::MatchFla */ bool QTreeWidget::isItemHidden(const QTreeWidgetItem *item) const { - Q_D(const QTreeWidget); - if (item == d->treeModel()->headerItem) - return header()->isHidden(); - if (d->hiddenIndexes.isEmpty()) - return false; - QTreeModel::SkipSorting skipSorting(d->treeModel()); - return d->isRowHidden(d->index(item)); + return ((item && item->treeWidget() == this) ? item->isHidden() : false); } /*! @@ -3134,16 +3197,8 @@ bool QTreeWidget::isItemHidden(const QTreeWidgetItem *item) const */ void QTreeWidget::setItemHidden(const QTreeWidgetItem *item, bool hide) { - if (!item) - return; - Q_D(QTreeWidget); - if (item == d->treeModel()->headerItem) { - header()->setHidden(hide); - } else { - const QModelIndex index = d->index(item); - setRowHidden(index.row(), index.parent(), hide); - } - item->d->hidden = hide; + if (item && item->treeWidget() == this) + const_cast<QTreeWidgetItem*>(item)->setHidden(hide); } /*! @@ -3157,9 +3212,7 @@ void QTreeWidget::setItemHidden(const QTreeWidgetItem *item, bool hide) */ bool QTreeWidget::isItemExpanded(const QTreeWidgetItem *item) const { - Q_D(const QTreeWidget); - QTreeModel::SkipSorting skipSorting(d->treeModel()); - return isExpanded(d->index(item)); + return ((item && item->treeWidget() == this) ? item->isExpanded() : false); } /*! @@ -3174,10 +3227,10 @@ bool QTreeWidget::isItemExpanded(const QTreeWidgetItem *item) const */ void QTreeWidget::setItemExpanded(const QTreeWidgetItem *item, bool expand) { - Q_D(QTreeWidget); - QTreeModel::SkipSorting skipSorting(d->treeModel()); - setExpanded(d->index(item), expand); + if (item && item->treeWidget() == this) + const_cast<QTreeWidgetItem*>(item)->setExpanded(expand); } +#endif /*! \since 4.3 diff --git a/src/widgets/itemviews/qtreewidget.h b/src/widgets/itemviews/qtreewidget.h index 975f208702..145b61ff9d 100644 --- a/src/widgets/itemviews/qtreewidget.h +++ b/src/widgets/itemviews/qtreewidget.h @@ -66,9 +66,9 @@ public: enum ItemType { Type = 0, UserType = 1000 }; explicit QTreeWidgetItem(int type = Type); explicit QTreeWidgetItem(const QStringList &strings, int type = Type); - explicit QTreeWidgetItem(QTreeWidget *view, int type = Type); - QTreeWidgetItem(QTreeWidget *view, const QStringList &strings, int type = Type); - QTreeWidgetItem(QTreeWidget *view, QTreeWidgetItem *after, int type = Type); + explicit QTreeWidgetItem(QTreeWidget *treeview, int type = Type); + QTreeWidgetItem(QTreeWidget *treeview, const QStringList &strings, int type = Type); + QTreeWidgetItem(QTreeWidget *treeview, QTreeWidgetItem *after, int type = Type); explicit QTreeWidgetItem(QTreeWidgetItem *parent, int type = Type); QTreeWidgetItem(QTreeWidgetItem *parent, const QStringList &strings, int type = Type); QTreeWidgetItem(QTreeWidgetItem *parent, QTreeWidgetItem *after, int type = Type); @@ -79,14 +79,14 @@ public: inline QTreeWidget *treeWidget() const { return view; } - inline void setSelected(bool select); - inline bool isSelected() const; + void setSelected(bool select); + bool isSelected() const; void setHidden(bool hide); bool isHidden() const; - inline void setExpanded(bool expand); - inline bool isExpanded() const; + void setExpanded(bool expand); + bool isExpanded() const; inline void setFirstColumnSpanned(bool span); inline bool isFirstColumnSpanned() const; @@ -134,20 +134,28 @@ public: inline void setTextAlignment(int column, int alignment) { setData(column, Qt::TextAlignmentRole, alignment); } +#if QT_DEPRECATED_SINCE(5, 13) + QT_DEPRECATED_X ("Use QTreeWidgetItem::background() instead") inline QColor backgroundColor(int column) const - { return qvariant_cast<QColor>(data(column, Qt::BackgroundColorRole)); } + { return qvariant_cast<QColor>(data(column, Qt::BackgroundRole)); } + QT_DEPRECATED_X ("Use QTreeWidgetItem::setBackground() instead") inline void setBackgroundColor(int column, const QColor &color) - { setData(column, Qt::BackgroundColorRole, color); } + { setData(column, Qt::BackgroundRole, color); } +#endif inline QBrush background(int column) const { return qvariant_cast<QBrush>(data(column, Qt::BackgroundRole)); } inline void setBackground(int column, const QBrush &brush) { setData(column, Qt::BackgroundRole, brush); } +#if QT_DEPRECATED_SINCE(5, 13) + QT_DEPRECATED_X ("Use QTreeWidgetItem::foreground() instead") inline QColor textColor(int column) const - { return qvariant_cast<QColor>(data(column, Qt::TextColorRole)); } + { return qvariant_cast<QColor>(data(column, Qt::ForegroundRole)); } + QT_DEPRECATED_X ("Use QTreeWidgetItem::setForeground() instead") inline void setTextColor(int column, const QColor &color) - { setData(column, Qt::TextColorRole, color); } + { setData(column, Qt::ForegroundRole, color); } +#endif inline QBrush foreground(int column) const { return qvariant_cast<QBrush>(data(column, Qt::ForegroundRole)); } @@ -207,6 +215,7 @@ private: QVariant childrenCheckState(int column) const; void itemChanged(); void executePendingSort() const; + QTreeModel *treeModel(QTreeWidget *v = nullptr) const; int rtti; // One item has a vector of column entries. Each column has a vector of (role, value) pairs. @@ -306,17 +315,27 @@ public: void setItemWidget(QTreeWidgetItem *item, int column, QWidget *widget); inline void removeItemWidget(QTreeWidgetItem *item, int column); +#if QT_DEPRECATED_SINCE(5, 13) + QT_DEPRECATED_X ("Use QTreeWidgetItem::isSelected() instead") bool isItemSelected(const QTreeWidgetItem *item) const; + QT_DEPRECATED_X ("Use QTreeWidgetItem::setSelected() instead") void setItemSelected(const QTreeWidgetItem *item, bool select); +#endif QList<QTreeWidgetItem*> selectedItems() const; QList<QTreeWidgetItem*> findItems(const QString &text, Qt::MatchFlags flags, int column = 0) const; +#if QT_DEPRECATED_SINCE(5, 13) + QT_DEPRECATED_X ("Use QTreeWidgetItem::isHidden() instead") bool isItemHidden(const QTreeWidgetItem *item) const; + QT_DEPRECATED_X ("Use QTreeWidgetItem::setHidden() instead") void setItemHidden(const QTreeWidgetItem *item, bool hide); + QT_DEPRECATED_X ("Use QTreeWidgetItem::isExpanded() instead") bool isItemExpanded(const QTreeWidgetItem *item) const; + QT_DEPRECATED_X ("Use QTreeWidgetItem::setExpanded() instead") void setItemExpanded(const QTreeWidgetItem *item, bool expand); +#endif bool isFirstItemColumnSpanned(const QTreeWidgetItem *item) const; void setFirstItemColumnSpanned(const QTreeWidgetItem *item, bool span); @@ -404,18 +423,6 @@ inline QTreeWidgetItem *QTreeWidget::itemAt(int ax, int ay) const inline void QTreeWidget::setHeaderLabel(const QString &alabel) { setHeaderLabels(QStringList(alabel)); } -inline void QTreeWidgetItem::setSelected(bool aselect) -{ if (view) view->setItemSelected(this, aselect); } - -inline bool QTreeWidgetItem::isSelected() const -{ return (view ? view->isItemSelected(this) : false); } - -inline void QTreeWidgetItem::setExpanded(bool aexpand) -{ if (view) view->setItemExpanded(this, aexpand); } - -inline bool QTreeWidgetItem::isExpanded() const -{ return (view ? view->isItemExpanded(this) : false); } - inline void QTreeWidgetItem::setFirstColumnSpanned(bool aspan) { if (view) view->setFirstItemColumnSpanned(this, aspan); } diff --git a/src/widgets/itemviews/qtreewidget_p.h b/src/widgets/itemviews/qtreewidget_p.h index adc2c2c421..ee4a633468 100644 --- a/src/widgets/itemviews/qtreewidget_p.h +++ b/src/widgets/itemviews/qtreewidget_p.h @@ -99,7 +99,9 @@ public: QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; bool setData(const QModelIndex &index, const QVariant &value, int role) override; - +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + bool clearItemData(const QModelIndex &index) override; +#endif QMap<int, QVariant> itemData(const QModelIndex &index) const override; QVariant headerData(int section, Qt::Orientation orientation, int role) const override; |