diff options
Diffstat (limited to 'src/widgets/itemviews')
34 files changed, 688 insertions, 401 deletions
diff --git a/src/widgets/itemviews/qabstractitemdelegate.cpp b/src/widgets/itemviews/qabstractitemdelegate.cpp index d532221092..3268fda2fc 100644 --- a/src/widgets/itemviews/qabstractitemdelegate.cpp +++ b/src/widgets/itemviews/qabstractitemdelegate.cpp @@ -58,6 +58,7 @@ #endif #include <qapplication.h> #include <qvalidator.h> +#include <qjsonvalue.h> #include <private/qtextengine_p.h> #include <private/qabstractitemdelegate_p.h> @@ -585,18 +586,26 @@ QString QAbstractItemDelegatePrivate::textForRole(Qt::ItemDataRole role, const Q case QVariant::Time: text = locale.toString(value.toTime(), formatType); break; - case QVariant::DateTime: { - const QDateTime dateTime = value.toDateTime(); - text = locale.toString(dateTime.date(), formatType) - + QLatin1Char(' ') - + locale.toString(dateTime.time(), formatType); - break; } - default: - text = value.toString(); + case QVariant::DateTime: + text = locale.toString(value.toDateTime(), formatType); + break; + default: { + if (value.canConvert<QJsonValue>()) { + const QJsonValue val = value.toJsonValue(); + if (val.isBool()) + text = QVariant(val.toBool()).toString(); + else if (val.isDouble()) + text = locale.toString(val.toDouble(), 'g', precision); + else if (val.isString()) + text = val.toString(); + } else { + text = value.toString(); + } if (role == Qt::DisplayRole) text.replace(QLatin1Char('\n'), QChar::LineSeparator); break; } + } return text; } diff --git a/src/widgets/itemviews/qabstractitemdelegate.h b/src/widgets/itemviews/qabstractitemdelegate.h index 9b6bde1c87..575728e806 100644 --- a/src/widgets/itemviews/qabstractitemdelegate.h +++ b/src/widgets/itemviews/qabstractitemdelegate.h @@ -69,7 +69,7 @@ public: RevertModelCache }; - explicit QAbstractItemDelegate(QObject *parent = Q_NULLPTR); + explicit QAbstractItemDelegate(QObject *parent = nullptr); virtual ~QAbstractItemDelegate(); // painting @@ -119,7 +119,7 @@ Q_SIGNALS: void sizeHintChanged(const QModelIndex &); protected: - QAbstractItemDelegate(QObjectPrivate &, QObject *parent = Q_NULLPTR); + QAbstractItemDelegate(QObjectPrivate &, QObject *parent = nullptr); private: Q_DECLARE_PRIVATE(QAbstractItemDelegate) Q_DISABLE_COPY(QAbstractItemDelegate) diff --git a/src/widgets/itemviews/qabstractitemview.cpp b/src/widgets/itemviews/qabstractitemview.cpp index 9870d9d49a..a07297863d 100644 --- a/src/widgets/itemviews/qabstractitemview.cpp +++ b/src/widgets/itemviews/qabstractitemview.cpp @@ -219,7 +219,7 @@ void QAbstractItemViewPrivate::_q_scrollerStateChanged() q->selectionModel()->select(oldSelection, QItemSelectionModel::ClearAndSelect); q->selectionModel()->setCurrentIndex(oldCurrent, QItemSelectionModel::NoUpdate); } - // fall through + Q_FALLTHROUGH(); default: oldSelection = QItemSelection(); @@ -2194,7 +2194,7 @@ QAbstractItemViewPrivate::position(const QPoint &pos, const QRect &rect, const Q { QAbstractItemView::DropIndicatorPosition r = QAbstractItemView::OnViewport; if (!overwrite) { - const int margin = 2; + const int margin = qBound(2, qRound(qreal(rect.height()) / 5.5), 12); if (pos.y() - rect.top() < margin) { r = QAbstractItemView::AboveItem; } else if (rect.bottom() - pos.y() < margin) { @@ -2255,7 +2255,7 @@ void QAbstractItemView::focusInEvent(QFocusEvent *event) /*! This function is called with the given \a event when the widget - looses the focus. By default, the event is ignored. + loses the focus. By default, the event is ignored. \sa clearFocus(), focusInEvent() */ @@ -3135,7 +3135,7 @@ int QAbstractItemView::sizeHintForColumn(int column) const Opens a persistent editor on the item at the given \a index. If no editor exists, the delegate will create a new editor. - \sa closePersistentEditor() + \sa closePersistentEditor(), isPersistentEditorOpen() */ void QAbstractItemView::openPersistentEditor(const QModelIndex &index) { @@ -3154,7 +3154,7 @@ void QAbstractItemView::openPersistentEditor(const QModelIndex &index) /*! Closes the persistent editor for the item at the given \a index. - \sa openPersistentEditor() + \sa openPersistentEditor(), isPersistentEditorOpen() */ void QAbstractItemView::closePersistentEditor(const QModelIndex &index) { @@ -3169,6 +3169,19 @@ void QAbstractItemView::closePersistentEditor(const QModelIndex &index) } /*! + \since 5.10 + + Returns whether a persistent editor is open for the item at index \a index. + + \sa openPersistentEditor(), closePersistentEditor() +*/ +bool QAbstractItemView::isPersistentEditorOpen(const QModelIndex &index) const +{ + Q_D(const QAbstractItemView); + return d->editorForIndex(index).widget; +} + +/*! \since 4.1 Sets the given \a widget on the item at the given \a index, passing the @@ -3204,12 +3217,14 @@ void QAbstractItemView::setIndexWidget(const QModelIndex &index, QWidget *widget if (QWidget *oldWidget = indexWidget(index)) { d->persistent.remove(oldWidget); d->removeEditor(oldWidget); + oldWidget->removeEventFilter(this); oldWidget->deleteLater(); } if (widget) { widget->setParent(viewport()); d->persistent.insert(widget); d->addEditor(index, widget, true); + widget->installEventFilter(this); widget->show(); dataChanged(index, index); // update the geometry if (!d->delayedPendingLayout) @@ -4418,8 +4433,7 @@ QItemViewPaintPairs QAbstractItemViewPrivate::draggablePaintPairs(const QModelIn for (const auto &index : indexes) { const QRect current = q->visualRect(index); if (current.intersects(viewportRect)) { - QItemViewPaintPair p = { current, index }; - ret += p; + ret.append({current, index}); rect |= current; } } @@ -4487,6 +4501,24 @@ QModelIndexList QAbstractItemViewPrivate::selectedDraggableIndexes() const return indexes; } +/*! + \reimp +*/ + +bool QAbstractItemView::eventFilter(QObject *object, QEvent *event) +{ + Q_D(QAbstractItemView); + if (object == this || object == viewport() || event->type() != QEvent::FocusIn) + return QAbstractScrollArea::eventFilter(object, event); + QWidget *widget = qobject_cast<QWidget *>(object); + // If it is not a persistent widget then we did not install + // the event filter on it, so assume a base implementation is + // filtering + if (!widget || !d->persistent.contains(widget)) + return QAbstractScrollArea::eventFilter(object, event); + setCurrentIndex(d->indexForEditor(widget)); + return false; +} QT_END_NAMESPACE diff --git a/src/widgets/itemviews/qabstractitemview.h b/src/widgets/itemviews/qabstractitemview.h index 6be776ec52..8a138bdb67 100644 --- a/src/widgets/itemviews/qabstractitemview.h +++ b/src/widgets/itemviews/qabstractitemview.h @@ -124,7 +124,7 @@ public: }; Q_ENUM(ScrollMode) - explicit QAbstractItemView(QWidget *parent = Q_NULLPTR); + explicit QAbstractItemView(QWidget *parent = nullptr); ~QAbstractItemView(); virtual void setModel(QAbstractItemModel *model); @@ -212,6 +212,7 @@ public: void openPersistentEditor(const QModelIndex &index); void closePersistentEditor(const QModelIndex &index); + bool isPersistentEditorOpen(const QModelIndex &index) const; void setIndexWidget(const QModelIndex &index, QWidget *widget); QWidget *indexWidget(const QModelIndex &index) const; @@ -224,7 +225,7 @@ public: QAbstractItemDelegate *itemDelegate(const QModelIndex &index) const; - virtual QVariant inputMethodQuery(Qt::InputMethodQuery query) const Q_DECL_OVERRIDE; + virtual QVariant inputMethodQuery(Qt::InputMethodQuery query) const override; using QAbstractScrollArea::update; @@ -269,7 +270,7 @@ Q_SIGNALS: void iconSizeChanged(const QSize &size); protected: - QAbstractItemView(QAbstractItemViewPrivate &, QWidget *parent = Q_NULLPTR); + QAbstractItemView(QAbstractItemViewPrivate &, QWidget *parent = nullptr); void setHorizontalStepsPerItem(int steps); int horizontalStepsPerItem() const; @@ -294,7 +295,7 @@ protected: virtual bool edit(const QModelIndex &index, EditTrigger trigger, QEvent *event); virtual QItemSelectionModel::SelectionFlags selectionCommand(const QModelIndex &index, - const QEvent *event = Q_NULLPTR) const; + const QEvent *event = nullptr) const; #ifndef QT_NO_DRAGANDDROP virtual void startDrag(Qt::DropActions supportedActions); @@ -326,32 +327,33 @@ protected: void stopAutoScroll(); void doAutoScroll(); - bool focusNextPrevChild(bool next) Q_DECL_OVERRIDE; - bool event(QEvent *event) Q_DECL_OVERRIDE; - bool viewportEvent(QEvent *event) Q_DECL_OVERRIDE; - void mousePressEvent(QMouseEvent *event) Q_DECL_OVERRIDE; - void mouseMoveEvent(QMouseEvent *event) Q_DECL_OVERRIDE; - void mouseReleaseEvent(QMouseEvent *event) Q_DECL_OVERRIDE; - void mouseDoubleClickEvent(QMouseEvent *event) Q_DECL_OVERRIDE; + bool focusNextPrevChild(bool next) override; + bool event(QEvent *event) override; + bool viewportEvent(QEvent *event) override; + void mousePressEvent(QMouseEvent *event) override; + void mouseMoveEvent(QMouseEvent *event) override; + void mouseReleaseEvent(QMouseEvent *event) override; + void mouseDoubleClickEvent(QMouseEvent *event) override; #ifndef QT_NO_DRAGANDDROP - void dragEnterEvent(QDragEnterEvent *event) Q_DECL_OVERRIDE; - void dragMoveEvent(QDragMoveEvent *event) Q_DECL_OVERRIDE; - void dragLeaveEvent(QDragLeaveEvent *event) Q_DECL_OVERRIDE; - void dropEvent(QDropEvent *event) Q_DECL_OVERRIDE; + void dragEnterEvent(QDragEnterEvent *event) override; + void dragMoveEvent(QDragMoveEvent *event) override; + void dragLeaveEvent(QDragLeaveEvent *event) override; + void dropEvent(QDropEvent *event) override; #endif - void focusInEvent(QFocusEvent *event) Q_DECL_OVERRIDE; - void focusOutEvent(QFocusEvent *event) Q_DECL_OVERRIDE; - void keyPressEvent(QKeyEvent *event) Q_DECL_OVERRIDE; - void resizeEvent(QResizeEvent *event) Q_DECL_OVERRIDE; - void timerEvent(QTimerEvent *event) Q_DECL_OVERRIDE; - void inputMethodEvent(QInputMethodEvent *event) Q_DECL_OVERRIDE; + void focusInEvent(QFocusEvent *event) override; + void focusOutEvent(QFocusEvent *event) override; + void keyPressEvent(QKeyEvent *event) override; + void resizeEvent(QResizeEvent *event) override; + void timerEvent(QTimerEvent *event) override; + void inputMethodEvent(QInputMethodEvent *event) override; + bool eventFilter(QObject *object, QEvent *event) override; #ifndef QT_NO_DRAGANDDROP enum DropIndicatorPosition { OnItem, AboveItem, BelowItem, OnViewport }; DropIndicatorPosition dropIndicatorPosition() const; #endif - QSize viewportSizeHint() const Q_DECL_OVERRIDE; + QSize viewportSizeHint() const override; private: Q_DECLARE_PRIVATE(QAbstractItemView) diff --git a/src/widgets/itemviews/qcolumnview.cpp b/src/widgets/itemviews/qcolumnview.cpp index ea9bbb0fb9..d94f25de78 100644 --- a/src/widgets/itemviews/qcolumnview.cpp +++ b/src/widgets/itemviews/qcolumnview.cpp @@ -53,8 +53,6 @@ QT_BEGIN_NAMESPACE -#define ANIMATION_DURATION_MSEC 150 - /*! \since 4.3 \class QColumnView @@ -107,7 +105,6 @@ void QColumnViewPrivate::initialize() q->setTextElideMode(Qt::ElideMiddle); #ifndef QT_NO_ANIMATION QObject::connect(¤tAnimation, SIGNAL(finished()), q, SLOT(_q_changeCurrentColumn())); - currentAnimation.setDuration(ANIMATION_DURATION_MSEC); currentAnimation.setTargetObject(hbar); currentAnimation.setPropertyName("value"); currentAnimation.setEasingCurve(QEasingCurve::InOutQuad); @@ -330,7 +327,8 @@ void QColumnView::scrollTo(const QModelIndex &index, ScrollHint hint) } #ifndef QT_NO_ANIMATION - if (style()->styleHint(QStyle::SH_Widget_Animate, 0, this)) { + if (const int animationDuration = style()->styleHint(QStyle::SH_Widget_Animation_Duration, 0, this)) { + d->currentAnimation.setDuration(animationDuration); d->currentAnimation.setEndValue(newScrollbarValue); d->currentAnimation.start(); } else diff --git a/src/widgets/itemviews/qcolumnview.h b/src/widgets/itemviews/qcolumnview.h index 42eac7426a..5c62f9c9af 100644 --- a/src/widgets/itemviews/qcolumnview.h +++ b/src/widgets/itemviews/qcolumnview.h @@ -58,18 +58,18 @@ Q_SIGNALS: void updatePreviewWidget(const QModelIndex &index); public: - explicit QColumnView(QWidget *parent = Q_NULLPTR); + explicit QColumnView(QWidget *parent = nullptr); ~QColumnView(); // QAbstractItemView overloads - QModelIndex indexAt(const QPoint &point) const Q_DECL_OVERRIDE; - void scrollTo(const QModelIndex &index, ScrollHint hint = EnsureVisible) Q_DECL_OVERRIDE; - QSize sizeHint() const Q_DECL_OVERRIDE; - QRect visualRect(const QModelIndex &index) const Q_DECL_OVERRIDE; - void setModel(QAbstractItemModel *model) Q_DECL_OVERRIDE; - void setSelectionModel(QItemSelectionModel * selectionModel) Q_DECL_OVERRIDE; - void setRootIndex(const QModelIndex &index) Q_DECL_OVERRIDE; - void selectAll() Q_DECL_OVERRIDE; + QModelIndex indexAt(const QPoint &point) const override; + void scrollTo(const QModelIndex &index, ScrollHint hint = EnsureVisible) override; + QSize sizeHint() const override; + QRect visualRect(const QModelIndex &index) const override; + void setModel(QAbstractItemModel *model) override; + void setSelectionModel(QItemSelectionModel * selectionModel) override; + void setRootIndex(const QModelIndex &index) override; + void selectAll() override; // QColumnView functions void setResizeGripsVisible(bool visible); @@ -82,21 +82,21 @@ public: QList<int> columnWidths() const; protected: - QColumnView(QColumnViewPrivate &dd, QWidget *parent = Q_NULLPTR); + QColumnView(QColumnViewPrivate &dd, QWidget *parent = nullptr); // QAbstractItemView overloads - bool isIndexHidden(const QModelIndex &index) const Q_DECL_OVERRIDE; - QModelIndex moveCursor(CursorAction cursorAction, Qt::KeyboardModifiers modifiers) Q_DECL_OVERRIDE; - void resizeEvent(QResizeEvent *event) Q_DECL_OVERRIDE; - void setSelection(const QRect & rect, QItemSelectionModel::SelectionFlags command) Q_DECL_OVERRIDE; - QRegion visualRegionForSelection(const QItemSelection &selection) const Q_DECL_OVERRIDE; - int horizontalOffset() const Q_DECL_OVERRIDE; - int verticalOffset() const Q_DECL_OVERRIDE; - void rowsInserted(const QModelIndex &parent, int start, int end) Q_DECL_OVERRIDE; - void currentChanged(const QModelIndex ¤t, const QModelIndex &previous) Q_DECL_OVERRIDE; + bool isIndexHidden(const QModelIndex &index) const override; + QModelIndex moveCursor(CursorAction cursorAction, Qt::KeyboardModifiers modifiers) override; + void resizeEvent(QResizeEvent *event) override; + void setSelection(const QRect & rect, QItemSelectionModel::SelectionFlags command) override; + QRegion visualRegionForSelection(const QItemSelection &selection) const override; + int horizontalOffset() const override; + int verticalOffset() const override; + void rowsInserted(const QModelIndex &parent, int start, int end) override; + void currentChanged(const QModelIndex ¤t, const QModelIndex &previous) override; // QColumnView functions - void scrollContentsBy(int dx, int dy) Q_DECL_OVERRIDE; + void scrollContentsBy(int dx, int dy) override; virtual QAbstractItemView* createColumn(const QModelIndex &rootIndex); void initializeColumn(QAbstractItemView *column) const; diff --git a/src/widgets/itemviews/qcolumnview_p.h b/src/widgets/itemviews/qcolumnview_p.h index fa276075fe..850ab02747 100644 --- a/src/widgets/itemviews/qcolumnview_p.h +++ b/src/widgets/itemviews/qcolumnview_p.h @@ -80,7 +80,7 @@ public: setMinimumWidth(previewWidget->minimumWidth()); } - void resizeEvent(QResizeEvent * event) Q_DECL_OVERRIDE{ + void resizeEvent(QResizeEvent * event) override{ if (!previewWidget) return; previewWidget->resize( @@ -96,7 +96,7 @@ public: QAbstractScrollArea::resizeEvent(event); } - void scrollContentsBy(int dx, int dy) Q_DECL_OVERRIDE + void scrollContentsBy(int dx, int dy) override { if (!previewWidget) return; @@ -106,36 +106,36 @@ public: QAbstractItemView::scrollContentsBy(dx, dy); } - QRect visualRect(const QModelIndex &) const Q_DECL_OVERRIDE + QRect visualRect(const QModelIndex &) const override { return QRect(); } - void scrollTo(const QModelIndex &, ScrollHint) Q_DECL_OVERRIDE + void scrollTo(const QModelIndex &, ScrollHint) override { } - QModelIndex indexAt(const QPoint &) const Q_DECL_OVERRIDE + QModelIndex indexAt(const QPoint &) const override { return QModelIndex(); } - QModelIndex moveCursor(CursorAction, Qt::KeyboardModifiers) Q_DECL_OVERRIDE + QModelIndex moveCursor(CursorAction, Qt::KeyboardModifiers) override { return QModelIndex(); } - int horizontalOffset () const Q_DECL_OVERRIDE { + int horizontalOffset () const override { return 0; } - int verticalOffset () const Q_DECL_OVERRIDE { + int verticalOffset () const override { return 0; } - QRegion visualRegionForSelection(const QItemSelection &) const Q_DECL_OVERRIDE + QRegion visualRegionForSelection(const QItemSelection &) const override { return QRegion(); } - bool isIndexHidden(const QModelIndex &) const Q_DECL_OVERRIDE + bool isIndexHidden(const QModelIndex &) const override { return false; } - void setSelection(const QRect &, QItemSelectionModel::SelectionFlags) Q_DECL_OVERRIDE + void setSelection(const QRect &, QItemSelectionModel::SelectionFlags) override { } private: @@ -163,7 +163,7 @@ public: void _q_gripMoved(int offset); void _q_changeCurrentColumn(); void _q_clicked(const QModelIndex &index); - void _q_columnsInserted(const QModelIndex &parent, int start, int end) Q_DECL_OVERRIDE; + void _q_columnsInserted(const QModelIndex &parent, int start, int end) override; QList<QAbstractItemView*> columns; QVector<int> columnSizes; // used during init and corner moving @@ -188,7 +188,7 @@ public: void paint(QPainter *painter, const QStyleOptionViewItem &option, - const QModelIndex &index) const Q_DECL_OVERRIDE; + const QModelIndex &index) const override; }; QT_END_NAMESPACE diff --git a/src/widgets/itemviews/qcolumnviewgrip_p.h b/src/widgets/itemviews/qcolumnviewgrip_p.h index 16c0aefada..7e2793074b 100644 --- a/src/widgets/itemviews/qcolumnviewgrip_p.h +++ b/src/widgets/itemviews/qcolumnviewgrip_p.h @@ -74,11 +74,11 @@ public: protected: QColumnViewGrip(QColumnViewGripPrivate &, QWidget *parent = 0, Qt::WindowFlags f = 0); - void paintEvent(QPaintEvent *event) Q_DECL_OVERRIDE; - void mouseDoubleClickEvent(QMouseEvent *event) Q_DECL_OVERRIDE; - void mouseMoveEvent(QMouseEvent *event) Q_DECL_OVERRIDE; - void mouseReleaseEvent(QMouseEvent *event) Q_DECL_OVERRIDE; - void mousePressEvent(QMouseEvent *event) Q_DECL_OVERRIDE; + void paintEvent(QPaintEvent *event) override; + void mouseDoubleClickEvent(QMouseEvent *event) override; + void mouseMoveEvent(QMouseEvent *event) override; + void mouseReleaseEvent(QMouseEvent *event) override; + void mousePressEvent(QMouseEvent *event) override; private: Q_DECLARE_PRIVATE(QColumnViewGrip) diff --git a/src/widgets/itemviews/qdatawidgetmapper.h b/src/widgets/itemviews/qdatawidgetmapper.h index 7d4d61378a..2d75b63a5e 100644 --- a/src/widgets/itemviews/qdatawidgetmapper.h +++ b/src/widgets/itemviews/qdatawidgetmapper.h @@ -61,7 +61,7 @@ class Q_WIDGETS_EXPORT QDataWidgetMapper: public QObject Q_PROPERTY(SubmitPolicy submitPolicy READ submitPolicy WRITE setSubmitPolicy) public: - explicit QDataWidgetMapper(QObject *parent = Q_NULLPTR); + explicit QDataWidgetMapper(QObject *parent = nullptr); ~QDataWidgetMapper(); void setModel(QAbstractItemModel *model); diff --git a/src/widgets/itemviews/qdirmodel.cpp b/src/widgets/itemviews/qdirmodel.cpp index 2cf76262e6..449850c42e 100644 --- a/src/widgets/itemviews/qdirmodel.cpp +++ b/src/widgets/itemviews/qdirmodel.cpp @@ -1309,22 +1309,7 @@ QString QDirModelPrivate::size(const QModelIndex &index) const // Nautilus - "9 items" (the number of children) } - // According to the Si standard KB is 1000 bytes, KiB is 1024 - // but on windows sizes are calulated by dividing by 1024 so we do what they do. - const quint64 kb = 1024; - const quint64 mb = 1024 * kb; - const quint64 gb = 1024 * mb; - const quint64 tb = 1024 * gb; - quint64 bytes = n->info.size(); - if (bytes >= tb) - return QFileSystemModel::tr("%1 TB").arg(QLocale().toString(qreal(bytes) / tb, 'f', 3)); - if (bytes >= gb) - return QFileSystemModel::tr("%1 GB").arg(QLocale().toString(qreal(bytes) / gb, 'f', 2)); - if (bytes >= mb) - return QFileSystemModel::tr("%1 MB").arg(QLocale().toString(qreal(bytes) / mb, 'f', 1)); - if (bytes >= kb) - return QFileSystemModel::tr("%1 KB").arg(QLocale().toString(bytes / kb)); - return QFileSystemModel::tr("%1 byte(s)").arg(QLocale().toString(bytes)); + return QLocale::system().formattedDataSize(n->info.size()); } QString QDirModelPrivate::type(const QModelIndex &index) const diff --git a/src/widgets/itemviews/qdirmodel.h b/src/widgets/itemviews/qdirmodel.h index 30810cf4f6..ab91bbd763 100644 --- a/src/widgets/itemviews/qdirmodel.h +++ b/src/widgets/itemviews/qdirmodel.h @@ -66,31 +66,31 @@ public: }; QDirModel(const QStringList &nameFilters, QDir::Filters filters, - QDir::SortFlags sort, QObject *parent = Q_NULLPTR); - explicit QDirModel(QObject *parent = Q_NULLPTR); + QDir::SortFlags sort, QObject *parent = nullptr); + explicit QDirModel(QObject *parent = nullptr); ~QDirModel(); - QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const Q_DECL_OVERRIDE; - QModelIndex parent(const QModelIndex &child) const Q_DECL_OVERRIDE; + QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const override; + QModelIndex parent(const QModelIndex &child) const override; - int rowCount(const QModelIndex &parent = QModelIndex()) const Q_DECL_OVERRIDE; - int columnCount(const QModelIndex &parent = QModelIndex()) const Q_DECL_OVERRIDE; + int rowCount(const QModelIndex &parent = QModelIndex()) const override; + int columnCount(const QModelIndex &parent = QModelIndex()) const override; - QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const Q_DECL_OVERRIDE; - bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) Q_DECL_OVERRIDE; + QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; + bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override; - QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const Q_DECL_OVERRIDE; + QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; - bool hasChildren(const QModelIndex &index = QModelIndex()) const Q_DECL_OVERRIDE; - Qt::ItemFlags flags(const QModelIndex &index) const Q_DECL_OVERRIDE; + bool hasChildren(const QModelIndex &index = QModelIndex()) const override; + Qt::ItemFlags flags(const QModelIndex &index) const override; - void sort(int column, Qt::SortOrder order = Qt::AscendingOrder) Q_DECL_OVERRIDE; + void sort(int column, Qt::SortOrder order = Qt::AscendingOrder) override; - QStringList mimeTypes() const Q_DECL_OVERRIDE; - QMimeData *mimeData(const QModelIndexList &indexes) const Q_DECL_OVERRIDE; + QStringList mimeTypes() const override; + QMimeData *mimeData(const QModelIndexList &indexes) const override; bool dropMimeData(const QMimeData *data, Qt::DropAction action, - int row, int column, const QModelIndex &parent) Q_DECL_OVERRIDE; - Qt::DropActions supportedDropActions() const Q_DECL_OVERRIDE; + int row, int column, const QModelIndex &parent) override; + Qt::DropActions supportedDropActions() const override; // QDirModel specific API @@ -133,7 +133,7 @@ public Q_SLOTS: void refresh(const QModelIndex &parent = QModelIndex()); protected: - QDirModel(QDirModelPrivate &, QObject *parent = Q_NULLPTR); + QDirModel(QDirModelPrivate &, QObject *parent = nullptr); friend class QFileDialogPrivate; private: diff --git a/src/widgets/itemviews/qheaderview.cpp b/src/widgets/itemviews/qheaderview.cpp index e1aec3f4bd..c90a61d4ff 100644 --- a/src/widgets/itemviews/qheaderview.cpp +++ b/src/widgets/itemviews/qheaderview.cpp @@ -361,7 +361,9 @@ void QHeaderView::setModel(QAbstractItemModel *model) QObject::disconnect(d->model, SIGNAL(columnsRemoved(QModelIndex,int,int)), this, SLOT(_q_sectionsRemoved(QModelIndex,int,int))); QObject::disconnect(d->model, SIGNAL(columnsAboutToBeMoved(QModelIndex,int,int,QModelIndex,int)), - this, SLOT(_q_layoutAboutToBeChanged())); + this, SLOT(_q_sectionsAboutToBeChanged())); + QObject::disconnect(d->model, SIGNAL(columnsMoved(QModelIndex,int,int,QModelIndex,int)), + this, SLOT(_q_sectionsChanged())); } else { QObject::disconnect(d->model, SIGNAL(rowsInserted(QModelIndex,int,int)), this, SLOT(sectionsInserted(QModelIndex,int,int))); @@ -370,12 +372,16 @@ void QHeaderView::setModel(QAbstractItemModel *model) QObject::disconnect(d->model, SIGNAL(rowsRemoved(QModelIndex,int,int)), this, SLOT(_q_sectionsRemoved(QModelIndex,int,int))); QObject::disconnect(d->model, SIGNAL(rowsAboutToBeMoved(QModelIndex,int,int,QModelIndex,int)), - this, SLOT(_q_layoutAboutToBeChanged())); + this, SLOT(_q_sectionsAboutToBeChanged())); + QObject::disconnect(d->model, SIGNAL(rowsMoved(QModelIndex,int,int,QModelIndex,int)), + this, SLOT(_q_sectionsChanged())); } QObject::disconnect(d->model, SIGNAL(headerDataChanged(Qt::Orientation,int,int)), this, SLOT(headerDataChanged(Qt::Orientation,int,int))); QObject::disconnect(d->model, SIGNAL(layoutAboutToBeChanged()), - this, SLOT(_q_layoutAboutToBeChanged())); + this, SLOT(_q_sectionsAboutToBeChanged())); + QObject::disconnect(d->model, SIGNAL(layoutChanged()), + this, SLOT(_q_sectionsChanged())); } if (model && model != QAbstractItemModelPrivate::staticEmptyModel()) { @@ -387,7 +393,9 @@ void QHeaderView::setModel(QAbstractItemModel *model) QObject::connect(model, SIGNAL(columnsRemoved(QModelIndex,int,int)), this, SLOT(_q_sectionsRemoved(QModelIndex,int,int))); QObject::connect(model, SIGNAL(columnsAboutToBeMoved(QModelIndex,int,int,QModelIndex,int)), - this, SLOT(_q_layoutAboutToBeChanged())); + this, SLOT(_q_sectionsAboutToBeChanged())); + QObject::connect(model, SIGNAL(columnsMoved(QModelIndex,int,int,QModelIndex,int)), + this, SLOT(_q_sectionsChanged())); } else { QObject::connect(model, SIGNAL(rowsInserted(QModelIndex,int,int)), this, SLOT(sectionsInserted(QModelIndex,int,int))); @@ -396,12 +404,16 @@ void QHeaderView::setModel(QAbstractItemModel *model) QObject::connect(model, SIGNAL(rowsRemoved(QModelIndex,int,int)), this, SLOT(_q_sectionsRemoved(QModelIndex,int,int))); QObject::connect(model, SIGNAL(rowsAboutToBeMoved(QModelIndex,int,int,QModelIndex,int)), - this, SLOT(_q_layoutAboutToBeChanged())); + this, SLOT(_q_sectionsAboutToBeChanged())); + QObject::connect(model, SIGNAL(rowsMoved(QModelIndex,int,int,QModelIndex,int)), + this, SLOT(_q_sectionsChanged())); } QObject::connect(model, SIGNAL(headerDataChanged(Qt::Orientation,int,int)), this, SLOT(headerDataChanged(Qt::Orientation,int,int))); QObject::connect(model, SIGNAL(layoutAboutToBeChanged()), - this, SLOT(_q_layoutAboutToBeChanged())); + this, SLOT(_q_sectionsAboutToBeChanged())); + QObject::connect(model, SIGNAL(layoutChanged()), + this, SLOT(_q_sectionsChanged())); } d->state = QHeaderViewPrivate::NoClear; @@ -608,7 +620,7 @@ int QHeaderView::visualIndexAt(int position) const return -1; if (d->reverse()) - vposition = d->viewport->width() - vposition; + vposition = d->viewport->width() - vposition - 1; vposition += d->offset; if (vposition > d->length) @@ -874,6 +886,10 @@ void QHeaderView::resizeSection(int logical, int size) if (logical < 0 || logical >= count() || size < 0 || size > maxSizeSection) return; + // make sure to not exceed bounds when setting size programmatically + if (size > 0) + size = qBound(minimumSectionSize(), size, maximumSectionSize()); + if (isSectionHidden(logical)) { d->hiddenSectionSize.insert(logical, size); return; @@ -1103,10 +1119,15 @@ int QHeaderView::logicalIndex(int visualIndex) const /*! \since 5.0 - If \a movable is true, the header may be moved by the user; otherwise it - is fixed in place. + If \a movable is true, the header sections may be moved by the user; + otherwise they are fixed in place. + + When used in combination with QTreeView, the first column is not + movable (since it contains the tree structure), by default. + You can make it movable with setFirstSectionMovable(true). \sa sectionsMovable(), sectionMoved() + \sa setFirstSectionMovable() */ void QHeaderView::setSectionsMovable(bool movable) @@ -1131,6 +1152,9 @@ void QHeaderView::setSectionsMovable(bool movable) Returns \c true if the header can be moved by the user; otherwise returns false. + By default, sections are movable in QTreeView (except for the first one), + and not movable in QTableView. + \sa setSectionsMovable() */ @@ -1151,6 +1175,39 @@ bool QHeaderView::sectionsMovable() const */ /*! + \since 5.10 + + If \a movable is true, the first column can be moved by the user. + In a QTreeView, the first column holds the tree structure and is + therefore non-movable by default, even after setSectionsMovable(true). + + It can be made movable again, for instance in the case of flat lists + without a tree structure, by calling this method. + In such a scenario, it is recommended to call QTreeView::setRootIsDecorated(false) + as well. + + This method has no effect unless setSectionsMovable(true) is called as well. + \sa setSectionsMovable() +*/ +void QHeaderView::setFirstSectionMovable(bool movable) +{ + Q_D(QHeaderView); + d->allowUserMoveOfSection0 = movable; +} + +/*! + \since 5.10 + + Returns \c true if the first column can be moved by the user, + when this header is used in a QTreeView. +*/ +bool QHeaderView::firstSectionMovable() const +{ + Q_D(const QHeaderView); + return d->allowUserMoveOfSection0; +} + +/*! \since 5.0 If \a clickable is true, the header will respond to single clicks. @@ -1608,9 +1665,25 @@ void QHeaderView::setMinimumSectionSize(int size) Q_D(QHeaderView); if (size < -1 || size > maxSizeSection) return; + // larger new min size - check current section sizes + const bool needSizeCheck = size > d->minimumSectionSize; d->minimumSectionSize = size; if (d->minimumSectionSize > maximumSectionSize()) - d->maximumSectionSize = size; + setMaximumSectionSize(size); + + if (needSizeCheck) { + if (d->hasAutoResizeSections()) { + d->doDelayedResizeSections(); + } else { + for (int visual = 0; visual < d->sectionCount(); ++visual) { + if (d->isVisualIndexHidden(visual)) + continue; + if (d->headerSectionSize(visual) < d->minimumSectionSize) + resizeSection(logicalIndex(visual), size); + } + } + } + } /*! @@ -1647,7 +1720,22 @@ void QHeaderView::setMaximumSectionSize(int size) if (minimumSectionSize() > size) d->minimumSectionSize = size; + // smaller new max size - check current section sizes + const bool needSizeCheck = size < d->maximumSectionSize; d->maximumSectionSize = size; + + if (needSizeCheck) { + if (d->hasAutoResizeSections()) { + d->doDelayedResizeSections(); + } else { + for (int visual = 0; visual < d->sectionCount(); ++visual) { + if (d->isVisualIndexHidden(visual)) + continue; + if (d->headerSectionSize(visual) > d->maximumSectionSize) + resizeSection(logicalIndex(visual), size); + } + } + } } @@ -2062,7 +2150,7 @@ void QHeaderViewPrivate::_q_sectionsRemoved(const QModelIndex &parent, viewport->update(); } -void QHeaderViewPrivate::_q_layoutAboutToBeChanged() +void QHeaderViewPrivate::_q_sectionsAboutToBeChanged() { //if there is no row/column we can't have mapping for columns //because no QModelIndex in the model would be valid @@ -2096,7 +2184,7 @@ void QHeaderViewPrivate::_q_layoutAboutToBeChanged() } } -void QHeaderViewPrivate::_q_layoutChanged() +void QHeaderViewPrivate::_q_sectionsChanged() { Q_Q(QHeaderView); viewport->update(); @@ -2565,8 +2653,20 @@ void QHeaderView::mouseMoveEvent(QMouseEvent *e) if (handle != -1 && (sectionResizeMode(handle) == Interactive)) { if (!hasCursor) setCursor(d->orientation == Qt::Horizontal ? Qt::SplitHCursor : Qt::SplitVCursor); - } else if (hasCursor) { - unsetCursor(); + } else { + if (hasCursor) + unsetCursor(); +#ifndef QT_NO_STATUSTIP + int logical = logicalIndexAt(pos); + QString statusTip; + if (logical != -1) + statusTip = d->model->headerData(logical, d->orientation, Qt::StatusTipRole).toString(); + if (d->shouldClearStatusTip || !statusTip.isEmpty()) { + QStatusTipEvent tip(statusTip); + QCoreApplication::sendEvent(d->parent, &tip); + d->shouldClearStatusTip = !statusTip.isEmpty(); + } +#endif // !QT_NO_STATUSTIP } #endif return; @@ -2794,14 +2894,18 @@ void QHeaderView::paintSection(QPainter *painter, const QRect &rect, int logical if (isSortIndicatorShown() && sortIndicatorSection() == logicalIndex && isHeaderArrowOnTheSide) margin += style()->pixelMetric(QStyle::PM_HeaderMarkSize, 0, this); - if (d->textElideMode != Qt::ElideNone) - opt.text = opt.fontMetrics.elidedText(opt.text, d->textElideMode , rect.width() - margin); - - QVariant variant = d->model->headerData(logicalIndex, d->orientation, - Qt::DecorationRole); + const QVariant variant = d->model->headerData(logicalIndex, d->orientation, + Qt::DecorationRole); opt.icon = qvariant_cast<QIcon>(variant); if (opt.icon.isNull()) opt.icon = qvariant_cast<QPixmap>(variant); + if (!opt.icon.isNull()) // see CT_HeaderSection + margin += style()->pixelMetric(QStyle::PM_SmallIconSize, 0, this) + + style()->pixelMetric(QStyle::PM_HeaderMargin, 0, this); + + if (d->textElideMode != Qt::ElideNone) + opt.text = opt.fontMetrics.elidedText(opt.text, d->textElideMode , rect.width() - margin); + QVariant foregroundBrush = d->model->headerData(logicalIndex, d->orientation, Qt::ForegroundRole); if (foregroundBrush.canConvert<QBrush>()) @@ -3412,9 +3516,11 @@ void QHeaderViewPrivate::resizeSections(QHeaderView::ResizeMode globalMode, bool int logicalIndex = q->logicalIndex(i); sectionSize = qMax(viewSectionSizeHint(logicalIndex), q->sectionSizeHint(logicalIndex)); - if (sectionSize > q->maximumSectionSize()) - sectionSize = q->maximumSectionSize(); } + sectionSize = qBound(q->minimumSectionSize(), + sectionSize, + q->maximumSectionSize()); + section_sizes.append(sectionSize); lengthToStretch -= sectionSize; } diff --git a/src/widgets/itemviews/qheaderview.h b/src/widgets/itemviews/qheaderview.h index ec4500d81e..cfe2d24453 100644 --- a/src/widgets/itemviews/qheaderview.h +++ b/src/widgets/itemviews/qheaderview.h @@ -74,16 +74,16 @@ public: }; Q_ENUM(ResizeMode) - explicit QHeaderView(Qt::Orientation orientation, QWidget *parent = Q_NULLPTR); + explicit QHeaderView(Qt::Orientation orientation, QWidget *parent = nullptr); virtual ~QHeaderView(); - void setModel(QAbstractItemModel *model) Q_DECL_OVERRIDE; + void setModel(QAbstractItemModel *model) override; Qt::Orientation orientation() const; int offset() const; int length() const; - QSize sizeHint() const Q_DECL_OVERRIDE; - void setVisible(bool v) Q_DECL_OVERRIDE; + QSize sizeHint() const override; + void setVisible(bool v) override; int sectionSizeHint(int logicalIndex) const; int visualIndexAt(int position) const; @@ -118,6 +118,8 @@ public: inline QT_DEPRECATED void setMovable(bool movable) { setSectionsMovable(movable); } inline QT_DEPRECATED bool isMovable() const { return sectionsMovable(); } #endif + void setFirstSectionMovable(bool movable); + bool firstSectionMovable() const; void setSectionsClickable(bool clickable); bool sectionsClickable() const; @@ -172,7 +174,7 @@ public: Qt::Alignment defaultAlignment() const; void setDefaultAlignment(Qt::Alignment alignment); - void doItemsLayout() Q_DECL_OVERRIDE; + void doItemsLayout() override; bool sectionsMoved() const; bool sectionsHidden() const; @@ -181,7 +183,7 @@ public: bool restoreState(const QByteArray &state); #endif - void reset() Q_DECL_OVERRIDE; + void reset() override; public Q_SLOTS: void setOffset(int offset); @@ -208,41 +210,41 @@ protected Q_SLOTS: void sectionsAboutToBeRemoved(const QModelIndex &parent, int logicalFirst, int logicalLast); protected: - QHeaderView(QHeaderViewPrivate &dd, Qt::Orientation orientation, QWidget *parent = Q_NULLPTR); + QHeaderView(QHeaderViewPrivate &dd, Qt::Orientation orientation, QWidget *parent = nullptr); void initialize(); void initializeSections(); void initializeSections(int start, int end); - void currentChanged(const QModelIndex ¤t, const QModelIndex &old) Q_DECL_OVERRIDE; + void currentChanged(const QModelIndex ¤t, const QModelIndex &old) override; - bool event(QEvent *e) Q_DECL_OVERRIDE; - void paintEvent(QPaintEvent *e) Q_DECL_OVERRIDE; - void mousePressEvent(QMouseEvent *e) Q_DECL_OVERRIDE; - void mouseMoveEvent(QMouseEvent *e) Q_DECL_OVERRIDE; - void mouseReleaseEvent(QMouseEvent *e) Q_DECL_OVERRIDE; - void mouseDoubleClickEvent(QMouseEvent *e) Q_DECL_OVERRIDE; - bool viewportEvent(QEvent *e) Q_DECL_OVERRIDE; + bool event(QEvent *e) override; + void paintEvent(QPaintEvent *e) override; + void mousePressEvent(QMouseEvent *e) override; + void mouseMoveEvent(QMouseEvent *e) override; + void mouseReleaseEvent(QMouseEvent *e) override; + void mouseDoubleClickEvent(QMouseEvent *e) override; + bool viewportEvent(QEvent *e) override; virtual void paintSection(QPainter *painter, const QRect &rect, int logicalIndex) const; virtual QSize sectionSizeFromContents(int logicalIndex) const; - int horizontalOffset() const Q_DECL_OVERRIDE; - int verticalOffset() const Q_DECL_OVERRIDE; - void updateGeometries() Q_DECL_OVERRIDE; - void scrollContentsBy(int dx, int dy) Q_DECL_OVERRIDE; + int horizontalOffset() const override; + int verticalOffset() const override; + void updateGeometries() override; + void scrollContentsBy(int dx, int dy) override; - void dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector<int> &roles = QVector<int>()) Q_DECL_OVERRIDE; - void rowsInserted(const QModelIndex &parent, int start, int end) Q_DECL_OVERRIDE; + void dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector<int> &roles = QVector<int>()) override; + void rowsInserted(const QModelIndex &parent, int start, int end) override; - QRect visualRect(const QModelIndex &index) const Q_DECL_OVERRIDE; - void scrollTo(const QModelIndex &index, ScrollHint hint) Q_DECL_OVERRIDE; + QRect visualRect(const QModelIndex &index) const override; + void scrollTo(const QModelIndex &index, ScrollHint hint) override; - QModelIndex indexAt(const QPoint &p) const Q_DECL_OVERRIDE; - bool isIndexHidden(const QModelIndex &index) const Q_DECL_OVERRIDE; + QModelIndex indexAt(const QPoint &p) const override; + bool isIndexHidden(const QModelIndex &index) const override; - QModelIndex moveCursor(CursorAction, Qt::KeyboardModifiers) Q_DECL_OVERRIDE; - void setSelection(const QRect& rect, QItemSelectionModel::SelectionFlags flags) Q_DECL_OVERRIDE; - QRegion visualRegionForSelection(const QItemSelection &selection) const Q_DECL_OVERRIDE; + QModelIndex moveCursor(CursorAction, Qt::KeyboardModifiers) override; + void setSelection(const QRect& rect, QItemSelectionModel::SelectionFlags flags) override; + QRegion visualRegionForSelection(const QItemSelection &selection) const override; void initStyleOption(QStyleOptionHeader *option) const; friend class QTableView; @@ -250,7 +252,8 @@ protected: private: Q_PRIVATE_SLOT(d_func(), void _q_sectionsRemoved(const QModelIndex &parent, int logicalFirst, int logicalLast)) - Q_PRIVATE_SLOT(d_func(), void _q_layoutAboutToBeChanged()) + Q_PRIVATE_SLOT(d_func(), void _q_sectionsAboutToBeChanged()) + Q_PRIVATE_SLOT(d_func(), void _q_sectionsChanged()) Q_DECLARE_PRIVATE(QHeaderView) Q_DISABLE_COPY(QHeaderView) }; diff --git a/src/widgets/itemviews/qheaderview_p.h b/src/widgets/itemviews/qheaderview_p.h index c9c2cf8493..24dc3bf075 100644 --- a/src/widgets/itemviews/qheaderview_p.h +++ b/src/widgets/itemviews/qheaderview_p.h @@ -120,8 +120,8 @@ public: void updateHiddenSections(int logicalFirst, int logicalLast); void resizeSections(QHeaderView::ResizeMode globalMode, bool useGlobalMode = false); void _q_sectionsRemoved(const QModelIndex &,int,int); - void _q_layoutAboutToBeChanged(); - void _q_layoutChanged() override; + void _q_sectionsAboutToBeChanged(); + void _q_sectionsChanged(); bool isSectionSelected(int section) const; bool isFirstVisibleSection(int section) const; @@ -242,10 +242,6 @@ public: } } - inline void setAllowUserMoveOfSection0(bool b) { - allowUserMoveOfSection0 = b; - } - void clear(); void flipSortIndicator(int section); void cascadingResize(int visual, int newSize); diff --git a/src/widgets/itemviews/qitemdelegate.cpp b/src/widgets/itemviews/qitemdelegate.cpp index 68c02e9edb..91122283a4 100644 --- a/src/widgets/itemviews/qitemdelegate.cpp +++ b/src/widgets/itemviews/qitemdelegate.cpp @@ -94,10 +94,7 @@ public: inline static QString replaceNewLine(QString text) { - const QChar nl = QLatin1Char('\n'); - for (int i = 0; i < text.count(); ++i) - if (text.at(i) == nl) - text[i] = QChar::LineSeparator; + text.replace(QLatin1Char('\n'), QChar::LineSeparator); return text; } @@ -806,11 +803,14 @@ void QItemDelegate::doLayout(const QStyleOptionViewItem &option, const bool hasCheck = checkRect->isValid(); const bool hasPixmap = pixmapRect->isValid(); const bool hasText = textRect->isValid(); - const int textMargin = hasText ? style->pixelMetric(QStyle::PM_FocusFrameHMargin, 0, widget) + 1 : 0; - const int pixmapMargin = hasPixmap ? style->pixelMetric(QStyle::PM_FocusFrameHMargin, 0, widget) + 1 : 0; - const int checkMargin = hasCheck ? style->pixelMetric(QStyle::PM_FocusFrameHMargin, 0, widget) + 1 : 0; - int x = option.rect.left(); - int y = option.rect.top(); + const bool hasMargin = (hasText | hasPixmap | hasCheck); + const int frameHMargin = hasMargin ? + style->pixelMetric(QStyle::PM_FocusFrameHMargin, 0, widget) + 1 : 0; + const int textMargin = hasText ? frameHMargin : 0; + const int pixmapMargin = hasPixmap ? frameHMargin : 0; + const int checkMargin = hasCheck ? frameHMargin : 0; + const int x = option.rect.left(); + const int y = option.rect.top(); int w, h; textRect->adjust(-textMargin, 0, textMargin, 0); // add width padding @@ -845,7 +845,7 @@ void QItemDelegate::doLayout(const QStyleOptionViewItem &option, if (option.direction == Qt::RightToLeft) { check.setRect(x + w - cw, y, cw, h); } else { - check.setRect(x + checkMargin, y, cw, h); + check.setRect(x, y, cw, h); } } @@ -988,7 +988,7 @@ QPixmap *QItemDelegate::selected(const QPixmap &pixmap, const QPalette &palette, painter.end(); QPixmap selected = QPixmap(QPixmap::fromImage(img)); - int n = (img.byteCount() >> 10) + 1; + int n = (img.sizeInBytes() >> 10) + 1; if (QPixmapCache::cacheLimit() < n) QPixmapCache::setCacheLimit(n); @@ -1090,7 +1090,7 @@ QRect QItemDelegate::textRectangle(QPainter * /*painter*/, const QRect &rect, \endlist In the case of \uicontrol Tab, \uicontrol Backtab, \uicontrol Enter and \uicontrol Return - key press events, the \a editor's data is comitted to the model + key press events, the \a editor's data is committed to the model and the editor is closed. If the \a event is a \uicontrol Tab key press the view will open an editor on the next item in the view. Likewise, if the \a event is a \uicontrol Backtab key press the diff --git a/src/widgets/itemviews/qitemdelegate.h b/src/widgets/itemviews/qitemdelegate.h index 21594327ef..539dec4374 100644 --- a/src/widgets/itemviews/qitemdelegate.h +++ b/src/widgets/itemviews/qitemdelegate.h @@ -59,7 +59,7 @@ class Q_WIDGETS_EXPORT QItemDelegate : public QAbstractItemDelegate Q_PROPERTY(bool clipping READ hasClipping WRITE setClipping) public: - explicit QItemDelegate(QObject *parent = Q_NULLPTR); + explicit QItemDelegate(QObject *parent = nullptr); ~QItemDelegate(); bool hasClipping() const; @@ -68,21 +68,21 @@ public: // painting void paint(QPainter *painter, const QStyleOptionViewItem &option, - const QModelIndex &index) const Q_DECL_OVERRIDE; + const QModelIndex &index) const override; QSize sizeHint(const QStyleOptionViewItem &option, - const QModelIndex &index) const Q_DECL_OVERRIDE; + const QModelIndex &index) const override; // editing QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, - const QModelIndex &index) const Q_DECL_OVERRIDE; + const QModelIndex &index) const override; - void setEditorData(QWidget *editor, const QModelIndex &index) const Q_DECL_OVERRIDE; - void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const Q_DECL_OVERRIDE; + void setEditorData(QWidget *editor, const QModelIndex &index) const override; + void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override; void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, - const QModelIndex &index) const Q_DECL_OVERRIDE; + const QModelIndex &index) const override; // editor factory QItemEditorFactory *itemEditorFactory() const; @@ -105,9 +105,9 @@ protected: QRect rect(const QStyleOptionViewItem &option, const QModelIndex &index, int role) const; - bool eventFilter(QObject *object, QEvent *event) Q_DECL_OVERRIDE; + bool eventFilter(QObject *object, QEvent *event) override; bool editorEvent(QEvent *event, QAbstractItemModel *model, - const QStyleOptionViewItem &option, const QModelIndex &index) Q_DECL_OVERRIDE; + const QStyleOptionViewItem &option, const QModelIndex &index) override; QStyleOptionViewItem setOptions(const QModelIndex &index, const QStyleOptionViewItem &option) const; diff --git a/src/widgets/itemviews/qitemeditorfactory.cpp b/src/widgets/itemviews/qitemeditorfactory.cpp index b580f0e840..0986da9707 100644 --- a/src/widgets/itemviews/qitemeditorfactory.cpp +++ b/src/widgets/itemviews/qitemeditorfactory.cpp @@ -233,8 +233,8 @@ class QDefaultItemEditorFactory : public QItemEditorFactory { public: inline QDefaultItemEditorFactory() {} - QWidget *createEditor(int userType, QWidget *parent) const Q_DECL_OVERRIDE; - QByteArray valuePropertyName(int) const Q_DECL_OVERRIDE; + QWidget *createEditor(int userType, QWidget *parent) const override; + QByteArray valuePropertyName(int) const override; }; QWidget *QDefaultItemEditorFactory::createEditor(int userType, QWidget *parent) const @@ -468,7 +468,7 @@ QItemEditorCreatorBase::~QItemEditorCreatorBase() */ /*! - \fn QItemEditorCreator::QItemEditorCreator(const QByteArray &valuePropertyName) + \fn template <class T> QItemEditorCreator<T>::QItemEditorCreator(const QByteArray &valuePropertyName) Constructs an editor creator object using \a valuePropertyName as the name of the property to be used for editing. The @@ -480,12 +480,12 @@ QItemEditorCreatorBase::~QItemEditorCreatorBase() */ /*! - \fn QWidget *QItemEditorCreator::createWidget(QWidget *parent) const + \fn template <class T> QWidget *QItemEditorCreator<T>::createWidget(QWidget *parent) const \reimp */ /*! - \fn QByteArray QItemEditorCreator::valuePropertyName() const + \fn template <class T> QByteArray QItemEditorCreator<T>::valuePropertyName() const \reimp */ @@ -524,18 +524,18 @@ QItemEditorCreatorBase::~QItemEditorCreatorBase() */ /*! - \fn QStandardItemEditorCreator::QStandardItemEditorCreator() + \fn template <class T> QStandardItemEditorCreator<T>::QStandardItemEditorCreator() Constructs an editor creator object. */ /*! - \fn QWidget *QStandardItemEditorCreator::createWidget(QWidget *parent) const + \fn template <class T> QWidget *QStandardItemEditorCreator<T>::createWidget(QWidget *parent) const \reimp */ /*! - \fn QByteArray QStandardItemEditorCreator::valuePropertyName() const + \fn template <class T> QByteArray QStandardItemEditorCreator<T>::valuePropertyName() const \reimp */ @@ -587,7 +587,7 @@ void QExpandingLineEdit::resizeToContents() originalWidth = oldWidth; if (QWidget *parent = parentWidget()) { QPoint position = pos(); - int hintWidth = minimumWidth() + fontMetrics().width(displayText()); + int hintWidth = minimumWidth() + fontMetrics().horizontalAdvance(displayText()); int parentWidth = parent->width(); int maxWidth = isRightToLeft() ? position.x() + oldWidth : parentWidth - position.x(); int newWidth = qBound(originalWidth, hintWidth, maxWidth); diff --git a/src/widgets/itemviews/qitemeditorfactory_p.h b/src/widgets/itemviews/qitemeditorfactory_p.h index 46a8da1d8f..e78f42b729 100644 --- a/src/widgets/itemviews/qitemeditorfactory_p.h +++ b/src/widgets/itemviews/qitemeditorfactory_p.h @@ -74,7 +74,7 @@ public: } protected: - void changeEvent(QEvent *e) Q_DECL_OVERRIDE; + void changeEvent(QEvent *e) override; public Q_SLOTS: void resizeToContents(); diff --git a/src/widgets/itemviews/qlistview.cpp b/src/widgets/itemviews/qlistview.cpp index 9217fec10e..6777b09043 100644 --- a/src/widgets/itemviews/qlistview.cpp +++ b/src/widgets/itemviews/qlistview.cpp @@ -657,8 +657,7 @@ QItemViewPaintPairs QListViewPrivate::draggablePaintPairs(const QModelIndexList for (const auto &index : indexes) { if (std::binary_search(visibleIndexes.cbegin(), visibleIndexes.cend(), index)) { const QRect current = q->visualRect(index); - QItemViewPaintPair p = { current, index }; - ret += p; + ret.append({current, index}); rect |= current; } } @@ -981,9 +980,18 @@ void QListView::paintEvent(QPaintEvent *e) ? qMax(viewport()->size().width(), d->contentsSize().width()) - 2 * d->spacing() : qMax(viewport()->size().height(), d->contentsSize().height()) - 2 * d->spacing(); + const int rowCount = d->commonListView->rowCount(); QVector<QModelIndex>::const_iterator end = toBeRendered.constEnd(); for (QVector<QModelIndex>::const_iterator it = toBeRendered.constBegin(); it != end; ++it) { Q_ASSERT((*it).isValid()); + if (rowCount == 1) + option.viewItemPosition = QStyleOptionViewItem::OnlyOne; + else if ((*it).row() == 0) + option.viewItemPosition = QStyleOptionViewItem::Beginning; + else if ((*it).row() == rowCount - 1) + option.viewItemPosition = QStyleOptionViewItem::End; + else + option.viewItemPosition = QStyleOptionViewItem::Middle; option.rect = visualRect(*it); if (flow() == TopToBottom) diff --git a/src/widgets/itemviews/qlistview.h b/src/widgets/itemviews/qlistview.h index 66ec9b18b1..2da510facf 100644 --- a/src/widgets/itemviews/qlistview.h +++ b/src/widgets/itemviews/qlistview.h @@ -78,7 +78,7 @@ public: enum ViewMode { ListMode, IconMode }; Q_ENUM(ViewMode) - explicit QListView(QWidget *parent = Q_NULLPTR); + explicit QListView(QWidget *parent = nullptr); ~QListView(); void setMovement(Movement movement); @@ -125,67 +125,67 @@ public: void setSelectionRectVisible(bool show); bool isSelectionRectVisible() const; - QRect visualRect(const QModelIndex &index) const Q_DECL_OVERRIDE; - void scrollTo(const QModelIndex &index, ScrollHint hint = EnsureVisible) Q_DECL_OVERRIDE; - QModelIndex indexAt(const QPoint &p) const Q_DECL_OVERRIDE; + QRect visualRect(const QModelIndex &index) const override; + void scrollTo(const QModelIndex &index, ScrollHint hint = EnsureVisible) override; + QModelIndex indexAt(const QPoint &p) const override; - void doItemsLayout() Q_DECL_OVERRIDE; - void reset() Q_DECL_OVERRIDE; - void setRootIndex(const QModelIndex &index) Q_DECL_OVERRIDE; + void doItemsLayout() override; + void reset() override; + void setRootIndex(const QModelIndex &index) override; Q_SIGNALS: void indexesMoved(const QModelIndexList &indexes); protected: - QListView(QListViewPrivate &, QWidget *parent = Q_NULLPTR); + QListView(QListViewPrivate &, QWidget *parent = nullptr); - bool event(QEvent *e) Q_DECL_OVERRIDE; + bool event(QEvent *e) override; - void scrollContentsBy(int dx, int dy) Q_DECL_OVERRIDE; + void scrollContentsBy(int dx, int dy) override; void resizeContents(int width, int height); QSize contentsSize() const; - void dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector<int> &roles = QVector<int>()) Q_DECL_OVERRIDE; - void rowsInserted(const QModelIndex &parent, int start, int end) Q_DECL_OVERRIDE; - void rowsAboutToBeRemoved(const QModelIndex &parent, int start, int end) Q_DECL_OVERRIDE; + void dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector<int> &roles = QVector<int>()) override; + void rowsInserted(const QModelIndex &parent, int start, int end) override; + void rowsAboutToBeRemoved(const QModelIndex &parent, int start, int end) override; - void mouseMoveEvent(QMouseEvent *e) Q_DECL_OVERRIDE; - void mouseReleaseEvent(QMouseEvent *e) Q_DECL_OVERRIDE; + void mouseMoveEvent(QMouseEvent *e) override; + void mouseReleaseEvent(QMouseEvent *e) override; #if QT_CONFIG(wheelevent) - void wheelEvent(QWheelEvent *e) Q_DECL_OVERRIDE; + void wheelEvent(QWheelEvent *e) override; #endif - void timerEvent(QTimerEvent *e) Q_DECL_OVERRIDE; - void resizeEvent(QResizeEvent *e) Q_DECL_OVERRIDE; + void timerEvent(QTimerEvent *e) override; + void resizeEvent(QResizeEvent *e) override; #ifndef QT_NO_DRAGANDDROP - void dragMoveEvent(QDragMoveEvent *e) Q_DECL_OVERRIDE; - void dragLeaveEvent(QDragLeaveEvent *e) Q_DECL_OVERRIDE; - void dropEvent(QDropEvent *e) Q_DECL_OVERRIDE; - void startDrag(Qt::DropActions supportedActions) Q_DECL_OVERRIDE; + void dragMoveEvent(QDragMoveEvent *e) override; + void dragLeaveEvent(QDragLeaveEvent *e) override; + void dropEvent(QDropEvent *e) override; + void startDrag(Qt::DropActions supportedActions) override; #endif // QT_NO_DRAGANDDROP - QStyleOptionViewItem viewOptions() const Q_DECL_OVERRIDE; - void paintEvent(QPaintEvent *e) Q_DECL_OVERRIDE; + QStyleOptionViewItem viewOptions() const override; + void paintEvent(QPaintEvent *e) override; - int horizontalOffset() const Q_DECL_OVERRIDE; - int verticalOffset() const Q_DECL_OVERRIDE; - QModelIndex moveCursor(CursorAction cursorAction, Qt::KeyboardModifiers modifiers) Q_DECL_OVERRIDE; + int horizontalOffset() const override; + int verticalOffset() const override; + QModelIndex moveCursor(CursorAction cursorAction, Qt::KeyboardModifiers modifiers) override; QRect rectForIndex(const QModelIndex &index) const; void setPositionForIndex(const QPoint &position, const QModelIndex &index); - void setSelection(const QRect &rect, QItemSelectionModel::SelectionFlags command) Q_DECL_OVERRIDE; - QRegion visualRegionForSelection(const QItemSelection &selection) const Q_DECL_OVERRIDE; - QModelIndexList selectedIndexes() const Q_DECL_OVERRIDE; + void setSelection(const QRect &rect, QItemSelectionModel::SelectionFlags command) override; + QRegion visualRegionForSelection(const QItemSelection &selection) const override; + QModelIndexList selectedIndexes() const override; - void updateGeometries() Q_DECL_OVERRIDE; + void updateGeometries() override; - bool isIndexHidden(const QModelIndex &index) const Q_DECL_OVERRIDE; + bool isIndexHidden(const QModelIndex &index) const override; - void selectionChanged(const QItemSelection &selected, const QItemSelection &deselected) Q_DECL_OVERRIDE; - void currentChanged(const QModelIndex ¤t, const QModelIndex &previous) Q_DECL_OVERRIDE; + void selectionChanged(const QItemSelection &selected, const QItemSelection &deselected) override; + void currentChanged(const QModelIndex ¤t, const QModelIndex &previous) override; - QSize viewportSizeHint() const Q_DECL_OVERRIDE; + QSize viewportSizeHint() const override; private: int visualIndex(const QModelIndex &index) const; diff --git a/src/widgets/itemviews/qlistwidget.cpp b/src/widgets/itemviews/qlistwidget.cpp index 6c4746e086..1fedad80aa 100644 --- a/src/widgets/itemviews/qlistwidget.cpp +++ b/src/widgets/itemviews/qlistwidget.cpp @@ -189,8 +189,9 @@ int QListModel::rowCount(const QModelIndex &parent) const return parent.isValid() ? 0 : items.count(); } -QModelIndex QListModel::index(QListWidgetItem *item) const +QModelIndex QListModel::index(const QListWidgetItem *item_) const { + QListWidgetItem *item = const_cast<QListWidgetItem *>(item_); if (!item || !item->view || static_cast<const QListModel *>(item->view->model()) != this || items.isEmpty()) return QModelIndex(); @@ -411,10 +412,10 @@ QList<QListWidgetItem*>::iterator QListModel::sortedInsertionIterator( return std::lower_bound(begin, end, item, QListModelGreaterThan()); } -void QListModel::itemChanged(QListWidgetItem *item) +void QListModel::itemChanged(QListWidgetItem *item, const QVector<int> &roles) { - QModelIndex idx = index(item); - emit dataChanged(idx, idx); + const QModelIndex idx = index(item); + emit dataChanged(idx, idx, roles); } QStringList QListModel::mimeTypes() const @@ -710,8 +711,12 @@ 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()) : 0)) - model->itemChanged(this); + if (QListModel *model = (view ? qobject_cast<QListModel*>(view->model()) : nullptr)) { + const QVector<int> roles((role == Qt::DisplayRole) ? + QVector<int>({Qt::DisplayRole, Qt::EditRole}) : + QVector<int>({role})); + model->itemChanged(this, roles); + } } /*! @@ -953,7 +958,8 @@ QDataStream &operator>>(QDataStream &in, QListWidgetItem &item) \sa Qt::ItemFlags */ -void QListWidgetItem::setFlags(Qt::ItemFlags aflags) { +void QListWidgetItem::setFlags(Qt::ItemFlags aflags) +{ itemFlags = aflags; if (QListModel *model = (view ? qobject_cast<QListModel*>(view->model()) : 0)) model->itemChanged(this); @@ -1196,7 +1202,7 @@ void QListWidgetPrivate::_q_dataChanged(const QModelIndex &topLeft, new current item and the item that was previously current. \sa QListWidgetItem, QListView, QTreeView, {Model/View Programming}, - {Config Dialog Example} + {Tab Dialog Example} */ /*! @@ -1619,7 +1625,7 @@ void QListWidget::editItem(QListWidgetItem *item) Opens an editor for the given \a item. The editor remains open after editing. - \sa closePersistentEditor() + \sa closePersistentEditor(), isPersistentEditorOpen() */ void QListWidget::openPersistentEditor(QListWidgetItem *item) { @@ -1631,7 +1637,7 @@ void QListWidget::openPersistentEditor(QListWidgetItem *item) /*! Closes the persistent editor for the given \a item. - \sa openPersistentEditor() + \sa openPersistentEditor(), isPersistentEditorOpen() */ void QListWidget::closePersistentEditor(QListWidgetItem *item) { @@ -1641,6 +1647,20 @@ void QListWidget::closePersistentEditor(QListWidgetItem *item) } /*! + \since 5.10 + + Returns whether a persistent editor is open for item \a item. + + \sa openPersistentEditor(), closePersistentEditor() +*/ +bool QListWidget::isPersistentEditorOpen(QListWidgetItem *item) const +{ + Q_D(const QListWidget); + const QModelIndex index = d->listModel()->index(item); + return QAbstractItemView::isPersistentEditorOpen(index); +} + +/*! \since 4.1 Returns the widget displayed in the given \a item. @@ -1931,14 +1951,28 @@ QList<QListWidgetItem*> QListWidget::items(const QMimeData *data) const /*! Returns the QModelIndex associated with the given \a item. + + \note In Qt versions prior to 5.10, this function took a non-\c{const} \a item. */ -QModelIndex QListWidget::indexFromItem(QListWidgetItem *item) const +QModelIndex QListWidget::indexFromItem(const QListWidgetItem *item) const { Q_D(const QListWidget); return d->listModel()->index(item); } +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) +/*! + \internal + \obsolete + \overload +*/ +QModelIndex QListWidget::indexFromItem(QListWidgetItem *item) const +{ + return indexFromItem(const_cast<const QListWidgetItem *>(item)); +} +#endif + /*! Returns a pointer to the QListWidgetItem associated with the given \a index. */ diff --git a/src/widgets/itemviews/qlistwidget.h b/src/widgets/itemviews/qlistwidget.h index 8471645fb0..8a31411429 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 = Q_NULLPTR, int type = Type); - explicit QListWidgetItem(const QString &text, QListWidget *view = Q_NULLPTR, int type = Type); + explicit QListWidgetItem(QListWidget *view = nullptr, int type = Type); + explicit QListWidgetItem(const QString &text, QListWidget *view = nullptr, int type = Type); explicit QListWidgetItem(const QIcon &icon, const QString &text, - QListWidget *view = Q_NULLPTR, int type = Type); + QListWidget *view = nullptr, int type = Type); QListWidgetItem(const QListWidgetItem &other); virtual ~QListWidgetItem(); @@ -204,10 +204,10 @@ class Q_WIDGETS_EXPORT QListWidget : public QListView friend class QListWidgetItem; friend class QListModel; public: - explicit QListWidget(QWidget *parent = Q_NULLPTR); + explicit QListWidget(QWidget *parent = nullptr); ~QListWidget(); - void setSelectionModel(QItemSelectionModel *selectionModel) Q_DECL_OVERRIDE; + void setSelectionModel(QItemSelectionModel *selectionModel) override; QListWidgetItem *item(int row) const; int row(const QListWidgetItem *item) const; @@ -239,6 +239,8 @@ public: void editItem(QListWidgetItem *item); void openPersistentEditor(QListWidgetItem *item); void closePersistentEditor(QListWidgetItem *item); + using QAbstractItemView::isPersistentEditorOpen; + bool isPersistentEditorOpen(QListWidgetItem *item) const; QWidget *itemWidget(QListWidgetItem *item) const; void setItemWidget(QListWidgetItem *item, QWidget *widget); @@ -251,8 +253,11 @@ public: bool isItemHidden(const QListWidgetItem *item) const; void setItemHidden(const QListWidgetItem *item, bool hide); +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) +protected: +#endif #if QT_CONFIG(draganddrop) - void dropEvent(QDropEvent *event) Q_DECL_OVERRIDE; + void dropEvent(QDropEvent *event) override; #endif public Q_SLOTS: void scrollToItem(const QListWidgetItem *item, QAbstractItemView::ScrollHint hint = EnsureVisible); @@ -264,6 +269,7 @@ Q_SIGNALS: void itemDoubleClicked(QListWidgetItem *item); void itemActivated(QListWidgetItem *item); void itemEntered(QListWidgetItem *item); + // ### Qt 6: add changed roles void itemChanged(QListWidgetItem *item); void currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous); @@ -273,7 +279,7 @@ Q_SIGNALS: void itemSelectionChanged(); protected: - bool event(QEvent *e) Q_DECL_OVERRIDE; + bool event(QEvent *e) override; virtual QStringList mimeTypes() const; #if QT_VERSION >= QT_VERSION_CHECK(6,0,0) virtual QMimeData *mimeData(const QList<QListWidgetItem *> &items) const; @@ -284,13 +290,22 @@ protected: virtual bool dropMimeData(int index, const QMimeData *data, Qt::DropAction action); virtual Qt::DropActions supportedDropActions() const; #endif + +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) +public: +#else +protected: +#endif QList<QListWidgetItem*> items(const QMimeData *data) const; - QModelIndex indexFromItem(QListWidgetItem *item) const; + QModelIndex indexFromItem(const QListWidgetItem *item) const; +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) + QModelIndex indexFromItem(QListWidgetItem *item) const; // ### Qt 6: remove +#endif QListWidgetItem *itemFromIndex(const QModelIndex &index) const; private: - void setModel(QAbstractItemModel *model) Q_DECL_OVERRIDE; + void setModel(QAbstractItemModel *model) override; Qt::SortOrder sortOrder() const; Q_DECLARE_PRIVATE(QListWidget) @@ -308,7 +323,7 @@ private: }; inline void QListWidget::removeItemWidget(QListWidgetItem *aItem) -{ setItemWidget(aItem, Q_NULLPTR); } +{ setItemWidget(aItem, nullptr); } inline void QListWidget::addItem(QListWidgetItem *aitem) { insertItem(count(), aitem); } diff --git a/src/widgets/itemviews/qlistwidget_p.h b/src/widgets/itemviews/qlistwidget_p.h index e8f5540f9c..30b5016db6 100644 --- a/src/widgets/itemviews/qlistwidget_p.h +++ b/src/widgets/itemviews/qlistwidget_p.h @@ -95,7 +95,7 @@ public: int rowCount(const QModelIndex &parent = QModelIndex()) const override; - QModelIndex index(QListWidgetItem *item) const; + QModelIndex index(const QListWidgetItem *item) const; QModelIndex index(int row, int column = 0, const QModelIndex &parent = QModelIndex()) const override; QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; @@ -119,7 +119,7 @@ public: const QList<QListWidgetItem*>::iterator &end, Qt::SortOrder order, QListWidgetItem *item); - void itemChanged(QListWidgetItem *item); + void itemChanged(QListWidgetItem *item, const QVector<int> &roles = QVector<int>()); // dnd QStringList mimeTypes() const override; diff --git a/src/widgets/itemviews/qstyleditemdelegate.cpp b/src/widgets/itemviews/qstyleditemdelegate.cpp index 716df2c729..0f7566e8ec 100644 --- a/src/widgets/itemviews/qstyleditemdelegate.cpp +++ b/src/widgets/itemviews/qstyleditemdelegate.cpp @@ -514,12 +514,13 @@ void QStyledItemDelegate::updateEditorGeometry(QWidget *editor, QStyle *style = widget ? widget->style() : QApplication::style(); QRect geom = style->subElementRect(QStyle::SE_ItemViewItemText, &opt, widget); - if ( editor->layoutDirection() == Qt::RightToLeft) { - const int delta = qSmartMinSize(editor).width() - geom.width(); - if (delta > 0) { - //we need to widen the geometry + const int delta = qSmartMinSize(editor).width() - geom.width(); + if (delta > 0) { + //we need to widen the geometry + if (editor->layoutDirection() == Qt::RightToLeft) geom.adjust(-delta, 0, 0, 0); - } + else + geom.adjust(0, 0, delta, 0); } editor->setGeometry(geom); @@ -570,7 +571,7 @@ void QStyledItemDelegate::setItemEditorFactory(QItemEditorFactory *factory) \uicontrol Return keys are \e not handled. In the case of \uicontrol Tab, \uicontrol Backtab, \uicontrol Enter and \uicontrol Return - key press events, the \a editor's data is comitted to the model + key press events, the \a editor's data is committed to the model and the editor is closed. If the \a event is a \uicontrol Tab key press the view will open an editor on the next item in the view. Likewise, if the \a event is a \uicontrol Backtab key press the diff --git a/src/widgets/itemviews/qstyleditemdelegate.h b/src/widgets/itemviews/qstyleditemdelegate.h index f3b7c4d1f4..2df2450f07 100644 --- a/src/widgets/itemviews/qstyleditemdelegate.h +++ b/src/widgets/itemviews/qstyleditemdelegate.h @@ -58,28 +58,28 @@ class Q_WIDGETS_EXPORT QStyledItemDelegate : public QAbstractItemDelegate Q_OBJECT public: - explicit QStyledItemDelegate(QObject *parent = Q_NULLPTR); + explicit QStyledItemDelegate(QObject *parent = nullptr); ~QStyledItemDelegate(); // painting void paint(QPainter *painter, - const QStyleOptionViewItem &option, const QModelIndex &index) const Q_DECL_OVERRIDE; + const QStyleOptionViewItem &option, const QModelIndex &index) const override; QSize sizeHint(const QStyleOptionViewItem &option, - const QModelIndex &index) const Q_DECL_OVERRIDE; + const QModelIndex &index) const override; // editing QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, - const QModelIndex &index) const Q_DECL_OVERRIDE; + const QModelIndex &index) const override; - void setEditorData(QWidget *editor, const QModelIndex &index) const Q_DECL_OVERRIDE; + void setEditorData(QWidget *editor, const QModelIndex &index) const override; void setModelData(QWidget *editor, QAbstractItemModel *model, - const QModelIndex &index) const Q_DECL_OVERRIDE; + const QModelIndex &index) const override; void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, - const QModelIndex &index) const Q_DECL_OVERRIDE; + const QModelIndex &index) const override; // editor factory QItemEditorFactory *itemEditorFactory() const; @@ -91,9 +91,9 @@ protected: virtual void initStyleOption(QStyleOptionViewItem *option, const QModelIndex &index) const; - bool eventFilter(QObject *object, QEvent *event) Q_DECL_OVERRIDE; + bool eventFilter(QObject *object, QEvent *event) override; bool editorEvent(QEvent *event, QAbstractItemModel *model, - const QStyleOptionViewItem &option, const QModelIndex &index) Q_DECL_OVERRIDE; + const QStyleOptionViewItem &option, const QModelIndex &index) override; private: Q_DECLARE_PRIVATE(QStyledItemDelegate) diff --git a/src/widgets/itemviews/qtableview.cpp b/src/widgets/itemviews/qtableview.cpp index 8ab811e9f7..ec25ccdb12 100644 --- a/src/widgets/itemviews/qtableview.cpp +++ b/src/widgets/itemviews/qtableview.cpp @@ -585,7 +585,7 @@ class QTableCornerButton : public QAbstractButton Q_OBJECT public: QTableCornerButton(QWidget *parent) : QAbstractButton(parent) {} - void paintEvent(QPaintEvent*) Q_DECL_OVERRIDE { + void paintEvent(QPaintEvent*) override { QStyleOptionHeader opt; opt.init(this); QStyle::State state = QStyle::State_None; @@ -971,6 +971,9 @@ int QTableViewPrivate::heightHintForIndex(const QModelIndex &index, int hint, QS option.rect.setHeight(height); option.rect.setX(q->columnViewportPosition(index.column())); option.rect.setWidth(q->columnWidth(index.column())); + // 1px less space when grid is shown (see drawCell) + if (showGrid) + option.rect.setWidth(option.rect.width() - 1); } hint = qMax(hint, q->itemDelegate(index)->sizeHint(option, index).height()); return hint; @@ -1226,7 +1229,7 @@ void QTableView::setHorizontalHeader(QHeaderView *header) delete d->horizontalHeader; d->horizontalHeader = header; d->horizontalHeader->setParent(this); - d->horizontalHeader->d_func()->setAllowUserMoveOfSection0(true); + d->horizontalHeader->setFirstSectionMovable(true); if (!d->horizontalHeader->model()) { d->horizontalHeader->setModel(d->model); if (d->selectionModel) @@ -1264,7 +1267,7 @@ void QTableView::setVerticalHeader(QHeaderView *header) delete d->verticalHeader; d->verticalHeader = header; d->verticalHeader->setParent(this); - d->verticalHeader->d_func()->setAllowUserMoveOfSection0(true); + d->verticalHeader->setFirstSectionMovable(true); if (!d->verticalHeader->model()) { d->verticalHeader->setModel(d->model); if (d->selectionModel) @@ -1362,8 +1365,8 @@ void QTableView::paintEvent(QPaintEvent *event) if (horizontalHeader->count() == 0 || verticalHeader->count() == 0 || !d->itemDelegate) return; - uint x = horizontalHeader->length() - horizontalHeader->offset() - (rightToLeft ? 0 : 1); - uint y = verticalHeader->length() - verticalHeader->offset() - 1; + const int x = horizontalHeader->length() - horizontalHeader->offset() - (rightToLeft ? 0 : 1); + const int y = verticalHeader->length() - verticalHeader->offset() - 1; //firstVisualRow is the visual index of the first visible row. lastVisualRow is the visual index of the last visible Row. //same goes for ...VisualColumn @@ -1415,10 +1418,10 @@ void QTableView::paintEvent(QPaintEvent *event) int top = 0; bool alternateBase = false; if (alternate && verticalHeader->sectionsHidden()) { - uint verticalOffset = verticalHeader->offset(); + const int verticalOffset = verticalHeader->offset(); int row = verticalHeader->logicalIndex(top); for (int y = 0; - ((uint)(y += verticalHeader->sectionSize(top)) <= verticalOffset) && (top < bottom); + ((y += verticalHeader->sectionSize(top)) <= verticalOffset) && (top < bottom); ++top) { row = verticalHeader->logicalIndex(top); if (alternate && !verticalHeader->isSectionHidden(row)) @@ -2131,9 +2134,9 @@ void QTableView::updateGeometries() // ### move this block into the if QSize vsize = d->viewport->size(); QSize max = maximumViewportSize(); - uint horizontalLength = d->horizontalHeader->length(); - uint verticalLength = d->verticalHeader->length(); - if ((uint)max.width() >= horizontalLength && (uint)max.height() >= verticalLength) + const int horizontalLength = d->horizontalHeader->length(); + const int verticalLength = d->verticalHeader->length(); + if (max.width() >= horizontalLength && max.height() >= verticalLength) vsize = max; // horizontal scroll bar diff --git a/src/widgets/itemviews/qtableview.h b/src/widgets/itemviews/qtableview.h index 75f2e7b44c..60c2f34103 100644 --- a/src/widgets/itemviews/qtableview.h +++ b/src/widgets/itemviews/qtableview.h @@ -62,13 +62,13 @@ class Q_WIDGETS_EXPORT QTableView : public QAbstractItemView #endif public: - explicit QTableView(QWidget *parent = Q_NULLPTR); + explicit QTableView(QWidget *parent = nullptr); ~QTableView(); - void setModel(QAbstractItemModel *model) Q_DECL_OVERRIDE; - void setRootIndex(const QModelIndex &index) Q_DECL_OVERRIDE; - void setSelectionModel(QItemSelectionModel *selectionModel) Q_DECL_OVERRIDE; - void doItemsLayout() Q_DECL_OVERRIDE; + void setModel(QAbstractItemModel *model) override; + void setRootIndex(const QModelIndex &index) override; + void setSelectionModel(QItemSelectionModel *selectionModel) override; + void doItemsLayout() override; QHeaderView *horizontalHeader() const; QHeaderView *verticalHeader() const; @@ -109,9 +109,9 @@ public: bool isCornerButtonEnabled() const; #endif - QRect visualRect(const QModelIndex &index) const Q_DECL_OVERRIDE; - void scrollTo(const QModelIndex &index, ScrollHint hint = EnsureVisible) Q_DECL_OVERRIDE; - QModelIndex indexAt(const QPoint &p) const Q_DECL_OVERRIDE; + QRect visualRect(const QModelIndex &index) const override; + void scrollTo(const QModelIndex &index, ScrollHint hint = EnsureVisible) override; + QModelIndex indexAt(const QPoint &p) const override; void setSpan(int row, int column, int rowSpan, int columnSpan); int rowSpan(int row, int column) const; @@ -144,37 +144,37 @@ protected Q_SLOTS: protected: QTableView(QTableViewPrivate &, QWidget *parent); - void scrollContentsBy(int dx, int dy) Q_DECL_OVERRIDE; + void scrollContentsBy(int dx, int dy) override; - QStyleOptionViewItem viewOptions() const Q_DECL_OVERRIDE; - void paintEvent(QPaintEvent *e) Q_DECL_OVERRIDE; + QStyleOptionViewItem viewOptions() const override; + void paintEvent(QPaintEvent *e) override; - void timerEvent(QTimerEvent *event) Q_DECL_OVERRIDE; + void timerEvent(QTimerEvent *event) override; - int horizontalOffset() const Q_DECL_OVERRIDE; - int verticalOffset() const Q_DECL_OVERRIDE; - QModelIndex moveCursor(CursorAction cursorAction, Qt::KeyboardModifiers modifiers) Q_DECL_OVERRIDE; + int horizontalOffset() const override; + int verticalOffset() const override; + QModelIndex moveCursor(CursorAction cursorAction, Qt::KeyboardModifiers modifiers) override; - void setSelection(const QRect &rect, QItemSelectionModel::SelectionFlags command) Q_DECL_OVERRIDE; - QRegion visualRegionForSelection(const QItemSelection &selection) const Q_DECL_OVERRIDE; - QModelIndexList selectedIndexes() const Q_DECL_OVERRIDE; + void setSelection(const QRect &rect, QItemSelectionModel::SelectionFlags command) override; + QRegion visualRegionForSelection(const QItemSelection &selection) const override; + QModelIndexList selectedIndexes() const override; - void updateGeometries() Q_DECL_OVERRIDE; + void updateGeometries() override; - QSize viewportSizeHint() const Q_DECL_OVERRIDE; + QSize viewportSizeHint() const override; - int sizeHintForRow(int row) const Q_DECL_OVERRIDE; - int sizeHintForColumn(int column) const Q_DECL_OVERRIDE; + int sizeHintForRow(int row) const override; + int sizeHintForColumn(int column) const override; - void verticalScrollbarAction(int action) Q_DECL_OVERRIDE; - void horizontalScrollbarAction(int action) Q_DECL_OVERRIDE; + void verticalScrollbarAction(int action) override; + void horizontalScrollbarAction(int action) override; - bool isIndexHidden(const QModelIndex &index) const Q_DECL_OVERRIDE; + bool isIndexHidden(const QModelIndex &index) const override; void selectionChanged(const QItemSelection &selected, - const QItemSelection &deselected) Q_DECL_OVERRIDE; + const QItemSelection &deselected) override; void currentChanged(const QModelIndex ¤t, - const QModelIndex &previous) Q_DECL_OVERRIDE; + const QModelIndex &previous) override; private: friend class QAccessibleItemView; diff --git a/src/widgets/itemviews/qtablewidget.cpp b/src/widgets/itemviews/qtablewidget.cpp index d89fdc9000..1cb88cbeeb 100644 --- a/src/widgets/itemviews/qtablewidget.cpp +++ b/src/widgets/itemviews/qtablewidget.cpp @@ -2223,7 +2223,7 @@ void QTableWidget::editItem(QTableWidgetItem *item) /*! Opens an editor for the give \a item. The editor remains open after editing. - \sa closePersistentEditor() + \sa closePersistentEditor(), isPersistentEditorOpen() */ void QTableWidget::openPersistentEditor(QTableWidgetItem *item) { @@ -2237,7 +2237,7 @@ void QTableWidget::openPersistentEditor(QTableWidgetItem *item) /*! Closes the persistent editor for \a item. - \sa openPersistentEditor() + \sa openPersistentEditor(), isPersistentEditorOpen() */ void QTableWidget::closePersistentEditor(QTableWidgetItem *item) { @@ -2249,6 +2249,20 @@ void QTableWidget::closePersistentEditor(QTableWidgetItem *item) } /*! + \since 5.10 + + Returns whether a persistent editor is open for item \a item. + + \sa openPersistentEditor(), closePersistentEditor() +*/ +bool QTableWidget::isPersistentEditorOpen(QTableWidgetItem *item) const +{ + Q_D(const QTableWidget); + const QModelIndex index = d->tableModel()->index(item); + return QAbstractItemView::isPersistentEditorOpen(index); +} + +/*! \since 4.1 Returns the widget displayed in the cell in the given \a row and \a column. @@ -2641,14 +2655,28 @@ QList<QTableWidgetItem*> QTableWidget::items(const QMimeData *data) const /*! Returns the QModelIndex associated with the given \a item. + + \note In Qt versions prior to 5.10, this function took a non-\c{const} \a item. */ -QModelIndex QTableWidget::indexFromItem(QTableWidgetItem *item) const +QModelIndex QTableWidget::indexFromItem(const QTableWidgetItem *item) const { Q_D(const QTableWidget); return d->tableModel()->index(item); } +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) +/*! + \internal + \obsolete + \overload +*/ +QModelIndex QTableWidget::indexFromItem(QTableWidgetItem *item) const +{ + return indexFromItem(const_cast<const QTableWidgetItem *>(item)); +} +#endif + /*! Returns a pointer to the QTableWidgetItem associated with the given \a index. */ diff --git a/src/widgets/itemviews/qtablewidget.h b/src/widgets/itemviews/qtablewidget.h index 3fecf194e4..7322e3aed7 100644 --- a/src/widgets/itemviews/qtablewidget.h +++ b/src/widgets/itemviews/qtablewidget.h @@ -219,8 +219,8 @@ class Q_WIDGETS_EXPORT QTableWidget : public QTableView friend class QTableModel; public: - explicit QTableWidget(QWidget *parent = Q_NULLPTR); - QTableWidget(int rows, int columns, QWidget *parent = Q_NULLPTR); + explicit QTableWidget(QWidget *parent = nullptr); + QTableWidget(int rows, int columns, QWidget *parent = nullptr); ~QTableWidget(); void setRowCount(int rows); @@ -261,6 +261,8 @@ public: void editItem(QTableWidgetItem *item); void openPersistentEditor(QTableWidgetItem *item); void closePersistentEditor(QTableWidgetItem *item); + using QAbstractItemView::isPersistentEditorOpen; + bool isPersistentEditorOpen(QTableWidgetItem *item) const; QWidget *cellWidget(int row, int column) const; void setCellWidget(int row, int column, QWidget *widget); @@ -316,7 +318,7 @@ Q_SIGNALS: void currentCellChanged(int currentRow, int currentColumn, int previousRow, int previousColumn); protected: - bool event(QEvent *e) Q_DECL_OVERRIDE; + bool event(QEvent *e) override; virtual QStringList mimeTypes() const; #if QT_VERSION >= QT_VERSION_CHECK(6,0,0) virtual QMimeData *mimeData(const QList<QTableWidgetItem *> &items) const; @@ -325,15 +327,26 @@ protected: #endif virtual bool dropMimeData(int row, int column, const QMimeData *data, Qt::DropAction action); virtual Qt::DropActions supportedDropActions() const; + +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) +public: +#else +protected: +#endif QList<QTableWidgetItem*> items(const QMimeData *data) const; - QModelIndex indexFromItem(QTableWidgetItem *item) const; + QModelIndex indexFromItem(const QTableWidgetItem *item) const; +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) + QModelIndex indexFromItem(QTableWidgetItem *item) const; // ### Qt 6: remove +#endif QTableWidgetItem *itemFromIndex(const QModelIndex &index) const; + +protected: #if QT_CONFIG(draganddrop) - void dropEvent(QDropEvent *event) Q_DECL_OVERRIDE; + void dropEvent(QDropEvent *event) override; #endif private: - void setModel(QAbstractItemModel *model) Q_DECL_OVERRIDE; + void setModel(QAbstractItemModel *model) override; Q_DECLARE_PRIVATE(QTableWidget) Q_DISABLE_COPY(QTableWidget) @@ -350,7 +363,7 @@ private: }; inline void QTableWidget::removeCellWidget(int arow, int acolumn) -{ setCellWidget(arow, acolumn, Q_NULLPTR); } +{ setCellWidget(arow, acolumn, nullptr); } inline QTableWidgetItem *QTableWidget::itemAt(int ax, int ay) const { return itemAt(QPoint(ax, ay)); } diff --git a/src/widgets/itemviews/qtreeview.cpp b/src/widgets/itemviews/qtreeview.cpp index 8d27305071..ebeefad682 100644 --- a/src/widgets/itemviews/qtreeview.cpp +++ b/src/widgets/itemviews/qtreeview.cpp @@ -311,7 +311,7 @@ void QTreeView::setHeader(QHeaderView *header) delete d->header; d->header = header; d->header->setParent(this); - d->header->d_func()->setAllowUserMoveOfSection0(false); + d->header->setFirstSectionMovable(false); if (!d->header->model()) { d->header->setModel(d->model); @@ -3057,7 +3057,7 @@ void QTreeViewPrivate::initialize() header->setDefaultAlignment(Qt::AlignLeft|Qt::AlignVCenter); q->setHeader(header); #ifndef QT_NO_ANIMATION - animationsEnabled = q->style()->styleHint(QStyle::SH_Widget_Animate, 0, q); + animationsEnabled = q->style()->styleHint(QStyle::SH_Widget_Animation_Duration, 0, q) > 0; QObject::connect(&animatedOperation, SIGNAL(finished()), q, SLOT(_q_endAnimatedOperation())); #endif //QT_NO_ANIMATION } @@ -4006,6 +4006,27 @@ int QTreeView::visualIndex(const QModelIndex &index) const return d->viewIndex(index); } +/*! + \internal +*/ + +void QTreeView::verticalScrollbarValueChanged(int value) +{ + Q_D(QTreeView); + if (!d->viewItems.isEmpty() && value == verticalScrollBar()->maximum()) { + QModelIndex ret = d->viewItems.last().index; + // Root index will be handled by base class implementation + while (ret.isValid()) { + if (isExpanded(ret) && d->model->canFetchMore(ret)) { + d->model->fetchMore(ret); + break; + } + ret = ret.parent(); + } + } + QAbstractItemView::verticalScrollbarValueChanged(value); +} + QT_END_NAMESPACE #include "moc_qtreeview.cpp" diff --git a/src/widgets/itemviews/qtreeview.h b/src/widgets/itemviews/qtreeview.h index c32c127cd1..e7ee55aa2a 100644 --- a/src/widgets/itemviews/qtreeview.h +++ b/src/widgets/itemviews/qtreeview.h @@ -68,12 +68,12 @@ class Q_WIDGETS_EXPORT QTreeView : public QAbstractItemView Q_PROPERTY(bool expandsOnDoubleClick READ expandsOnDoubleClick WRITE setExpandsOnDoubleClick) public: - explicit QTreeView(QWidget *parent = Q_NULLPTR); + explicit QTreeView(QWidget *parent = nullptr); ~QTreeView(); - void setModel(QAbstractItemModel *model) Q_DECL_OVERRIDE; - void setRootIndex(const QModelIndex &index) Q_DECL_OVERRIDE; - void setSelectionModel(QItemSelectionModel *selectionModel) Q_DECL_OVERRIDE; + void setModel(QAbstractItemModel *model) override; + void setRootIndex(const QModelIndex &index) override; + void setSelectionModel(QItemSelectionModel *selectionModel) override; QHeaderView *header() const; void setHeader(QHeaderView *header); @@ -132,21 +132,21 @@ public: void setTreePosition(int logicalIndex); int treePosition() const; - void keyboardSearch(const QString &search) Q_DECL_OVERRIDE; + void keyboardSearch(const QString &search) override; - QRect visualRect(const QModelIndex &index) const Q_DECL_OVERRIDE; - void scrollTo(const QModelIndex &index, ScrollHint hint = EnsureVisible) Q_DECL_OVERRIDE; - QModelIndex indexAt(const QPoint &p) const Q_DECL_OVERRIDE; + QRect visualRect(const QModelIndex &index) const override; + void scrollTo(const QModelIndex &index, ScrollHint hint = EnsureVisible) override; + QModelIndex indexAt(const QPoint &p) const override; QModelIndex indexAbove(const QModelIndex &index) const; QModelIndex indexBelow(const QModelIndex &index) const; - void doItemsLayout() Q_DECL_OVERRIDE; - void reset() Q_DECL_OVERRIDE; + 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>()) Q_DECL_OVERRIDE; - void selectAll() Q_DECL_OVERRIDE; + void dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector<int> &roles = QVector<int>()) override; + void selectAll() override; Q_SIGNALS: void expanded(const QModelIndex &index); @@ -169,23 +169,24 @@ protected Q_SLOTS: void columnMoved(); void reexpand(); void rowsRemoved(const QModelIndex &parent, int first, int last); + void verticalScrollbarValueChanged(int value) override; protected: - QTreeView(QTreeViewPrivate &dd, QWidget *parent = Q_NULLPTR); - void scrollContentsBy(int dx, int dy) Q_DECL_OVERRIDE; - void rowsInserted(const QModelIndex &parent, int start, int end) Q_DECL_OVERRIDE; - void rowsAboutToBeRemoved(const QModelIndex &parent, int start, int end) Q_DECL_OVERRIDE; + QTreeView(QTreeViewPrivate &dd, QWidget *parent = nullptr); + void scrollContentsBy(int dx, int dy) override; + void rowsInserted(const QModelIndex &parent, int start, int end) override; + void rowsAboutToBeRemoved(const QModelIndex &parent, int start, int end) override; - QModelIndex moveCursor(CursorAction cursorAction, Qt::KeyboardModifiers modifiers) Q_DECL_OVERRIDE; - int horizontalOffset() const Q_DECL_OVERRIDE; - int verticalOffset() const Q_DECL_OVERRIDE; + QModelIndex moveCursor(CursorAction cursorAction, Qt::KeyboardModifiers modifiers) override; + int horizontalOffset() const override; + int verticalOffset() const override; - void setSelection(const QRect &rect, QItemSelectionModel::SelectionFlags command) Q_DECL_OVERRIDE; - QRegion visualRegionForSelection(const QItemSelection &selection) const Q_DECL_OVERRIDE; - QModelIndexList selectedIndexes() const Q_DECL_OVERRIDE; + void setSelection(const QRect &rect, QItemSelectionModel::SelectionFlags command) override; + QRegion visualRegionForSelection(const QItemSelection &selection) const override; + QModelIndexList selectedIndexes() const override; - void timerEvent(QTimerEvent *event) Q_DECL_OVERRIDE; - void paintEvent(QPaintEvent *event) Q_DECL_OVERRIDE; + void timerEvent(QTimerEvent *event) override; + void paintEvent(QPaintEvent *event) override; void drawTree(QPainter *painter, const QRegion ®ion) const; virtual void drawRow(QPainter *painter, @@ -195,30 +196,30 @@ protected: const QRect &rect, const QModelIndex &index) const; - void mousePressEvent(QMouseEvent *event) Q_DECL_OVERRIDE; - void mouseReleaseEvent(QMouseEvent *event) Q_DECL_OVERRIDE; - void mouseDoubleClickEvent(QMouseEvent *event) Q_DECL_OVERRIDE; - void mouseMoveEvent(QMouseEvent *event) Q_DECL_OVERRIDE; - void keyPressEvent(QKeyEvent *event) Q_DECL_OVERRIDE; + void mousePressEvent(QMouseEvent *event) override; + void mouseReleaseEvent(QMouseEvent *event) override; + void mouseDoubleClickEvent(QMouseEvent *event) override; + void mouseMoveEvent(QMouseEvent *event) override; + void keyPressEvent(QKeyEvent *event) override; #ifndef QT_NO_DRAGANDDROP - void dragMoveEvent(QDragMoveEvent *event) Q_DECL_OVERRIDE; + void dragMoveEvent(QDragMoveEvent *event) override; #endif - bool viewportEvent(QEvent *event) Q_DECL_OVERRIDE; + bool viewportEvent(QEvent *event) override; - void updateGeometries() Q_DECL_OVERRIDE; + void updateGeometries() override; - QSize viewportSizeHint() const Q_DECL_OVERRIDE; + QSize viewportSizeHint() const override; - int sizeHintForColumn(int column) const Q_DECL_OVERRIDE; + int sizeHintForColumn(int column) const override; int indexRowSizeHint(const QModelIndex &index) const; int rowHeight(const QModelIndex &index) const; - void horizontalScrollbarAction(int action) Q_DECL_OVERRIDE; + void horizontalScrollbarAction(int action) override; - bool isIndexHidden(const QModelIndex &index) const Q_DECL_OVERRIDE; + bool isIndexHidden(const QModelIndex &index) const override; void selectionChanged(const QItemSelection &selected, - const QItemSelection &deselected) Q_DECL_OVERRIDE; - void currentChanged(const QModelIndex ¤t, const QModelIndex &previous) Q_DECL_OVERRIDE; + const QItemSelection &deselected) override; + void currentChanged(const QModelIndex ¤t, const QModelIndex &previous) override; private: friend class ::tst_QTreeView; diff --git a/src/widgets/itemviews/qtreewidget.cpp b/src/widgets/itemviews/qtreewidget.cpp index 762a19126e..de7f7c0b77 100644 --- a/src/widgets/itemviews/qtreewidget.cpp +++ b/src/widgets/itemviews/qtreewidget.cpp @@ -145,7 +145,7 @@ QTreeModel::QTreeModel(QTreeModelPrivate &dd, QTreeWidget *parent) QTreeModel::~QTreeModel() { clear(); - headerItem->view = Q_NULLPTR; + headerItem->view = nullptr; delete headerItem; rootItem->view = 0; delete rootItem; @@ -2012,6 +2012,9 @@ void QTreeWidgetItem::addChildren(const QList<QTreeWidgetItem*> &children) */ void QTreeWidgetItem::insertChildren(int index, const QList<QTreeWidgetItem*> &children) { + if (index < 0 || index > this->children.count() || children.isEmpty()) + return; + if (view && view->isSortingEnabled()) { for (int n = 0; n < children.count(); ++n) insertChild(index, children.at(n)); @@ -2729,14 +2732,14 @@ void QTreeWidget::setHeaderItem(QTreeWidgetItem *item) int oldCount = columnCount(); if (oldCount < item->columnCount()) - d->treeModel()->beginInsertColumns(QModelIndex(), oldCount, item->columnCount()); - else - d->treeModel()->beginRemoveColumns(QModelIndex(), item->columnCount(), oldCount); + d->treeModel()->beginInsertColumns(QModelIndex(), oldCount, item->columnCount() - 1); + else if (oldCount > item->columnCount()) + d->treeModel()->beginRemoveColumns(QModelIndex(), item->columnCount(), oldCount - 1); delete d->treeModel()->headerItem; d->treeModel()->headerItem = item; if (oldCount < item->columnCount()) d->treeModel()->endInsertColumns(); - else + else if (oldCount > item->columnCount()) d->treeModel()->endRemoveColumns(); d->treeModel()->headerDataChanged(Qt::Horizontal, 0, oldCount); } @@ -2859,11 +2862,11 @@ QRect QTreeWidget::visualItemRect(const QTreeWidgetItem *item) const Q_D(const QTreeWidget); //the visual rect for an item is across all columns. So we need to determine //what is the first and last column and get their visual index rects - QModelIndex base = d->index(item); + const QModelIndex base = d->index(item); const int firstVisiblesection = header()->logicalIndexAt(- header()->offset()); const int lastVisibleSection = header()->logicalIndexAt(header()->length() - header()->offset() - 1); - QModelIndex first = base.sibling(base.row(), header()->logicalIndex(firstVisiblesection)); - QModelIndex last = base.sibling(base.row(), header()->logicalIndex(lastVisibleSection)); + const QModelIndex first = base.sibling(base.row(), firstVisiblesection); + const QModelIndex last = base.sibling(base.row(), lastVisibleSection); return visualRect(first) | visualRect(last); } @@ -2909,7 +2912,7 @@ void QTreeWidget::editItem(QTreeWidgetItem *item, int column) /*! Opens a persistent editor for the \a item in the given \a column. - \sa closePersistentEditor() + \sa closePersistentEditor(), isPersistentEditorOpen() */ void QTreeWidget::openPersistentEditor(QTreeWidgetItem *item, int column) @@ -2924,7 +2927,7 @@ void QTreeWidget::openPersistentEditor(QTreeWidgetItem *item, int column) This function has no effect if no persistent editor is open for this combination of item and column. - \sa openPersistentEditor() + \sa openPersistentEditor(), isPersistentEditorOpen() */ void QTreeWidget::closePersistentEditor(QTreeWidgetItem *item, int column) @@ -2934,6 +2937,21 @@ void QTreeWidget::closePersistentEditor(QTreeWidgetItem *item, int column) } /*! + \since 5.10 + + Returns whether a persistent editor is open for item \a item in + column \a column. + + \sa openPersistentEditor(), closePersistentEditor() +*/ + +bool QTreeWidget::isPersistentEditorOpen(QTreeWidgetItem *item, int column) const +{ + Q_D(const QTreeWidget); + return QAbstractItemView::isPersistentEditorOpen(d->index(item, column)); +} + +/*! \since 4.1 Returns the widget displayed in the cell specified by \a item and the given \a column. @@ -3354,6 +3372,7 @@ QModelIndex QTreeWidget::indexFromItem(const QTreeWidgetItem *item, int column) return d->index(item, column); } +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) /*! \overload \internal @@ -3362,6 +3381,7 @@ QModelIndex QTreeWidget::indexFromItem(QTreeWidgetItem *item, int column) const { return indexFromItem(const_cast<const QTreeWidgetItem *>(item), column); } +#endif /*! Returns a pointer to the QTreeWidgetItem associated with the given \a index. diff --git a/src/widgets/itemviews/qtreewidget.h b/src/widgets/itemviews/qtreewidget.h index 3bdeae08d8..a31af0428a 100644 --- a/src/widgets/itemviews/qtreewidget.h +++ b/src/widgets/itemviews/qtreewidget.h @@ -178,7 +178,7 @@ public: inline QTreeWidgetItem *parent() const { return par; } inline QTreeWidgetItem *child(int index) const { if (index < 0 || index >= children.size()) - return Q_NULLPTR; + return nullptr; executePendingSort(); return children.at(index); } @@ -261,7 +261,7 @@ class Q_WIDGETS_EXPORT QTreeWidget : public QTreeView friend class QTreeModel; friend class QTreeWidgetItem; public: - explicit QTreeWidget(QWidget *parent = Q_NULLPTR); + explicit QTreeWidget(QWidget *parent = nullptr); ~QTreeWidget(); int columnCount() const; @@ -299,6 +299,8 @@ public: void editItem(QTreeWidgetItem *item, int column = 0); void openPersistentEditor(QTreeWidgetItem *item, int column = 0); void closePersistentEditor(QTreeWidgetItem *item, int column = 0); + using QAbstractItemView::isPersistentEditorOpen; + bool isPersistentEditorOpen(QTreeWidgetItem *item, int column = 0) const; QWidget *itemWidget(QTreeWidgetItem *item, int column) const; void setItemWidget(QTreeWidgetItem *item, int column, QWidget *widget); @@ -322,7 +324,7 @@ public: QTreeWidgetItem *itemAbove(const QTreeWidgetItem *item) const; QTreeWidgetItem *itemBelow(const QTreeWidgetItem *item) const; - void setSelectionModel(QItemSelectionModel *selectionModel) Q_DECL_OVERRIDE; + void setSelectionModel(QItemSelectionModel *selectionModel) override; public Q_SLOTS: void scrollToItem(const QTreeWidgetItem *item, @@ -344,7 +346,7 @@ Q_SIGNALS: void itemSelectionChanged(); protected: - bool event(QEvent *e) Q_DECL_OVERRIDE; + bool event(QEvent *e) override; virtual QStringList mimeTypes() const; #if QT_VERSION >= QT_VERSION_CHECK(6,0,0) virtual QMimeData *mimeData(const QList<QTreeWidgetItem *> &items) const; @@ -354,16 +356,26 @@ protected: virtual bool dropMimeData(QTreeWidgetItem *parent, int index, const QMimeData *data, Qt::DropAction action); virtual Qt::DropActions supportedDropActions() const; + +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) +public: +#else +protected: +#endif QList<QTreeWidgetItem*> items(const QMimeData *data) const; QModelIndex indexFromItem(const QTreeWidgetItem *item, int column = 0) const; +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) QModelIndex indexFromItem(QTreeWidgetItem *item, int column = 0) const; // ### Qt 6: remove +#endif QTreeWidgetItem *itemFromIndex(const QModelIndex &index) const; + +protected: #if QT_CONFIG(draganddrop) - void dropEvent(QDropEvent *event) Q_DECL_OVERRIDE; + void dropEvent(QDropEvent *event) override; #endif private: - void setModel(QAbstractItemModel *model) Q_DECL_OVERRIDE; + void setModel(QAbstractItemModel *model) override; Q_DECLARE_PRIVATE(QTreeWidget) Q_DISABLE_COPY(QTreeWidget) @@ -383,7 +395,7 @@ private: }; inline void QTreeWidget::removeItemWidget(QTreeWidgetItem *item, int column) -{ setItemWidget(item, column, Q_NULLPTR); } +{ setItemWidget(item, column, nullptr); } inline QTreeWidgetItem *QTreeWidget::itemAt(int ax, int ay) const { return itemAt(QPoint(ax, ay)); } diff --git a/src/widgets/itemviews/qtreewidget_p.h b/src/widgets/itemviews/qtreewidget_p.h index 7aa4daefc0..f4625842ef 100644 --- a/src/widgets/itemviews/qtreewidget_p.h +++ b/src/widgets/itemviews/qtreewidget_p.h @@ -91,24 +91,24 @@ public: void itemChanged(QTreeWidgetItem *item); QModelIndex index(const QTreeWidgetItem *item, int column) const; - QModelIndex index(int row, int column, const QModelIndex &parent) const Q_DECL_OVERRIDE; - QModelIndex parent(const QModelIndex &child) const Q_DECL_OVERRIDE; - int rowCount(const QModelIndex &parent) const Q_DECL_OVERRIDE; - int columnCount(const QModelIndex &parent = QModelIndex()) const Q_DECL_OVERRIDE; - bool hasChildren(const QModelIndex &parent) const Q_DECL_OVERRIDE; + QModelIndex index(int row, int column, const QModelIndex &parent) const override; + QModelIndex parent(const QModelIndex &child) const override; + int rowCount(const QModelIndex &parent) const override; + int columnCount(const QModelIndex &parent = QModelIndex()) const override; + bool hasChildren(const QModelIndex &parent) const override; - QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const Q_DECL_OVERRIDE; - bool setData(const QModelIndex &index, const QVariant &value, int role) Q_DECL_OVERRIDE; + QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; + bool setData(const QModelIndex &index, const QVariant &value, int role) override; - QMap<int, QVariant> itemData(const QModelIndex &index) const Q_DECL_OVERRIDE; + QMap<int, QVariant> itemData(const QModelIndex &index) const override; - QVariant headerData(int section, Qt::Orientation orientation, int role) const Q_DECL_OVERRIDE; + QVariant headerData(int section, Qt::Orientation orientation, int role) const override; bool setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, - int role) Q_DECL_OVERRIDE; + int role) override; - Qt::ItemFlags flags(const QModelIndex &index) const Q_DECL_OVERRIDE; + Qt::ItemFlags flags(const QModelIndex &index) const override; - void sort(int column, Qt::SortOrder order) Q_DECL_OVERRIDE; + void sort(int column, Qt::SortOrder order) override; void ensureSorted(int column, Qt::SortOrder order, int start, int end, const QModelIndex &parent); static bool itemLessThan(const QPair<QTreeWidgetItem*,int> &left, @@ -120,17 +120,17 @@ public: const QList<QTreeWidgetItem*>::iterator &end, Qt::SortOrder order, QTreeWidgetItem *item); - bool insertRows(int row, int count, const QModelIndex &) Q_DECL_OVERRIDE; - bool insertColumns(int column, int count, const QModelIndex &) Q_DECL_OVERRIDE; + bool insertRows(int row, int count, const QModelIndex &) override; + bool insertColumns(int column, int count, const QModelIndex &) override; - bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex()) Q_DECL_OVERRIDE; + bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex()) override; // dnd - QStringList mimeTypes() const Q_DECL_OVERRIDE; - QMimeData *mimeData(const QModelIndexList &indexes) const Q_DECL_OVERRIDE; + QStringList mimeTypes() const override; + QMimeData *mimeData(const QModelIndexList &indexes) const override; bool dropMimeData(const QMimeData *data, Qt::DropAction action, - int row, int column, const QModelIndex &parent) Q_DECL_OVERRIDE; - Qt::DropActions supportedDropActions() const Q_DECL_OVERRIDE; + int row, int column, const QModelIndex &parent) override; + Qt::DropActions supportedDropActions() const override; QMimeData *internalMimeData() const; @@ -145,7 +145,7 @@ protected: void beginRemoveItems(QTreeWidgetItem *parent, int row, int count); void endRemoveItems(); void sortItems(QList<QTreeWidgetItem*> *items, int column, Qt::SortOrder order); - void timerEvent(QTimerEvent *) Q_DECL_OVERRIDE; + void timerEvent(QTimerEvent *) override; private: QTreeWidgetItem *rootItem; |