diff options
Diffstat (limited to 'src/widgets/itemviews')
-rw-r--r-- | src/widgets/itemviews/qheaderview.cpp | 5 | ||||
-rw-r--r-- | src/widgets/itemviews/qitemdelegate.cpp | 68 | ||||
-rw-r--r-- | src/widgets/itemviews/qlistview.cpp | 4 | ||||
-rw-r--r-- | src/widgets/itemviews/qlistwidget.cpp | 9 | ||||
-rw-r--r-- | src/widgets/itemviews/qtableview.cpp | 45 | ||||
-rw-r--r-- | src/widgets/itemviews/qtablewidget.cpp | 36 | ||||
-rw-r--r-- | src/widgets/itemviews/qtablewidget.h | 1 | ||||
-rw-r--r-- | src/widgets/itemviews/qtablewidget_p.h | 5 | ||||
-rw-r--r-- | src/widgets/itemviews/qtreeview.cpp | 26 | ||||
-rw-r--r-- | src/widgets/itemviews/qtreeview_p.h | 2 | ||||
-rw-r--r-- | src/widgets/itemviews/qtreewidget.cpp | 18 | ||||
-rw-r--r-- | src/widgets/itemviews/qtreewidget.h | 1 | ||||
-rw-r--r-- | src/widgets/itemviews/qtreewidget_p.h | 2 |
13 files changed, 143 insertions, 79 deletions
diff --git a/src/widgets/itemviews/qheaderview.cpp b/src/widgets/itemviews/qheaderview.cpp index 00e9ff7400..6dc0543255 100644 --- a/src/widgets/itemviews/qheaderview.cpp +++ b/src/widgets/itemviews/qheaderview.cpp @@ -1853,11 +1853,13 @@ bool QHeaderView::restoreState(const QByteArray &state) */ void QHeaderView::reset() { + Q_D(QHeaderView); QAbstractItemView::reset(); // it would be correct to call clear, but some apps rely // on the header keeping the sections, even after calling reset //d->clear(); initializeSections(); + d->invalidateCachedSizeHint(); } /*! @@ -2871,6 +2873,7 @@ bool QHeaderView::viewportEvent(QEvent *e) } return true; } #endif // QT_CONFIG(statustip) + case QEvent::Resize: case QEvent::FontChange: case QEvent::StyleChange: d->invalidateCachedSizeHint(); @@ -4086,7 +4089,7 @@ bool QHeaderViewPrivate::read(QDataStream &in) } int sectionItemsLengthTotal = 0; - foreach (const SectionItem §ion, newSectionItems) + for (const SectionItem §ion : qAsConst(newSectionItems)) sectionItemsLengthTotal += section.size; if (sectionItemsLengthTotal != lengthIn) return false; diff --git a/src/widgets/itemviews/qitemdelegate.cpp b/src/widgets/itemviews/qitemdelegate.cpp index 91122283a4..dff4cc4593 100644 --- a/src/widgets/itemviews/qitemdelegate.cpp +++ b/src/widgets/itemviews/qitemdelegate.cpp @@ -103,7 +103,10 @@ public: QItemEditorFactory *f; bool clipPainting; - QRect textLayoutBounds(const QStyleOptionViewItem &options) const; + QRect displayRect(const QModelIndex &index, const QStyleOptionViewItem &option, + const QRect &decorationRect, const QRect &checkRect) const; + QRect textLayoutBounds(const QStyleOptionViewItem &option, + const QRect &decorationRect, const QRect &checkRect) const; QSizeF doTextLayout(int lineWidth) const; mutable QTextLayout textLayout; mutable QTextOption textOption; @@ -121,21 +124,53 @@ public: } tmp; }; -QRect QItemDelegatePrivate::textLayoutBounds(const QStyleOptionViewItem &option) const +QRect QItemDelegatePrivate::displayRect(const QModelIndex &index, const QStyleOptionViewItem &option, + const QRect &decorationRect, const QRect &checkRect) const +{ + Q_Q(const QItemDelegate); + const QVariant value = index.data(Qt::DisplayRole); + if (!value.isValid() || value.isNull()) + return QRect(); + + const QString text = valueToText(value, option); + const QVariant fontVal = index.data(Qt::FontRole); + const QFont fnt = qvariant_cast<QFont>(fontVal).resolve(option.font); + return q->textRectangle(nullptr, + textLayoutBounds(option, decorationRect, checkRect), + fnt, text); +} + +// similar to QCommonStylePrivate::viewItemSize(Qt::DisplayRole) +QRect QItemDelegatePrivate::textLayoutBounds(const QStyleOptionViewItem &option, + const QRect &decorationRect, const QRect &checkRect) const { QRect rect = option.rect; + const QWidget *w = widget(option); + QStyle *style = w ? w->style() : QApplication::style(); const bool wrapText = option.features & QStyleOptionViewItem::WrapText; + // see QItemDelegate::drawDisplay + const int textMargin = style->pixelMetric(QStyle::PM_FocusFrameHMargin, 0, w) + 1; switch (option.decorationPosition) { case QStyleOptionViewItem::Left: case QStyleOptionViewItem::Right: - rect.setWidth(wrapText && rect.isValid() ? rect.width() : (QFIXED_MAX)); + rect.setWidth(wrapText && rect.isValid() ? rect.width() - 2 * textMargin : (QFIXED_MAX)); break; case QStyleOptionViewItem::Top: case QStyleOptionViewItem::Bottom: - rect.setWidth(wrapText ? option.decorationSize.width() : (QFIXED_MAX)); + rect.setWidth(wrapText ? option.decorationSize.width() - 2 * textMargin : (QFIXED_MAX)); break; } + if (wrapText) { + if (!decorationRect.isNull()) + rect.setWidth(rect.width() - decorationRect.width() - 2 * textMargin); + if (!checkRect.isNull()) + rect.setWidth(rect.width() - checkRect.width() - 2 * textMargin); + // adjust height to be sure that the text fits + const QSizeF size = doTextLayout(rect.width()); + rect.setHeight(qCeil(size.height())); + } + return rect; } @@ -395,14 +430,6 @@ void QItemDelegate::paint(QPainter *painter, decorationRect = QRect(); } - QString text; - QRect displayRect; - value = index.data(Qt::DisplayRole); - if (value.isValid() && !value.isNull()) { - text = d->valueToText(value, opt); - displayRect = textRectangle(painter, d->textLayoutBounds(opt), opt.font, text); - } - QRect checkRect; Qt::CheckState checkState = Qt::Unchecked; value = index.data(Qt::CheckStateRole); @@ -411,6 +438,14 @@ void QItemDelegate::paint(QPainter *painter, checkRect = doCheck(opt, opt.rect, value); } + QString text; + QRect displayRect; + value = index.data(Qt::DisplayRole); + if (value.isValid() && !value.isNull()) { + text = d->valueToText(value, opt); + displayRect = d->displayRect(index, opt, decorationRect, checkRect); + } + // do the layout doLayout(opt, &checkRect, &decorationRect, &displayRect, false); @@ -440,12 +475,13 @@ void QItemDelegate::paint(QPainter *painter, QSize QItemDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const { + Q_D(const QItemDelegate); QVariant value = index.data(Qt::SizeHintRole); if (value.isValid()) return qvariant_cast<QSize>(value); QRect decorationRect = rect(option, index, Qt::DecorationRole); - QRect displayRect = rect(option, index, Qt::DisplayRole); QRect checkRect = rect(option, index, Qt::CheckStateRole); + QRect displayRect = d->displayRect(index, option, decorationRect, checkRect); doLayout(option, &checkRect, &decorationRect, &displayRect, true); @@ -1000,8 +1036,8 @@ QPixmap *QItemDelegate::selected(const QPixmap &pixmap, const QPalette &palette, /*! \internal + Only used (and usable) for Qt::DecorationRole and Qt::CheckStateRole */ - QRect QItemDelegate::rect(const QStyleOptionViewItem &option, const QModelIndex &index, int role) const { @@ -1032,7 +1068,9 @@ QRect QItemDelegate::rect(const QStyleOptionViewItem &option, const QString text = d->valueToText(value, option); value = index.data(Qt::FontRole); QFont fnt = qvariant_cast<QFont>(value).resolve(option.font); - return textRectangle(0, d->textLayoutBounds(option), fnt, text); } + return textRectangle(nullptr, + d->textLayoutBounds(option, QRect(), QRect()), + fnt, text); } } } return QRect(); diff --git a/src/widgets/itemviews/qlistview.cpp b/src/widgets/itemviews/qlistview.cpp index a7174a92e8..05e3ebf664 100644 --- a/src/widgets/itemviews/qlistview.cpp +++ b/src/widgets/itemviews/qlistview.cpp @@ -2603,7 +2603,7 @@ int QListModeViewBase::perItemScrollingPageSteps(int length, int bounds, bool wr positions = segmentPositions; else if (!flowPositions.isEmpty()) { positions.reserve(scrollValueMap.size()); - foreach (int itemShown, scrollValueMap) + for (int itemShown : scrollValueMap) positions.append(flowPositions.at(itemShown)); } if (positions.isEmpty() || bounds <= length) @@ -2784,7 +2784,7 @@ bool QIconModeViewBase::filterDropEvent(QDropEvent *e) if (qq->acceptDrops()) { const Qt::ItemFlags dropableFlags = Qt::ItemIsDropEnabled|Qt::ItemIsEnabled; const QVector<QModelIndex> &dropIndices = intersectingSet(QRect(end, QSize(1, 1))); - foreach (const QModelIndex &index, dropIndices) + for (const QModelIndex &index : dropIndices) if ((index.flags() & dropableFlags) == dropableFlags) return false; } diff --git a/src/widgets/itemviews/qlistwidget.cpp b/src/widgets/itemviews/qlistwidget.cpp index 4f1c7fe80a..72e0a67a64 100644 --- a/src/widgets/itemviews/qlistwidget.cpp +++ b/src/widgets/itemviews/qlistwidget.cpp @@ -48,9 +48,6 @@ QT_BEGIN_NAMESPACE -// workaround for VC++ 6.0 linker bug (?) -typedef bool(*LessThan)(const QPair<QListWidgetItem*,int>&,const QPair<QListWidgetItem*,int>&); - class QListWidgetMimeData : public QMimeData { Q_OBJECT @@ -301,7 +298,7 @@ void QListModel::sort(int column, Qt::SortOrder order) sorting[i].second = i; } - LessThan compare = (order == Qt::AscendingOrder ? &itemLessThan : &itemGreaterThan); + const auto compare = (order == Qt::AscendingOrder ? &itemLessThan : &itemGreaterThan); std::sort(sorting.begin(), sorting.end(), compare); QModelIndexList fromIndexes; QModelIndexList toIndexes; @@ -338,7 +335,7 @@ void QListModel::ensureSorted(int column, Qt::SortOrder order, int start, int en sorting[i].second = start + i; } - LessThan compare = (order == Qt::AscendingOrder ? &itemLessThan : &itemGreaterThan); + const auto compare = (order == Qt::AscendingOrder ? &itemLessThan : &itemGreaterThan); std::sort(sorting.begin(), sorting.end(), compare); QModelIndexList oldPersistentIndexes = persistentIndexList(); @@ -1847,7 +1844,7 @@ QMimeData *QListWidget::mimeData(const QList<QListWidgetItem*> items) const // if non empty, it's called from the model's own mimeData if (cachedIndexes.isEmpty()) { cachedIndexes.reserve(items.count()); - foreach (QListWidgetItem *item, items) + for (QListWidgetItem *item : items) cachedIndexes << indexFromItem(item); QMimeData *result = d->listModel()->internalMimeData(); diff --git a/src/widgets/itemviews/qtableview.cpp b/src/widgets/itemviews/qtableview.cpp index 1938fd8e92..5ae1994559 100644 --- a/src/widgets/itemviews/qtableview.cpp +++ b/src/widgets/itemviews/qtableview.cpp @@ -74,7 +74,7 @@ void QSpanCollection::addSpan(QSpanCollection::Span *span) //the previouslist is the list of spans that sarts _before_ the row of the span. // and which may intersect this row. const SubIndex previousList = it_y.value(); - foreach(Span *s, previousList) { + for (Span *s : previousList) { //If a subspans intersect the row, we need to split it into subspans if(s->bottom() >= span->top()) sub_index.insert(-s->left(), s); @@ -798,6 +798,7 @@ void QTableViewPrivate::drawAndClipSpans(const QRegion &area, QPainter *painter, const QStyleOptionViewItem &option, QBitArray *drawn, int firstVisualRow, int lastVisualRow, int firstVisualColumn, int lastVisualColumn) { + Q_Q(const QTableView); bool alternateBase = false; QRegion region = viewport->rect(); @@ -816,7 +817,7 @@ void QTableViewPrivate::drawAndClipSpans(const QRegion &area, QPainter *painter, visibleSpans = set.toList(); } - foreach (QSpanCollection::Span *span, visibleSpans) { + for (QSpanCollection::Span *span : qAsConst(visibleSpans)) { int row = span->top(); int col = span->left(); QModelIndex index = model->index(row, col, root); @@ -831,6 +832,18 @@ void QTableViewPrivate::drawAndClipSpans(const QRegion &area, QPainter *painter, alternateBase = alternatingColors && (span->top() & 1); opt.features.setFlag(QStyleOptionViewItem::Alternate, alternateBase); drawCell(painter, opt, index); + if (showGrid) { + // adjust the clip rect to be able to paint the top & left grid lines + // if the headers are not visible, see paintEvent() + if (horizontalHeader->visualIndex(row) == 0) + rect.setTop(rect.top() + 1); + if (verticalHeader->visualIndex(row) == 0) { + if (q->isLeftToRight()) + rect.setLeft(rect.left() + 1); + else + rect.setRight(rect.right() - 1); + } + } region -= rect; for (int r = span->top(); r <= span->bottom(); ++r) { const int vr = visualRow(r); @@ -1321,10 +1334,10 @@ void QTableView::scrollContentsBy(int dx, int dy) //we need to update the first line of the previous top item in the view //because it has the grid drawn if the header is invisible. //It is strictly related to what's done at then end of the paintEvent - if (dy > 0 && d->horizontalHeader->isHidden() && d->verticalScrollMode == ScrollPerItem) { + if (dy > 0 && d->horizontalHeader->isHidden()) { d->viewport->update(0, dy, d->viewport->width(), dy); } - if (dx > 0 && d->verticalHeader->isHidden() && d->horizontalScrollMode == ScrollPerItem) { + if (dx > 0 && d->verticalHeader->isHidden()) { d->viewport->update(dx, 0, dx, d->viewport->height()); } } @@ -1504,10 +1517,26 @@ void QTableView::paintEvent(QPaintEvent *event) //draw the top & left grid lines if the headers are not visible. //We do update this line when subsequent scroll happen (see scrollContentsBy) - if (horizontalHeader->isHidden() && verticalScrollMode() == ScrollPerItem) - painter.drawLine(dirtyArea.left(), 0, dirtyArea.right(), 0); - if (verticalHeader->isHidden() && horizontalScrollMode() == ScrollPerItem) - painter.drawLine(0, dirtyArea.top(), 0, dirtyArea.bottom()); + if (horizontalHeader->isHidden() && top == 0) { + const int row = verticalHeader->logicalIndex(top); + if (!verticalHeader->isSectionHidden(row)) { + const int rowY = rowViewportPosition(row) + offset.y(); + if (rowY == dirtyArea.top()) + painter.drawLine(dirtyArea.left(), rowY, dirtyArea.right(), rowY); + } + } + if (verticalHeader->isHidden() && left == 0) { + const int col = horizontalHeader->logicalIndex(left); + if (!horizontalHeader->isSectionHidden(col)) { + int colX = columnViewportPosition(col) + offset.x(); + if (!isLeftToRight()) + colX += columnWidth(left) - 1; + if (isLeftToRight() && colX == dirtyArea.left()) + painter.drawLine(colX, dirtyArea.top(), colX, dirtyArea.bottom()); + if (!isLeftToRight() && colX == dirtyArea.right()) + painter.drawLine(colX, dirtyArea.top(), colX, dirtyArea.bottom()); + } + } painter.setPen(old); } } diff --git a/src/widgets/itemviews/qtablewidget.cpp b/src/widgets/itemviews/qtablewidget.cpp index 9d5a2aa1bd..11925af7a0 100644 --- a/src/widgets/itemviews/qtablewidget.cpp +++ b/src/widgets/itemviews/qtablewidget.cpp @@ -453,17 +453,20 @@ bool QTableModel::setItemData(const QModelIndex &index, const QMap<int, QVariant QTableWidget *view = qobject_cast<QTableWidget*>(QObject::parent()); QTableWidgetItem *itm = item(index); if (itm) { - itm->view = 0; // prohibits item from calling itemChanged() - bool changed = false; + itm->view = nullptr; // prohibits item from calling itemChanged() + QVector<int> rolesVec; for (QMap<int, QVariant>::ConstIterator it = roles.constBegin(); it != roles.constEnd(); ++it) { - if (itm->data(it.key()) != it.value()) { - itm->setData(it.key(), it.value()); - changed = true; + const int role = (it.key() == Qt::EditRole ? Qt::DisplayRole : it.key()); + if (itm->data(role) != it.value()) { + itm->setData(role, it.value()); + rolesVec += role; + if (role == Qt::DisplayRole) + rolesVec += Qt::EditRole; } } itm->view = view; - if (changed) - itemChanged(itm); + if (!rolesVec.isEmpty()) + itemChanged(itm, rolesVec); return true; } @@ -506,7 +509,7 @@ void QTableModel::sort(int column, Qt::SortOrder order) unsortable.append(row); } - LessThan compare = (order == Qt::AscendingOrder ? &itemLessThan : &itemGreaterThan); + const auto compare = (order == Qt::AscendingOrder ? &itemLessThan : &itemGreaterThan); std::stable_sort(sortable.begin(), sortable.end(), compare); QVector<QTableWidgetItem*> sorted_table(tableItems.count()); @@ -558,7 +561,7 @@ void QTableModel::ensureSorted(int column, Qt::SortOrder order, sorting.append(QPair<QTableWidgetItem*,int>(itm, row)); } - LessThan compare = (order == Qt::AscendingOrder ? &itemLessThan : &itemGreaterThan); + const auto compare = (order == Qt::AscendingOrder ? &itemLessThan : &itemGreaterThan); std::stable_sort(sorting.begin(), sorting.end(), compare); QModelIndexList oldPersistentIndexes, newPersistentIndexes; QVector<QTableWidgetItem*> newTable = tableItems; @@ -771,7 +774,7 @@ void QTableModel::clearContents() endResetModel(); } -void QTableModel::itemChanged(QTableWidgetItem *item) +void QTableModel::itemChanged(QTableWidgetItem *item, const QVector<int> &roles) { if (!item) return; @@ -787,7 +790,7 @@ void QTableModel::itemChanged(QTableWidgetItem *item) } else { QModelIndex idx = index(item); if (idx.isValid()) - emit dataChanged(idx, idx); + emit dataChanged(idx, idx, roles); } } @@ -1386,8 +1389,13 @@ void QTableWidgetItem::setData(int role, const QVariant &value) } if (!found) values.append(QWidgetItemData(role, value)); - if (QTableModel *model = (view ? qobject_cast<QTableModel*>(view->model()) : 0)) - model->itemChanged(this); + if (QTableModel *model = (view ? qobject_cast<QTableModel*>(view->model()) : nullptr)) + { + const QVector<int> roles((role == Qt::DisplayRole) ? + QVector<int>({Qt::DisplayRole, Qt::EditRole}) : + QVector<int>({role})); + model->itemChanged(this, roles); + } } /*! @@ -2595,7 +2603,7 @@ QMimeData *QTableWidget::mimeData(const QList<QTableWidgetItem*> items) const // if non empty, it's called from the model's own mimeData if (cachedIndexes.isEmpty()) { cachedIndexes.reserve(items.count()); - foreach (QTableWidgetItem *item, items) + for (QTableWidgetItem *item : items) cachedIndexes << indexFromItem(item); QMimeData *result = d->tableModel()->internalMimeData(); diff --git a/src/widgets/itemviews/qtablewidget.h b/src/widgets/itemviews/qtablewidget.h index 7322e3aed7..9de27d164f 100644 --- a/src/widgets/itemviews/qtablewidget.h +++ b/src/widgets/itemviews/qtablewidget.h @@ -302,6 +302,7 @@ Q_SIGNALS: void itemActivated(QTableWidgetItem *item); void itemEntered(QTableWidgetItem *item); + // ### Qt 6: add changed roles void itemChanged(QTableWidgetItem *item); void currentItemChanged(QTableWidgetItem *current, QTableWidgetItem *previous); diff --git a/src/widgets/itemviews/qtablewidget_p.h b/src/widgets/itemviews/qtablewidget_p.h index 6412477be0..9899272fce 100644 --- a/src/widgets/itemviews/qtablewidget_p.h +++ b/src/widgets/itemviews/qtablewidget_p.h @@ -62,9 +62,6 @@ QT_REQUIRE_CONFIG(tablewidget); QT_BEGIN_NAMESPACE -// workaround for VC++ 6.0 linker bug -typedef bool(*LessThan)(const QPair<QTableWidgetItem*,int>&,const QPair<QTableWidgetItem*,int>&); - class QTableWidgetMimeData : public QMimeData { Q_OBJECT @@ -160,7 +157,7 @@ public: void clear(); void clearContents(); - void itemChanged(QTableWidgetItem *item); + void itemChanged(QTableWidgetItem *item, const QVector<int> &roles = QVector<int>()); QTableWidgetItem *createItem() const; const QTableWidgetItem *itemPrototype() const; diff --git a/src/widgets/itemviews/qtreeview.cpp b/src/widgets/itemviews/qtreeview.cpp index fbfbe56246..9a3c05ee38 100644 --- a/src/widgets/itemviews/qtreeview.cpp +++ b/src/widgets/itemviews/qtreeview.cpp @@ -632,11 +632,8 @@ bool QTreeView::isFirstColumnSpanned(int row, const QModelIndex &parent) const Q_D(const QTreeView); if (d->spanningIndexes.isEmpty() || !d->model) return false; - QModelIndex index = d->model->index(row, 0, parent); - for (int i = 0; i < d->spanningIndexes.count(); ++i) - if (d->spanningIndexes.at(i) == index) - return true; - return false; + const QModelIndex index = d->model->index(row, 0, parent); + return d->spanningIndexes.contains(index); } /*! @@ -653,20 +650,14 @@ void QTreeView::setFirstColumnSpanned(int row, const QModelIndex &parent, bool s Q_D(QTreeView); if (!d->model) return; - QModelIndex index = d->model->index(row, 0, parent); + const QModelIndex index = d->model->index(row, 0, parent); if (!index.isValid()) return; - if (span) { - QPersistentModelIndex persistent(index); - if (!d->spanningIndexes.contains(persistent)) - d->spanningIndexes.append(persistent); - } else { - QPersistentModelIndex persistent(index); - int i = d->spanningIndexes.indexOf(persistent); - if (i >= 0) - d->spanningIndexes.remove(i); - } + if (span) + d->spanningIndexes.insert(index); + else + d->spanningIndexes.remove(index); d->executePostedLayout(); int i = d->viewIndex(index); @@ -1420,7 +1411,7 @@ QItemViewPaintPairs QTreeViewPrivate::draggablePaintPairs(const QModelIndexList if (spanningIndexes.isEmpty()) return QAbstractItemViewPrivate::draggablePaintPairs(indexes, r); QModelIndexList list; - foreach (const QModelIndex &idx, indexes) { + for (const QModelIndex &idx : indexes) { if (idx.column() > 0 && q->isFirstColumnSpanned(idx.row(), idx.parent())) continue; list << idx; @@ -2495,7 +2486,6 @@ void QTreeView::scrollContentsBy(int dx, int dy) int previousScrollbarValue = currentScrollbarValue + dy; // -(-dy) int currentViewIndex = currentScrollbarValue; // the first visible item int previousViewIndex = previousScrollbarValue; - const QVector<QTreeViewItem> viewItems = d->viewItems; dy = 0; if (previousViewIndex < currentViewIndex) { // scrolling down for (int i = previousViewIndex; i < currentViewIndex; ++i) { diff --git a/src/widgets/itemviews/qtreeview_p.h b/src/widgets/itemviews/qtreeview_p.h index 9a391ee88a..8b217036a2 100644 --- a/src/widgets/itemviews/qtreeview_p.h +++ b/src/widgets/itemviews/qtreeview_p.h @@ -247,7 +247,7 @@ public: void updateIndentationFromStyle(); // used for spanning rows - QVector<QPersistentModelIndex> spanningIndexes; + QSet<QPersistentModelIndex> spanningIndexes; // used for updating resized columns int columnResizeTimerID; diff --git a/src/widgets/itemviews/qtreewidget.cpp b/src/widgets/itemviews/qtreewidget.cpp index 654c241079..2578fa0958 100644 --- a/src/widgets/itemviews/qtreewidget.cpp +++ b/src/widgets/itemviews/qtreewidget.cpp @@ -52,9 +52,6 @@ QT_BEGIN_NAMESPACE -// workaround for VC++ 6.0 linker bug (?) -typedef bool(*LessThan)(const QPair<QTreeWidgetItem*,int>&,const QPair<QTreeWidgetItem*,int>&); - class QTreeModelLessThan { public: @@ -610,7 +607,7 @@ void QTreeModel::ensureSorted(int column, Qt::SortOrder order, sorting[i].second = start + i; } - LessThan compare = (order == Qt::AscendingOrder ? &itemLessThan : &itemGreaterThan); + const auto compare = (order == Qt::AscendingOrder ? &itemLessThan : &itemGreaterThan); std::stable_sort(sorting.begin(), sorting.end(), compare); QModelIndexList oldPersistentIndexes; @@ -777,7 +774,7 @@ bool QTreeModel::isChanging() const if column is -1 then all columns have changed */ -void QTreeModel::emitDataChanged(QTreeWidgetItem *item, int column) +void QTreeModel::emitDataChanged(QTreeWidgetItem *item, int column, const QVector<int> &roles) { if (signalsBlocked()) return; @@ -800,7 +797,7 @@ void QTreeModel::emitDataChanged(QTreeWidgetItem *item, int column) topLeft = index(item, column); bottomRight = topLeft; } - emit dataChanged(topLeft, bottomRight); + emit dataChanged(topLeft, bottomRight, roles); } void QTreeModel::beginInsertItems(QTreeWidgetItem *parent, int row, int count) @@ -850,7 +847,7 @@ void QTreeModel::sortItems(QList<QTreeWidgetItem*> *items, int column, Qt::SortO } // do the sorting - LessThan compare = (order == Qt::AscendingOrder ? &itemLessThan : &itemGreaterThan); + const auto compare = (order == Qt::AscendingOrder ? &itemLessThan : &itemGreaterThan); std::stable_sort(sorting.begin(), sorting.end(), compare); QModelIndexList fromList; @@ -1766,11 +1763,14 @@ void QTreeWidgetItem::setData(int column, int role, const QVariant &value) } if (model) { - model->emitDataChanged(this, column); + const QVector<int> roles((role == Qt::DisplayRole || role == Qt::EditRole) ? + QVector<int>({Qt::DisplayRole, Qt::EditRole}) : + QVector<int>({role})); + model->emitDataChanged(this, column, roles); if (role == Qt::CheckStateRole) { QTreeWidgetItem *p; for (p = par; p && (p->itemFlags & Qt::ItemIsAutoTristate); p = p->par) - model->emitDataChanged(p, column); + model->emitDataChanged(p, column, roles); } } } diff --git a/src/widgets/itemviews/qtreewidget.h b/src/widgets/itemviews/qtreewidget.h index a31af0428a..24919c411d 100644 --- a/src/widgets/itemviews/qtreewidget.h +++ b/src/widgets/itemviews/qtreewidget.h @@ -339,6 +339,7 @@ Q_SIGNALS: void itemDoubleClicked(QTreeWidgetItem *item, int column); void itemActivated(QTreeWidgetItem *item, int column); void itemEntered(QTreeWidgetItem *item, int column); + // ### Qt 6: add changed roles void itemChanged(QTreeWidgetItem *item, int column); void itemExpanded(QTreeWidgetItem *item); void itemCollapsed(QTreeWidgetItem *item); diff --git a/src/widgets/itemviews/qtreewidget_p.h b/src/widgets/itemviews/qtreewidget_p.h index f4625842ef..7bc8af8fbd 100644 --- a/src/widgets/itemviews/qtreewidget_p.h +++ b/src/widgets/itemviews/qtreewidget_p.h @@ -139,7 +139,7 @@ public: protected: QTreeModel(QTreeModelPrivate &, QTreeWidget *parent = 0); - void emitDataChanged(QTreeWidgetItem *item, int column); + void emitDataChanged(QTreeWidgetItem *item, int column, const QVector<int> &roles); void beginInsertItems(QTreeWidgetItem *parent, int row, int count); void endInsertItems(); void beginRemoveItems(QTreeWidgetItem *parent, int row, int count); |