diff options
Diffstat (limited to 'src/widgets')
86 files changed, 950 insertions, 601 deletions
diff --git a/src/widgets/dialogs/qdialog.cpp b/src/widgets/dialogs/qdialog.cpp index 06f0393b4c..cadd7ef031 100644 --- a/src/widgets/dialogs/qdialog.cpp +++ b/src/widgets/dialogs/qdialog.cpp @@ -731,6 +731,20 @@ void QDialog::setVisible(bool visible) if (!testAttribute(Qt::WA_DontShowOnScreen) && d->canBeNativeDialog() && d->setNativeDialogVisible(visible)) return; + // We should not block windows by the invisible modal dialog + // if a platform-specific dialog is implemented as an in-process + // Qt window, because in this case it will also be blocked. + const bool dontBlockWindows = testAttribute(Qt::WA_DontShowOnScreen) + && d->styleHint(QPlatformDialogHelper::DialogIsQtWindow).toBool(); + Qt::WindowModality oldModality; + bool wasModalitySet; + + if (dontBlockWindows) { + oldModality = windowModality(); + wasModalitySet = testAttribute(Qt::WA_SetWindowModality); + setWindowModality(Qt::NonModal); + } + if (visible) { if (testAttribute(Qt::WA_WState_ExplicitShowHide) && !testAttribute(Qt::WA_WState_Hidden)) return; @@ -797,6 +811,11 @@ void QDialog::setVisible(bool visible) d->eventLoop->exit(); } + if (dontBlockWindows) { + setWindowModality(oldModality); + setAttribute(Qt::WA_SetWindowModality, wasModalitySet); + } + #if QT_CONFIG(pushbutton) const QPlatformTheme *theme = QGuiApplicationPrivate::platformTheme(); if (d->mainDef && isActiveWindow() diff --git a/src/widgets/dialogs/qfiledialog_p.h b/src/widgets/dialogs/qfiledialog_p.h index 2e49696b77..96d0c1190e 100644 --- a/src/widgets/dialogs/qfiledialog_p.h +++ b/src/widgets/dialogs/qfiledialog_p.h @@ -290,7 +290,7 @@ private: virtual void helperPrepareShow(QPlatformDialogHelper *) override; virtual void helperDone(QDialog::DialogCode, QPlatformDialogHelper *) override; - Q_DISABLE_COPY(QFileDialogPrivate) + Q_DISABLE_COPY_MOVE(QFileDialogPrivate) }; class QFileDialogLineEdit : public QLineEdit diff --git a/src/widgets/dialogs/qfontdialog.cpp b/src/widgets/dialogs/qfontdialog.cpp index 477c6bd540..2b81180ecb 100644 --- a/src/widgets/dialogs/qfontdialog.cpp +++ b/src/widgets/dialogs/qfontdialog.cpp @@ -534,7 +534,7 @@ void QFontDialogPrivate::updateFamilies() //and try some fall backs match_t type = MATCH_NONE; - if (bestFamilyType <= MATCH_NONE && familyName2 == f.lastResortFamily()) + if (bestFamilyType <= MATCH_NONE && familyName2 == QStringLiteral("helvetica")) type = MATCH_LAST_RESORT; if (bestFamilyType <= MATCH_LAST_RESORT && familyName2 == f.family()) type = MATCH_APP; diff --git a/src/widgets/dialogs/qmessagebox.h b/src/widgets/dialogs/qmessagebox.h index 4b993a9e65..0a2edb1eee 100644 --- a/src/widgets/dialogs/qmessagebox.h +++ b/src/widgets/dialogs/qmessagebox.h @@ -284,9 +284,9 @@ public: Q_SIGNALS: void buttonClicked(QAbstractButton *button); -#ifdef Q_QDOC +#ifdef Q_CLANG_QDOC public Q_SLOTS: - int exec(); + int exec() override; #endif protected: diff --git a/src/widgets/dialogs/qsidebar.cpp b/src/widgets/dialogs/qsidebar.cpp index d52f18b406..2c8c66e1e2 100644 --- a/src/widgets/dialogs/qsidebar.cpp +++ b/src/widgets/dialogs/qsidebar.cpp @@ -381,8 +381,6 @@ QSidebar::QSidebar(QWidget *parent) : QListView(parent) void QSidebar::setModelAndUrls(QFileSystemModel *model, const QList<QUrl> &newUrls) { - // ### TODO make icon size dynamic - setIconSize(QSize(24,24)); setUniformItemSizes(true); urlModel = new QUrlModel(this); urlModel->setFileSystemModel(model); diff --git a/src/widgets/dialogs/qwizard.cpp b/src/widgets/dialogs/qwizard.cpp index 3876cf16c6..59168ba14d 100644 --- a/src/widgets/dialogs/qwizard.cpp +++ b/src/widgets/dialogs/qwizard.cpp @@ -769,7 +769,7 @@ void QWizardPrivate::reset() for (int i = history.count() - 1; i >= 0; --i) q->cleanupPage(history.at(i)); history.clear(); - for (QWizardPage *page : pageMap) + for (QWizardPage *page : qAsConst(pageMap)) page->d_func()->initialized = false; current = -1; diff --git a/src/widgets/dialogs/qwizard_win_p.h b/src/widgets/dialogs/qwizard_win_p.h index d302dedaa3..02c5e52c2c 100644 --- a/src/widgets/dialogs/qwizard_win_p.h +++ b/src/widgets/dialogs/qwizard_win_p.h @@ -84,7 +84,7 @@ class QWizard; class QVistaHelper : public QObject { - Q_DISABLE_COPY(QVistaHelper) + Q_DISABLE_COPY_MOVE(QVistaHelper) public: QVistaHelper(QWizard *wizard); ~QVistaHelper() override; diff --git a/src/widgets/doc/snippets/code/doc_src_examples_dropsite.qdoc b/src/widgets/doc/snippets/code/doc_src_examples_dropsite.qdoc deleted file mode 100644 index a91933cdce..0000000000 --- a/src/widgets/doc/snippets/code/doc_src_examples_dropsite.qdoc +++ /dev/null @@ -1,55 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the documentation of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -//! [0] -\code -foreach(variable, container) -\endcode -//! [0] diff --git a/src/widgets/doc/snippets/code/doc_src_stylesheet.qdoc b/src/widgets/doc/snippets/code/doc_src_stylesheet.qdoc index 9af04f6b4c..098eaf4717 100644 --- a/src/widgets/doc/snippets/code/doc_src_stylesheet.qdoc +++ b/src/widgets/doc/snippets/code/doc_src_stylesheet.qdoc @@ -514,13 +514,15 @@ QLabel { border-width: 1px 2px 3px 4px } /* 1px 2px 3px 4px */ //! [84] -QLabel { border-color: red } /* opaque red */ -QLabel { border-color: #FF0000 } /* opaque red */ -QLabel { border-color: rgba(255, 0, 0, 75%) } /* 75% opaque red */ -QLabel { border-color: rgb(255, 0, 0) } /* opaque red */ -QLabel { border-color: rgb(100%, 0%, 0%) } /* opaque red */ -QLabel { border-color: hsv(60, 255, 255) } /* opaque yellow */ -QLabel { border-color: hsva(240, 255, 255, 75%) } /* 75% blue */ +QLabel { border-color: red } /* opaque red */ +QLabel { border-color: #FF0000 } /* opaque red */ +QLabel { border-color: rgba(255, 0, 0, 75%) } /* 75% opaque red */ +QLabel { border-color: rgb(255, 0, 0) } /* opaque red */ +QLabel { border-color: rgb(100%, 0%, 0%) } /* opaque red */ +QLabel { border-color: hsv(60, 100%, 100%) } /* opaque yellow */ +QLabel { border-color: hsva(240, 255, 255, 75%) } /* 75% blue */ +QLabel { border-color: hsl(60, 100%, 50%) } /* opaque yellow */ +QLabel { border-color: hsla(240, 255, 50%, 75%) } /* 75% blue */ //! [84] diff --git a/src/widgets/doc/snippets/qtreewidget-using/mainwindow.cpp b/src/widgets/doc/snippets/qtreewidget-using/mainwindow.cpp index ee7e028a13..7c8d3f936e 100644 --- a/src/widgets/doc/snippets/qtreewidget-using/mainwindow.cpp +++ b/src/widgets/doc/snippets/qtreewidget-using/mainwindow.cpp @@ -154,14 +154,14 @@ void MainWindow::findItems() QTreeWidgetItem *item; //! [6] foreach (item, treeWidget->selectedItems()) - treeWidget->setItemSelected(item, false); + item->setSelected(false); //! [7] QList<QTreeWidgetItem *> found = treeWidget->findItems( itemText, Qt::MatchWildcard); foreach (item, found) { - treeWidget->setItemSelected(item, true); + item->setSelected(true); // Show the item->text(0) for each item. } //! [7] diff --git a/src/widgets/doc/src/widgets-and-layouts/stylesheet.qdoc b/src/widgets/doc/src/widgets-and-layouts/stylesheet.qdoc index 43f9dda49a..00323eace6 100644 --- a/src/widgets/doc/src/widgets-and-layouts/stylesheet.qdoc +++ b/src/widgets/doc/src/widgets-and-layouts/stylesheet.qdoc @@ -2881,14 +2881,20 @@ | \tt{rgba(\e{r}, \e{g}, \e{b}, \e{a})} \br | \tt{hsv(\e{h}, \e{s}, \e{v})} \br | \tt{hsva(\e{h}, \e{s}, \e{v}, \e{a})} \br + | \tt{hsl(\e{h}, \e{s}, \e{l})} \br + | \tt{hsla(\e{h}, \e{s}, \e{l}, \e{a})} \br | \tt{#\e{rrggbb}} \br | \l{QColor::setNamedColor()}{Color Name} \br - \li Specifies a color as RGB (red, green, blue) or RGBA - (red, green, blue, alpha) or HSV (hue, saturation, value) or HSVA - (hue, saturation, value, alpha) or a named color. The \c rgb() or \c rgba() - syntax can be used with integer values between 0 and 255, or with - percentages. The value of s, v, and a in \c hsv() or \c hsva() must all - be in the range 0-255; the value of h must be in the range 0-359. + \li Specifies a color as RGB (red, green, blue), RGBA (red, + green, blue, alpha), HSV (hue, saturation, value), HSVA + (hue, saturation, value, alpha), HSL (hue, saturation, + lightness), HSLA (hue, saturation, lightness, alpha) or a + named color. The \c rgb() or \c rgba() syntax can be used + with integer values between 0 and 255, or with percentages. + The value of s, v, l and a in \c hsv(), \c hsva() \c hsl() + or \c hsla() must all be in the range 0-255 or with + percentages, the value of h must be in the range 0-359. + The support for HSL(A) is available since 5.13. Examples: diff --git a/src/widgets/effects/qgraphicseffect_p.h b/src/widgets/effects/qgraphicseffect_p.h index c5c7ff5900..2f3bd2f7fd 100644 --- a/src/widgets/effects/qgraphicseffect_p.h +++ b/src/widgets/effects/qgraphicseffect_p.h @@ -88,7 +88,7 @@ protected: private: Q_DECLARE_PRIVATE(QGraphicsEffectSource) - Q_DISABLE_COPY(QGraphicsEffectSource) + Q_DISABLE_COPY_MOVE(QGraphicsEffectSource) friend class QGraphicsEffect; friend class QGraphicsEffectPrivate; friend class QGraphicsScenePrivate; diff --git a/src/widgets/effects/qpixmapfilter.cpp b/src/widgets/effects/qpixmapfilter.cpp index 60edd01d00..e1e8175423 100644 --- a/src/widgets/effects/qpixmapfilter.cpp +++ b/src/widgets/effects/qpixmapfilter.cpp @@ -54,6 +54,8 @@ #include "private/qmemrotate_p.h" #include "private/qdrawhelper_p.h" +#include <memory> + QT_BEGIN_NAMESPACE class QPixmapFilterPrivate : public QObjectPrivate @@ -319,7 +321,7 @@ static void convolute( const QImage processImage = (srcImage.format() != QImage::Format_ARGB32_Premultiplied ) ? srcImage.convertToFormat(QImage::Format_ARGB32_Premultiplied) : srcImage; // TODO: support also other formats directly without copying - int *fixedKernel = new int[kernelWidth*kernelHeight]; + std::unique_ptr<int[]> fixedKernel(new int[kernelWidth * kernelHeight]); for(int i = 0; i < kernelWidth*kernelHeight; i++) { fixedKernel[i] = (int)(65536 * kernel[i]); @@ -403,7 +405,6 @@ static void convolute( } yk++; } - delete[] fixedKernel; } /*! diff --git a/src/widgets/graphicsview/qgraphicsitem.h b/src/widgets/graphicsview/qgraphicsitem.h index c228e765d8..729176530d 100644 --- a/src/widgets/graphicsview/qgraphicsitem.h +++ b/src/widgets/graphicsview/qgraphicsitem.h @@ -487,7 +487,9 @@ private: }; Q_DECLARE_OPERATORS_FOR_FLAGS(QGraphicsItem::GraphicsItemFlags) +#ifndef Q_CLANG_QDOC Q_DECLARE_INTERFACE(QGraphicsItem, "org.qt-project.Qt.QGraphicsItem") +#endif inline void QGraphicsItem::setPos(qreal ax, qreal ay) { setPos(QPointF(ax, ay)); } diff --git a/src/widgets/graphicsview/qgraphicslayout.h b/src/widgets/graphicsview/qgraphicslayout.h index 28b335ceaa..efcafa5e6a 100644 --- a/src/widgets/graphicsview/qgraphicslayout.h +++ b/src/widgets/graphicsview/qgraphicslayout.h @@ -83,7 +83,9 @@ private: friend class QGraphicsWidget; }; +#ifndef Q_CLANG_QDOC Q_DECLARE_INTERFACE(QGraphicsLayout, "org.qt-project.Qt.QGraphicsLayout") +#endif QT_END_NAMESPACE diff --git a/src/widgets/graphicsview/qgraphicslayoutitem.h b/src/widgets/graphicsview/qgraphicslayoutitem.h index 44f430034b..86a0a87361 100644 --- a/src/widgets/graphicsview/qgraphicslayoutitem.h +++ b/src/widgets/graphicsview/qgraphicslayoutitem.h @@ -116,7 +116,9 @@ private: friend class QGraphicsLayout; }; +#ifndef Q_CLANG_QDOC Q_DECLARE_INTERFACE(QGraphicsLayoutItem, "org.qt-project.Qt.QGraphicsLayoutItem") +#endif inline void QGraphicsLayoutItem::setMinimumSize(qreal aw, qreal ah) { setMinimumSize(QSizeF(aw, ah)); } diff --git a/src/widgets/graphicsview/qgraphicslayoutstyleinfo.cpp b/src/widgets/graphicsview/qgraphicslayoutstyleinfo.cpp index af969b346d..da2510a8cb 100644 --- a/src/widgets/graphicsview/qgraphicslayoutstyleinfo.cpp +++ b/src/widgets/graphicsview/qgraphicslayoutstyleinfo.cpp @@ -50,15 +50,13 @@ QT_BEGIN_NAMESPACE QGraphicsLayoutStyleInfo::QGraphicsLayoutStyleInfo(const QGraphicsLayoutPrivate *layout) : m_layout(layout), m_style(0) { - m_widget = new QWidget; // pixelMetric might need a widget ptr - if (m_widget) - m_styleOption.initFrom(m_widget); + m_widget.reset(new QWidget); // pixelMetric might need a widget ptr + m_styleOption.initFrom(m_widget.get()); m_isWindow = m_styleOption.state & QStyle::State_Window; } QGraphicsLayoutStyleInfo::~QGraphicsLayoutStyleInfo() { - delete m_widget; } qreal QGraphicsLayoutStyleInfo::combinedLayoutSpacing(QLayoutPolicy::ControlTypes controls1, @@ -93,7 +91,7 @@ qreal QGraphicsLayoutStyleInfo::windowMargin(Qt::Orientation orientation) const const_cast<QStyleOption*>(&m_styleOption), widget()); } -QWidget *QGraphicsLayoutStyleInfo::widget() const { return m_widget; } +QWidget *QGraphicsLayoutStyleInfo::widget() const { return m_widget.get(); } QStyle *QGraphicsLayoutStyleInfo::style() const { diff --git a/src/widgets/graphicsview/qgraphicslayoutstyleinfo_p.h b/src/widgets/graphicsview/qgraphicslayoutstyleinfo_p.h index 7886de432c..c3af9f4554 100644 --- a/src/widgets/graphicsview/qgraphicslayoutstyleinfo_p.h +++ b/src/widgets/graphicsview/qgraphicslayoutstyleinfo_p.h @@ -54,6 +54,8 @@ #include <QtGui/private/qabstractlayoutstyleinfo_p.h> #include <QtWidgets/qstyleoption.h> +#include <memory> + QT_REQUIRE_CONFIG(graphicsview); QT_BEGIN_NAMESPACE @@ -93,7 +95,7 @@ private: const QGraphicsLayoutPrivate *m_layout; mutable QStyle *m_style; QStyleOption m_styleOption; - QWidget *m_widget; + std::unique_ptr<QWidget> m_widget; }; QT_END_NAMESPACE diff --git a/src/widgets/graphicsview/qgraphicsscenebsptreeindex_p.h b/src/widgets/graphicsview/qgraphicsscenebsptreeindex_p.h index b6387a2c56..eb6bbbf49b 100644 --- a/src/widgets/graphicsview/qgraphicsscenebsptreeindex_p.h +++ b/src/widgets/graphicsview/qgraphicsscenebsptreeindex_p.h @@ -99,7 +99,7 @@ protected: private : Q_DECLARE_PRIVATE(QGraphicsSceneBspTreeIndex) - Q_DISABLE_COPY(QGraphicsSceneBspTreeIndex) + Q_DISABLE_COPY_MOVE(QGraphicsSceneBspTreeIndex) Q_PRIVATE_SLOT(d_func(), void _q_updateSortCache()) Q_PRIVATE_SLOT(d_func(), void _q_updateIndex()) diff --git a/src/widgets/graphicsview/qgraphicssceneindex_p.h b/src/widgets/graphicsview/qgraphicssceneindex_p.h index bdc57bd9ea..86637e836b 100644 --- a/src/widgets/graphicsview/qgraphicssceneindex_p.h +++ b/src/widgets/graphicsview/qgraphicssceneindex_p.h @@ -115,7 +115,7 @@ protected: friend class QGraphicsItemPrivate; friend class QGraphicsSceneBspTreeIndex; private: - Q_DISABLE_COPY(QGraphicsSceneIndex) + Q_DISABLE_COPY_MOVE(QGraphicsSceneIndex) Q_DECLARE_PRIVATE(QGraphicsSceneIndex) }; @@ -151,7 +151,7 @@ inline void QGraphicsSceneIndexPrivate::items_helper(const QRectF &rect, QGraphi if (order == Qt::DescendingOrder) { const int n = items->size(); for (int i = 0; i < n / 2; ++i) - items->swap(i, n - i - 1); + items->swapItemsAt(i, n - i - 1); } } diff --git a/src/widgets/graphicsview/qsimplex_p.h b/src/widgets/graphicsview/qsimplex_p.h index 2342da2437..369f2f5f82 100644 --- a/src/widgets/graphicsview/qsimplex_p.h +++ b/src/widgets/graphicsview/qsimplex_p.h @@ -150,7 +150,7 @@ struct QSimplexConstraint class QSimplex { - Q_DISABLE_COPY(QSimplex) + Q_DISABLE_COPY_MOVE(QSimplex) public: QSimplex(); ~QSimplex(); diff --git a/src/widgets/itemviews/qcolumnviewgrip_p.h b/src/widgets/itemviews/qcolumnviewgrip_p.h index 7e2793074b..5eb8012204 100644 --- a/src/widgets/itemviews/qcolumnviewgrip_p.h +++ b/src/widgets/itemviews/qcolumnviewgrip_p.h @@ -82,7 +82,7 @@ protected: private: Q_DECLARE_PRIVATE(QColumnViewGrip) - Q_DISABLE_COPY(QColumnViewGrip) + Q_DISABLE_COPY_MOVE(QColumnViewGrip) }; class QColumnViewGripPrivate : public QWidgetPrivate diff --git a/src/widgets/itemviews/qdirmodel.cpp b/src/widgets/itemviews/qdirmodel.cpp index 78fc623fb5..b94c31fb42 100644 --- a/src/widgets/itemviews/qdirmodel.cpp +++ b/src/widgets/itemviews/qdirmodel.cpp @@ -1252,11 +1252,10 @@ void QDirModelPrivate::restorePersistentIndexes() for (const SavedPersistent &sp : qAsConst(savedPersistent)) { QPersistentModelIndexData *data = sp.data; QModelIndex idx = q->index(sp.path, sp.column); - if (idx != data->index || data->model == 0) { + if (idx != data->index || data->index.model() == nullptr) { //data->model may be equal to 0 if the model is getting destroyed persistent.indexes.remove(data->index); data->index = idx; - data->model = q; if (idx.isValid()) persistent.indexes.insert(idx, data); } diff --git a/src/widgets/itemviews/qheaderview.cpp b/src/widgets/itemviews/qheaderview.cpp index 7bfa51337d..62abf56751 100644 --- a/src/widgets/itemviews/qheaderview.cpp +++ b/src/widgets/itemviews/qheaderview.cpp @@ -2321,9 +2321,10 @@ void QHeaderView::initializeSections() if (stretchLastSection()) // we've already gotten the size hint d->maybeRestorePrevLastSectionAndStretchLast(); - //make sure we update the hidden sections + // make sure we update the hidden sections + // simulate remove from newCount to oldCount if (newCount < oldCount) - d->updateHiddenSections(0, newCount-1); + d->updateHiddenSections(newCount, oldCount); } } @@ -3116,9 +3117,25 @@ void QHeaderView::scrollContentsBy(int dx, int dy) \reimp \internal */ -void QHeaderView::dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector<int> &) +void QHeaderView::dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector<int> &roles) { Q_D(QHeaderView); + if (!roles.isEmpty()) { + const auto doesRoleAffectSize = [](int role) -> bool { + switch (role) { + case Qt::DisplayRole: + case Qt::DecorationRole: + case Qt::SizeHintRole: + case Qt::FontRole: + return true; + default: + // who knows what a subclass or custom style might do + return role >= Qt::UserRole; + } + }; + if (std::none_of(roles.begin(), roles.end(), doesRoleAffectSize)) + return; + } d->invalidateCachedSizeHint(); if (d->hasAutoResizeSections()) { bool resizeRequired = d->globalResizeMode == ResizeToContents; @@ -3874,9 +3891,9 @@ void QHeaderViewPrivate::updateDefaultSectionSizeFromStyle() void QHeaderViewPrivate::recalcSectionStartPos() const // linear (but fast) { int pixelpos = 0; - for (QVector<SectionItem>::const_iterator i = sectionItems.constBegin(); i != sectionItems.constEnd(); ++i) { - i->calculated_startpos = pixelpos; // write into const mutable - pixelpos += i->size; + for (const SectionItem &i : sectionItems) { + i.calculated_startpos = pixelpos; // write into const mutable + pixelpos += i.size; } sectionStartposRecalc = false; } diff --git a/src/widgets/itemviews/qitemdelegate.cpp b/src/widgets/itemviews/qitemdelegate.cpp index dff4cc4593..16d4a21f50 100644 --- a/src/widgets/itemviews/qitemdelegate.cpp +++ b/src/widgets/itemviews/qitemdelegate.cpp @@ -266,7 +266,7 @@ QSizeF QItemDelegatePrivate::doTextLayout(int lineWidth) const \row \li \l Qt::AccessibleDescriptionRole \li QString \row \li \l Qt::AccessibleTextRole \li QString \endomit - \row \li \l Qt::BackgroundRole \li QBrush + \row \li \l Qt::BackgroundRole \li QBrush (\since 4.2) \row \li \l Qt::BackgroundColorRole \li QColor (obsolete; use Qt::BackgroundRole instead) \row \li \l Qt::CheckStateRole \li Qt::CheckState \row \li \l Qt::DecorationRole \li QIcon, QPixmap and QColor @@ -278,7 +278,7 @@ QSizeF QItemDelegatePrivate::doTextLayout(int lineWidth) const \row \li \l Qt::StatusTipRole \li \endomit \row \li \l Qt::TextAlignmentRole \li Qt::Alignment - \row \li \l Qt::ForegroundRole \li QBrush + \row \li \l Qt::ForegroundRole \li QBrush (\since 4.2) \row \li \l Qt::TextColorRole \li QColor (obsolete; use Qt::ForegroundRole instead) \omit \row \li \l Qt::ToolTipRole @@ -1089,7 +1089,7 @@ QRect QItemDelegate::doCheck(const QStyleOptionViewItem &option, opt.rect = bounding; const QWidget *widget = d->widget(option); // cast QStyle *style = widget ? widget->style() : QApplication::style(); - return style->subElementRect(QStyle::SE_ViewItemCheckIndicator, &opt, widget); + return style->subElementRect(QStyle::SE_ItemViewItemCheckIndicator, &opt, widget); } return QRect(); } diff --git a/src/widgets/itemviews/qlistview.cpp b/src/widgets/itemviews/qlistview.cpp index e5769940d4..fdac332367 100644 --- a/src/widgets/itemviews/qlistview.cpp +++ b/src/widgets/itemviews/qlistview.cpp @@ -2246,8 +2246,8 @@ int QListModeViewBase::verticalScrollToValue(int index, QListView::ScrollHint hi } else { int scrollBarValue = verticalScrollBar()->value(); int numHidden = 0; - for (int i = 0; i < flowPositions.count() - 1 && i <= scrollBarValue; ++i) - if (isHidden(i)) + for (const auto &idx : qAsConst(dd->hiddenRows)) + if (idx.row() <= scrollBarValue) ++numHidden; value = qBound(0, scrollValueMap.at(verticalScrollBar()->value()) - numHidden, flowPositions.count() - 1); } @@ -2687,21 +2687,24 @@ int QListModeViewBase::perItemScrollToValue(int index, int scrollValue, int view return scrollValue; itemExtent += spacing(); - QVector<int> visibleFlowPositions; - visibleFlowPositions.reserve(flowPositions.count() - 1); - for (int i = 0; i < flowPositions.count() - 1; i++) { // flowPositions count is +1 larger than actual row count - if (!isHidden(i)) - visibleFlowPositions.append(flowPositions.at(i)); - } - + QVector<int> hiddenRows = dd->hiddenRowIds(); + std::sort(hiddenRows.begin(), hiddenRows.end()); + int hiddenRowsBefore = 0; + for (int i = 0; i < hiddenRows.size() - 1; ++i) + if (hiddenRows.at(i) > index + hiddenRowsBefore) + break; + else + ++hiddenRowsBefore; if (!wrap) { int topIndex = index; const int bottomIndex = topIndex; - const int bottomCoordinate = visibleFlowPositions.at(index); - + const int bottomCoordinate = flowPositions.at(index + hiddenRowsBefore); while (topIndex > 0 && - (bottomCoordinate - visibleFlowPositions.at(topIndex - 1) + itemExtent) <= (viewportSize)) { + (bottomCoordinate - flowPositions.at(topIndex + hiddenRowsBefore - 1) + itemExtent) <= (viewportSize)) { topIndex--; + // will the next one be a hidden row -> skip + while (hiddenRowsBefore > 0 && hiddenRows.at(hiddenRowsBefore - 1) >= topIndex + hiddenRowsBefore - 1) + hiddenRowsBefore--; } const int itemCount = bottomIndex - topIndex + 1; @@ -2720,7 +2723,7 @@ int QListModeViewBase::perItemScrollToValue(int index, int scrollValue, int view ? Qt::Horizontal : Qt::Vertical); if (flowOrientation == orientation) { // scrolling in the "flow" direction // ### wrapped scrolling in the flow direction - return visibleFlowPositions.at(index); // ### always pixel based for now + return flowPositions.at(index + hiddenRowsBefore); // ### always pixel based for now } else if (!segmentStartRows.isEmpty()) { // we are scrolling in the "segment" direction int segment = qBinarySearch<int>(segmentStartRows, index, 0, segmentStartRows.count() - 1); int leftSegment = segment; @@ -3354,9 +3357,9 @@ int QListView::visualIndex(const QModelIndex &index) const d->executePostedLayout(); QListViewItem itm = d->indexToListViewItem(index); int visualIndex = d->commonListView->itemIndex(itm); - for (int row = 0; row <= index.row() && visualIndex >= 0; row++) { - if (d->isHidden(row)) - visualIndex--; + for (const auto &idx : qAsConst(d->hiddenRows)) { + if (idx.row() <= index.row()) + --visualIndex; } return visualIndex; } diff --git a/src/widgets/itemviews/qlistview_p.h b/src/widgets/itemviews/qlistview_p.h index 181386d4d0..3f997ef7e3 100644 --- a/src/widgets/itemviews/qlistview_p.h +++ b/src/widgets/itemviews/qlistview_p.h @@ -377,6 +377,14 @@ public: QModelIndex idx = model->index(row, 0, root); return isPersistent(idx) && hiddenRows.contains(idx); } + // helper to avoid checking for isPersistent and creating persistent indexes as above in isHidden + QVector<int> hiddenRowIds() const { + QVector<int> rowIds; + rowIds.reserve(hiddenRows.size()); + for (const auto &idx : hiddenRows) + rowIds += idx.row(); + return rowIds; + } inline bool isHiddenOrDisabled(int row) const { return isHidden(row) || !isIndexEnabled(modelIndex(row)); } void removeCurrentAndDisabled(QVector<QModelIndex> *indexes, const QModelIndex ¤t) const; diff --git a/src/widgets/itemviews/qlistwidget.cpp b/src/widgets/itemviews/qlistwidget.cpp index 72e0a67a64..ea92c5605b 100644 --- a/src/widgets/itemviews/qlistwidget.cpp +++ b/src/widgets/itemviews/qlistwidget.cpp @@ -227,6 +227,22 @@ bool QListModel::setData(const QModelIndex &index, const QVariant &value, int ro return true; } +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) +bool QListModel::clearItemData(const QModelIndex &index) +{ + if (!checkIndex(index, CheckIndexOption::IndexIsValid)) + return false; + QListWidgetItem *item = items.at(index.row()); + const auto beginIter = item->d->values.cbegin(); + const auto endIter = item->d->values.cend(); + if (std::all_of(beginIter, endIter, [](const QWidgetItemData& data) -> bool { return !data.value.isValid(); })) + return true; //it's already cleared + item->d->values.clear(); + emit dataChanged(index, index, QVector<int>{}); + return true; +} +#endif + QMap<int, QVariant> QListModel::itemData(const QModelIndex &index) const { QMap<int, QVariant> roles; @@ -277,6 +293,30 @@ bool QListModel::removeRows(int row, int count, const QModelIndex &parent) return true; } +/*! + \since 5.13 + \reimp +*/ +bool QListModel::moveRows(const QModelIndex &sourceParent, int sourceRow, int count, const QModelIndex &destinationParent, int destinationChild) +{ + if (sourceRow < 0 + || sourceRow + count - 1 >= rowCount(sourceParent) + || destinationChild <= 0 + || destinationChild > rowCount(destinationParent) + || sourceRow == destinationChild - 1 + || count <= 0) { + return false; + } + if (!beginMoveRows(QModelIndex(), sourceRow, sourceRow + count - 1, QModelIndex(), destinationChild)) + return false; + destinationChild--; + const int fromRow = destinationChild < sourceRow ? (sourceRow + count - 1) : sourceRow; + while (count--) + items.move(fromRow, destinationChild); + endMoveRows(); + return true; +} + Qt::ItemFlags QListModel::flags(const QModelIndex &index) const { if (!index.isValid() || index.row() >= items.count() || index.model() != this) @@ -289,7 +329,7 @@ void QListModel::sort(int column, Qt::SortOrder order) if (column != 0) return; - emit layoutAboutToBeChanged(); + emit layoutAboutToBeChanged({}, QAbstractItemModel::VerticalSortHint); QVector < QPair<QListWidgetItem*,int> > sorting(items.count()); for (int i = 0; i < items.count(); ++i) { @@ -313,7 +353,7 @@ void QListModel::sort(int column, Qt::SortOrder order) } changePersistentIndexList(fromIndexes, toIndexes); - emit layoutChanged(); + emit layoutChanged({}, QAbstractItemModel::VerticalSortHint); } /** @@ -543,24 +583,6 @@ Qt::DropActions QListModel::supportedDropActions() const */ /*! - \fn void QListWidgetItem::setSelected(bool select) - \since 4.2 - - Sets the selected state of the item to \a select. - - \sa isSelected() -*/ - -/*! - \fn bool QListWidgetItem::isSelected() const - \since 4.2 - - Returns \c true if the item is selected; otherwise returns \c false. - - \sa setSelected() -*/ - -/*! \fn void QListWidgetItem::setHidden(bool hide) \since 4.2 @@ -594,14 +616,14 @@ Qt::DropActions QListModel::supportedDropActions() const \sa type() */ -QListWidgetItem::QListWidgetItem(QListWidget *view, int type) - : rtti(type), view(view), d(new QListWidgetItemPrivate(this)), +QListWidgetItem::QListWidgetItem(QListWidget *listview, int type) + : rtti(type), view(listview), d(new QListWidgetItemPrivate(this)), itemFlags(Qt::ItemIsSelectable |Qt::ItemIsUserCheckable |Qt::ItemIsEnabled |Qt::ItemIsDragEnabled) { - if (QListModel *model = (view ? qobject_cast<QListModel*>(view->model()) : 0)) + if (QListModel *model = listModel()) model->insert(model->rowCount(), this); } @@ -621,16 +643,18 @@ QListWidgetItem::QListWidgetItem(QListWidget *view, int type) \sa type() */ -QListWidgetItem::QListWidgetItem(const QString &text, QListWidget *view, int type) - : rtti(type), view(0), d(new QListWidgetItemPrivate(this)), +QListWidgetItem::QListWidgetItem(const QString &text, QListWidget *listview, int type) + : rtti(type), view(listview), d(new QListWidgetItemPrivate(this)), itemFlags(Qt::ItemIsSelectable |Qt::ItemIsUserCheckable |Qt::ItemIsEnabled |Qt::ItemIsDragEnabled) { - setData(Qt::DisplayRole, text); - this->view = view; - if (QListModel *model = (view ? qobject_cast<QListModel*>(view->model()) : 0)) + { + QSignalBlocker b(view); + setData(Qt::DisplayRole, text); + } + if (QListModel *model = listModel()) model->insert(model->rowCount(), this); } @@ -652,17 +676,19 @@ QListWidgetItem::QListWidgetItem(const QString &text, QListWidget *view, int typ \sa type() */ QListWidgetItem::QListWidgetItem(const QIcon &icon,const QString &text, - QListWidget *view, int type) - : rtti(type), view(0), d(new QListWidgetItemPrivate(this)), + QListWidget *listview, int type) + : rtti(type), view(listview), d(new QListWidgetItemPrivate(this)), itemFlags(Qt::ItemIsSelectable |Qt::ItemIsUserCheckable |Qt::ItemIsEnabled |Qt::ItemIsDragEnabled) { - setData(Qt::DisplayRole, text); - setData(Qt::DecorationRole, icon); - this->view = view; - if (QListModel *model = (view ? qobject_cast<QListModel*>(view->model()) : 0)) + { + QSignalBlocker b(view); + setData(Qt::DisplayRole, text); + setData(Qt::DecorationRole, icon); + } + if (QListModel *model = listModel()) model->insert(model->rowCount(), this); } @@ -671,7 +697,7 @@ QListWidgetItem::QListWidgetItem(const QIcon &icon,const QString &text, */ QListWidgetItem::~QListWidgetItem() { - if (QListModel *model = (view ? qobject_cast<QListModel*>(view->model()) : 0)) + if (QListModel *model = listModel()) model->remove(this); delete d; } @@ -708,7 +734,7 @@ void QListWidgetItem::setData(int role, const QVariant &value) } if (!found) d->values.append(QWidgetItemData(role, value)); - if (QListModel *model = (view ? qobject_cast<QListModel*>(view->model()) : nullptr)) { + if (QListModel *model = listModel()) { const QVector<int> roles((role == Qt::DisplayRole) ? QVector<int>({Qt::DisplayRole, Qt::EditRole}) : QVector<int>({role})); @@ -775,7 +801,7 @@ void QListWidgetItem::write(QDataStream &out) const \sa data(), flags() */ QListWidgetItem::QListWidgetItem(const QListWidgetItem &other) - : rtti(Type), view(0), + : rtti(Type), view(nullptr), d(new QListWidgetItemPrivate(this)), itemFlags(other.itemFlags) { @@ -797,6 +823,15 @@ QListWidgetItem &QListWidgetItem::operator=(const QListWidgetItem &other) return *this; } +/*! + \internal + returns the QListModel if a view is set + */ +QListModel *QListWidgetItem::listModel() const +{ + return (view ? qobject_cast<QListModel*>(view->model()) : nullptr); +} + #ifndef QT_NO_DATASTREAM /*! @@ -949,6 +984,50 @@ QDataStream &operator>>(QDataStream &in, QListWidgetItem &item) */ /*! + \fn void QListWidgetItem::setSelected(bool select) + \since 4.2 + + Sets the selected state of the item to \a select. + + \sa isSelected() +*/ +void QListWidgetItem::setSelected(bool select) +{ + const QListModel *model = listModel(); + if (!model || !view->selectionModel()) + return; + const QAbstractItemView::SelectionMode selectionMode = view->selectionMode(); + if (selectionMode == QAbstractItemView::NoSelection) + return; + const QModelIndex index = model->index(this); + if (selectionMode == QAbstractItemView::SingleSelection) + view->selectionModel()->select(index, select + ? QItemSelectionModel::ClearAndSelect + : QItemSelectionModel::Deselect); + else + view->selectionModel()->select(index, select + ? QItemSelectionModel::Select + : QItemSelectionModel::Deselect); +} + +/*! + \fn bool QListWidgetItem::isSelected() const + \since 4.2 + + Returns \c true if the item is selected; otherwise returns \c false. + + \sa setSelected() +*/ +bool QListWidgetItem::isSelected() const +{ + const QListModel *model = listModel(); + if (!model || !view->selectionModel()) + return false; + const QModelIndex index = model->index(this); + return view->selectionModel()->isSelected(index); +} + +/*! \fn void QListWidgetItem::setFlags(Qt::ItemFlags flags) Sets the item flags for the list item to \a flags. @@ -958,7 +1037,7 @@ QDataStream &operator>>(QDataStream &in, QListWidgetItem &item) void QListWidgetItem::setFlags(Qt::ItemFlags aflags) { itemFlags = aflags; - if (QListModel *model = (view ? qobject_cast<QListModel*>(view->model()) : 0)) + if (QListModel *model = listModel()) model->itemChanged(this); } @@ -1690,6 +1769,7 @@ void QListWidget::setItemWidget(QListWidgetItem *item, QWidget *widget) QAbstractItemView::setIndexWidget(index, widget); } +#if QT_DEPRECATED_SINCE(5, 13) /*! Returns \c true if \a item is selected; otherwise returns \c false. @@ -1699,9 +1779,7 @@ void QListWidget::setItemWidget(QListWidgetItem *item, QWidget *widget) */ bool QListWidget::isItemSelected(const QListWidgetItem *item) const { - Q_D(const QListWidget); - QModelIndex index = d->listModel()->index(const_cast<QListWidgetItem*>(item)); - return selectionModel()->isSelected(index); + return ((item && item->listWidget() == this) ? item->isSelected() : false); } /*! @@ -1714,20 +1792,10 @@ bool QListWidget::isItemSelected(const QListWidgetItem *item) const */ void QListWidget::setItemSelected(const QListWidgetItem *item, bool select) { - Q_D(QListWidget); - QModelIndex index = d->listModel()->index(const_cast<QListWidgetItem*>(item)); - - if (d->selectionMode == SingleSelection) { - selectionModel()->select(index, select - ? QItemSelectionModel::ClearAndSelect - : QItemSelectionModel::Deselect); - } else if (d->selectionMode != NoSelection) { - selectionModel()->select(index, select - ? QItemSelectionModel::Select - : QItemSelectionModel::Deselect); - } - + if (item && item->listWidget() == this) + const_cast<QListWidgetItem*>(item)->setSelected(select); } +#endif /*! Returns a list of all selected items in the list widget. @@ -1763,6 +1831,7 @@ QList<QListWidgetItem*> QListWidget::findItems(const QString &text, Qt::MatchFla return items; } +#if QT_DEPRECATED_SINCE(5, 13) /*! Returns \c true if the \a item is explicitly hidden; otherwise returns \c false. @@ -1786,6 +1855,7 @@ void QListWidget::setItemHidden(const QListWidgetItem *item, bool hide) { setRowHidden(row(item), hide); } +#endif /*! Scrolls the view if necessary to ensure that the \a item is visible. diff --git a/src/widgets/itemviews/qlistwidget.h b/src/widgets/itemviews/qlistwidget.h index 947fdb1a2f..c093d13e6d 100644 --- a/src/widgets/itemviews/qlistwidget.h +++ b/src/widgets/itemviews/qlistwidget.h @@ -61,10 +61,10 @@ class Q_WIDGETS_EXPORT QListWidgetItem friend class QListWidget; public: enum ItemType { Type = 0, UserType = 1000 }; - explicit QListWidgetItem(QListWidget *view = nullptr, int type = Type); - explicit QListWidgetItem(const QString &text, QListWidget *view = nullptr, int type = Type); + explicit QListWidgetItem(QListWidget *listview = nullptr, int type = Type); + explicit QListWidgetItem(const QString &text, QListWidget *listview = nullptr, int type = Type); explicit QListWidgetItem(const QIcon &icon, const QString &text, - QListWidget *view = nullptr, int type = Type); + QListWidget *listview = nullptr, int type = Type); QListWidgetItem(const QListWidgetItem &other); virtual ~QListWidgetItem(); @@ -72,8 +72,8 @@ public: inline QListWidget *listWidget() const { return view; } - inline void setSelected(bool select); - inline bool isSelected() const; + void setSelected(bool select); + bool isSelected() const; inline void setHidden(bool hide); inline bool isHidden() const; @@ -114,20 +114,28 @@ public: inline void setTextAlignment(int alignment) { setData(Qt::TextAlignmentRole, alignment); } +#if QT_DEPRECATED_SINCE(5, 13) + QT_DEPRECATED_X ("Use QListWidgetItem::background() instead") inline QColor backgroundColor() const - { return qvariant_cast<QColor>(data(Qt::BackgroundColorRole)); } + { return qvariant_cast<QColor>(data(Qt::BackgroundRole)); } + QT_DEPRECATED_X ("Use QListWidgetItem::setBackground() instead") virtual void setBackgroundColor(const QColor &color) - { setData(Qt::BackgroundColorRole, color); } + { setData(Qt::BackgroundRole, color); } +#endif inline QBrush background() const { return qvariant_cast<QBrush>(data(Qt::BackgroundRole)); } inline void setBackground(const QBrush &brush) { setData(Qt::BackgroundRole, brush); } +#if QT_DEPRECATED_SINCE(5, 13) + QT_DEPRECATED_X ("Use QListWidgetItem::foreground() instead") inline QColor textColor() const - { return qvariant_cast<QColor>(data(Qt::TextColorRole)); } + { return qvariant_cast<QColor>(data(Qt::ForegroundRole)); } + QT_DEPRECATED_X ("Use QListWidgetItem::setForeground() instead") inline void setTextColor(const QColor &color) - { setData(Qt::TextColorRole, color); } + { setData(Qt::ForegroundRole, color); } +#endif inline QBrush foreground() const { return qvariant_cast<QBrush>(data(Qt::ForegroundRole)); } @@ -158,6 +166,7 @@ public: inline int type() const { return rtti; } private: + QListModel *listModel() const; int rtti; QVector<void *> dummy; QListWidget *view; @@ -246,13 +255,21 @@ public: void setItemWidget(QListWidgetItem *item, QWidget *widget); inline void removeItemWidget(QListWidgetItem *item); +#if QT_DEPRECATED_SINCE(5, 13) + QT_DEPRECATED_X ("Use QListWidgetItem::isSelected() instead") bool isItemSelected(const QListWidgetItem *item) const; + QT_DEPRECATED_X ("Use QListWidgetItem::setSelected() instead") void setItemSelected(const QListWidgetItem *item, bool select); +#endif QList<QListWidgetItem*> selectedItems() const; QList<QListWidgetItem*> findItems(const QString &text, Qt::MatchFlags flags) const; +#if QT_DEPRECATED_SINCE(5, 13) + QT_DEPRECATED_X ("Use QListWidgetItem::isHidden() instead") bool isItemHidden(const QListWidgetItem *item) const; + QT_DEPRECATED_X ("Use QListWidgetItem::setHidden() instead") void setItemHidden(const QListWidgetItem *item, bool hide); +#endif #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) protected: #endif @@ -331,17 +348,11 @@ inline void QListWidget::addItem(QListWidgetItem *aitem) inline QListWidgetItem *QListWidget::itemAt(int ax, int ay) const { return itemAt(QPoint(ax, ay)); } -inline void QListWidgetItem::setSelected(bool aselect) -{ if (view) view->setItemSelected(this, aselect); } - -inline bool QListWidgetItem::isSelected() const -{ return (view ? view->isItemSelected(this) : false); } - inline void QListWidgetItem::setHidden(bool ahide) -{ if (view) view->setItemHidden(this, ahide); } +{ if (view) view->setRowHidden(view->row(this), ahide); } inline bool QListWidgetItem::isHidden() const -{ return (view ? view->isItemHidden(this) : false); } +{ return (view ? view->isRowHidden(view->row(this)) : false); } QT_END_NAMESPACE diff --git a/src/widgets/itemviews/qlistwidget_p.h b/src/widgets/itemviews/qlistwidget_p.h index 9cb3d5966b..65a7124322 100644 --- a/src/widgets/itemviews/qlistwidget_p.h +++ b/src/widgets/itemviews/qlistwidget_p.h @@ -100,11 +100,15 @@ public: QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; bool setData(const QModelIndex &index, const QVariant &value, int role) override; +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + bool clearItemData(const QModelIndex &index) override; +#endif QMap<int, QVariant> itemData(const QModelIndex &index) const override; bool insertRows(int row, int count = 1, const QModelIndex &parent = QModelIndex()) override; bool removeRows(int row, int count = 1, const QModelIndex &parent = QModelIndex()) override; + bool moveRows(const QModelIndex &sourceParent, int sourceRow, int count, const QModelIndex &destinationParent, int destinationChild) override; Qt::ItemFlags flags(const QModelIndex &index) const override; diff --git a/src/widgets/itemviews/qstyleditemdelegate.cpp b/src/widgets/itemviews/qstyleditemdelegate.cpp index 0f7566e8ec..22067851cb 100644 --- a/src/widgets/itemviews/qstyleditemdelegate.cpp +++ b/src/widgets/itemviews/qstyleditemdelegate.cpp @@ -139,7 +139,7 @@ public: \row \li \l Qt::AccessibleDescriptionRole \li QString \row \li \l Qt::AccessibleTextRole \li QString \endomit - \row \li \l Qt::BackgroundRole \li QBrush + \row \li \l Qt::BackgroundRole \li QBrush (\since 4.2) \row \li \l Qt::BackgroundColorRole \li QColor (obsolete; use Qt::BackgroundRole instead) \row \li \l Qt::CheckStateRole \li Qt::CheckState \row \li \l Qt::DecorationRole \li QIcon, QPixmap, QImage and QColor @@ -151,7 +151,7 @@ public: \row \li \l Qt::StatusTipRole \li \endomit \row \li \l Qt::TextAlignmentRole \li Qt::Alignment - \row \li \l Qt::ForegroundRole \li QBrush + \row \li \l Qt::ForegroundRole \li QBrush (\since 4.2) \row \li \l Qt::TextColorRole \li QColor (obsolete; use Qt::ForegroundRole instead) \omit \row \li \l Qt::ToolTipRole diff --git a/src/widgets/itemviews/qtableview.cpp b/src/widgets/itemviews/qtableview.cpp index 9725a768de..dac8174a2a 100644 --- a/src/widgets/itemviews/qtableview.cpp +++ b/src/widgets/itemviews/qtableview.cpp @@ -904,6 +904,15 @@ void QTableViewPrivate::_q_updateSpanRemovedColumns(const QModelIndex &parent, i /*! \internal + Sort the model when the header sort indicator changed +*/ +void QTableViewPrivate::_q_sortIndicatorChanged(int column, Qt::SortOrder order) +{ + model->sort(column, order); +} + +/*! + \internal Draws a table cell. */ void QTableViewPrivate::drawCell(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) @@ -1111,8 +1120,6 @@ QSize QTableView::viewportSizeHint() const Q_D(const QTableView); QSize result( (d->verticalHeader->isHidden() ? 0 : d->verticalHeader->width()) + d->horizontalHeader->length(), (d->horizontalHeader->isHidden() ? 0 : d->horizontalHeader->height()) + d->verticalHeader->length()); - result += QSize(verticalScrollBar()->isVisible() ? verticalScrollBar()->width() : 0, - horizontalScrollBar()->isVisible() ? horizontalScrollBar()->height() : 0); return result; } @@ -1383,12 +1390,12 @@ void QTableView::paintEvent(QPaintEvent *event) //firstVisualRow is the visual index of the first visible row. lastVisualRow is the visual index of the last visible Row. //same goes for ...VisualColumn int firstVisualRow = qMax(verticalHeader->visualIndexAt(0),0); - int lastVisualRow = verticalHeader->visualIndexAt(verticalHeader->viewport()->height()); + int lastVisualRow = verticalHeader->visualIndexAt(verticalHeader->height()); if (lastVisualRow == -1) lastVisualRow = d->model->rowCount(d->root) - 1; int firstVisualColumn = horizontalHeader->visualIndexAt(0); - int lastVisualColumn = horizontalHeader->visualIndexAt(horizontalHeader->viewport()->width()); + int lastVisualColumn = horizontalHeader->visualIndexAt(horizontalHeader->width()); if (rightToLeft) qSwap(firstVisualColumn, lastVisualColumn); if (firstVisualColumn == -1) @@ -2575,25 +2582,27 @@ void QTableView::setColumnHidden(int column, bool hide) void QTableView::setSortingEnabled(bool enable) { Q_D(QTableView); - d->sortingEnabled = enable; horizontalHeader()->setSortIndicatorShown(enable); if (enable) { disconnect(d->horizontalHeader, SIGNAL(sectionEntered(int)), this, SLOT(_q_selectColumn(int))); disconnect(horizontalHeader(), SIGNAL(sectionPressed(int)), this, SLOT(selectColumn(int))); - connect(horizontalHeader(), SIGNAL(sortIndicatorChanged(int,Qt::SortOrder)), - this, SLOT(sortByColumn(int)), Qt::UniqueConnection); + //sortByColumn has to be called before we connect or set the sortingEnabled flag + // because otherwise it will not call sort on the model. sortByColumn(horizontalHeader()->sortIndicatorSection(), horizontalHeader()->sortIndicatorOrder()); + connect(horizontalHeader(), SIGNAL(sortIndicatorChanged(int,Qt::SortOrder)), + this, SLOT(_q_sortIndicatorChanged(int,Qt::SortOrder)), Qt::UniqueConnection); } else { connect(d->horizontalHeader, SIGNAL(sectionEntered(int)), this, SLOT(_q_selectColumn(int)), Qt::UniqueConnection); connect(horizontalHeader(), SIGNAL(sectionPressed(int)), this, SLOT(selectColumn(int)), Qt::UniqueConnection); disconnect(horizontalHeader(), SIGNAL(sortIndicatorChanged(int,Qt::SortOrder)), - this, SLOT(sortByColumn(int))); + this, SLOT(_q_sortIndicatorChanged(int,Qt::SortOrder))); } + d->sortingEnabled = enable; } bool QTableView::isSortingEnabled() const @@ -3122,19 +3131,21 @@ void QTableView::resizeColumnsToContents() d->horizontalHeader->resizeSections(QHeaderView::ResizeToContents); } +#if QT_DEPRECATED_SINCE(5, 13) /*! \obsolete \overload + This function is deprecated. Use + sortByColumn(int column, Qt::SortOrder order) instead. Sorts the model by the values in the given \a column. */ void QTableView::sortByColumn(int column) { Q_D(QTableView); - if (column == -1) - return; - d->model->sort(column, d->horizontalHeader->sortIndicatorOrder()); + sortByColumn(column, d->horizontalHeader->sortIndicatorOrder()); } +#endif /*! \since 4.2 @@ -3146,8 +3157,14 @@ void QTableView::sortByColumn(int column) void QTableView::sortByColumn(int column, Qt::SortOrder order) { Q_D(QTableView); + if (column < 0) + return; + // If sorting is enabled it will emit a signal connected to + // _q_sortIndicatorChanged, which then actually sorts d->horizontalHeader->setSortIndicator(column, order); - sortByColumn(column); + // If sorting is not enabled, force to sort now + if (!d->sortingEnabled) + d->model->sort(column, order); } /*! diff --git a/src/widgets/itemviews/qtableview.h b/src/widgets/itemviews/qtableview.h index 60c2f34103..3275c09f88 100644 --- a/src/widgets/itemviews/qtableview.h +++ b/src/widgets/itemviews/qtableview.h @@ -118,7 +118,6 @@ public: int columnSpan(int row, int column) const; void clearSpans(); - void sortByColumn(int column, Qt::SortOrder order); public Q_SLOTS: void selectRow(int row); @@ -131,7 +130,11 @@ public Q_SLOTS: void resizeRowsToContents(); void resizeColumnToContents(int column); void resizeColumnsToContents(); +#if QT_DEPRECATED_SINCE(5, 13) + QT_DEPRECATED_X ("Use QTableView::sortByColumn(int column, Qt::SortOrder order) instead") void sortByColumn(int column); +#endif + void sortByColumn(int column, Qt::SortOrder order); void setShowGrid(bool show); protected Q_SLOTS: @@ -188,6 +191,7 @@ private: Q_PRIVATE_SLOT(d_func(), void _q_updateSpanInsertedColumns(QModelIndex,int,int)) Q_PRIVATE_SLOT(d_func(), void _q_updateSpanRemovedRows(QModelIndex,int,int)) Q_PRIVATE_SLOT(d_func(), void _q_updateSpanRemovedColumns(QModelIndex,int,int)) + Q_PRIVATE_SLOT(d_func(), void _q_sortIndicatorChanged(int column, Qt::SortOrder order)) }; QT_END_NAMESPACE diff --git a/src/widgets/itemviews/qtableview_p.h b/src/widgets/itemviews/qtableview_p.h index 805787597c..520fd9a3af 100644 --- a/src/widgets/itemviews/qtableview_p.h +++ b/src/widgets/itemviews/qtableview_p.h @@ -257,6 +257,7 @@ public: void _q_updateSpanInsertedColumns(const QModelIndex &parent, int start, int end); void _q_updateSpanRemovedRows(const QModelIndex &parent, int start, int end); void _q_updateSpanRemovedColumns(const QModelIndex &parent, int start, int end); + void _q_sortIndicatorChanged(int column, Qt::SortOrder order); }; QT_END_NAMESPACE diff --git a/src/widgets/itemviews/qtablewidget.cpp b/src/widgets/itemviews/qtablewidget.cpp index 2d539e10ba..0916079cfc 100644 --- a/src/widgets/itemviews/qtablewidget.cpp +++ b/src/widgets/itemviews/qtablewidget.cpp @@ -189,7 +189,7 @@ void QTableModel::setItem(int row, int column, QTableWidgetItem *item) sortedRow = qMax((int)(it - colItems.begin()), 0); } if (sortedRow != row) { - emit layoutAboutToBeChanged(); + emit layoutAboutToBeChanged({}, QAbstractItemModel::VerticalSortHint); // move the items @ row to sortedRow int cc = columnCount(); QVector<QTableWidgetItem*> rowItems(cc); @@ -209,7 +209,7 @@ void QTableModel::setItem(int row, int column, QTableWidgetItem *item) changePersistentIndexList(oldPersistentIndexes, newPersistentIndexes); - emit layoutChanged(); + emit layoutChanged({}, QAbstractItemModel::VerticalSortHint); return; } } @@ -480,6 +480,24 @@ bool QTableModel::setItemData(const QModelIndex &index, const QMap<int, QVariant return true; } +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) +bool QTableModel::clearItemData(const QModelIndex &index) +{ + if (!checkIndex(index, CheckIndexOption::IndexIsValid)) + return false; + QTableWidgetItem *itm = item(index); + if (!itm) + return false; + const auto beginIter = itm->values.cbegin(); + const auto endIter = itm->values.cend(); + if (std::all_of(beginIter, endIter, [](const QWidgetItemData& data) -> bool { return !data.value.isValid(); })) + return true; //it's already cleared + itm->values.clear(); + emit dataChanged(index, index, QVector<int>{}); + return true; +} +#endif + Qt::ItemFlags QTableModel::flags(const QModelIndex &index) const { if (!index.isValid()) @@ -530,12 +548,12 @@ void QTableModel::sort(int column, Qt::SortOrder order) } } - emit layoutAboutToBeChanged(); + emit layoutAboutToBeChanged({}, QAbstractItemModel::VerticalSortHint); tableItems = sorted_table; changePersistentIndexList(from, to); // ### slow - emit layoutChanged(); + emit layoutChanged({}, QAbstractItemModel::VerticalSortHint); } /* @@ -580,7 +598,7 @@ void QTableModel::ensureSorted(int column, Qt::SortOrder order, vit = colItems.insert(vit, item); if (newRow != oldRow) { if (!changed) { - emit layoutAboutToBeChanged(); + emit layoutAboutToBeChanged({}, QAbstractItemModel::VerticalSortHint); oldPersistentIndexes = persistentIndexList(); newPersistentIndexes = oldPersistentIndexes; changed = true; @@ -615,7 +633,7 @@ void QTableModel::ensureSorted(int column, Qt::SortOrder order, verticalHeaderItems = newVertical; changePersistentIndexList(oldPersistentIndexes, newPersistentIndexes); - emit layoutChanged(); + emit layoutChanged({}, QAbstractItemModel::VerticalSortHint); } } @@ -1037,24 +1055,6 @@ QTableWidgetSelectionRange::~QTableWidgetSelectionRange() */ /*! - \fn void QTableWidgetItem::setSelected(bool select) - \since 4.2 - - Sets the selected state of the item to \a select. - - \sa isSelected() -*/ - -/*! - \fn bool QTableWidgetItem::isSelected() const - \since 4.2 - - Returns \c true if the item is selected, otherwise returns \c false. - - \sa setSelected() -*/ - -/*! \fn QSize QTableWidgetItem::sizeHint() const \since 4.1 @@ -1091,6 +1091,44 @@ QTableWidgetSelectionRange::~QTableWidgetSelectionRange() */ /*! + \fn bool QTableWidgetItem::isSelected() const + \since 4.2 + + Returns \c true if the item is selected, otherwise returns \c false. + + \sa setSelected() +*/ +bool QTableWidgetItem::isSelected() const +{ + if (!view || !view->selectionModel()) + return false; + const QTableModel *model = qobject_cast<const QTableModel*>(view->model()); + if (!model) + return false; + const QModelIndex index = model->index(this); + return view->selectionModel()->isSelected(index); +} + +/*! + \fn void QTableWidgetItem::setSelected(bool select) + \since 4.2 + + Sets the selected state of the item to \a select. + + \sa isSelected() +*/ +void QTableWidgetItem::setSelected(bool select) +{ + if (!view || !view->selectionModel()) + return; + const QTableModel *model = qobject_cast<const QTableModel*>(view->model()); + if (!model) + return; + const QModelIndex index = model->index(this); + view->selectionModel()->select(index, select ? QItemSelectionModel::Select : QItemSelectionModel::Deselect); +} + +/*! \fn Qt::ItemFlags QTableWidgetItem::flags() const Returns the flags used to describe the item. These determine whether @@ -1110,7 +1148,7 @@ QTableWidgetSelectionRange::~QTableWidgetSelectionRange() void QTableWidgetItem::setFlags(Qt::ItemFlags aflags) { itemFlags = aflags; - if (QTableModel *model = (view ? qobject_cast<QTableModel*>(view->model()) : 0)) + if (QTableModel *model = tableModel()) model->itemChanged(this); } @@ -1301,7 +1339,7 @@ void QTableWidgetItem::setFlags(Qt::ItemFlags aflags) \sa type() */ QTableWidgetItem::QTableWidgetItem(int type) - : rtti(type), view(0), d(new QTableWidgetItemPrivate(this)), + : rtti(type), view(nullptr), d(new QTableWidgetItemPrivate(this)), itemFlags(Qt::ItemIsEditable |Qt::ItemIsSelectable |Qt::ItemIsUserCheckable @@ -1317,7 +1355,7 @@ QTableWidgetItem::QTableWidgetItem(int type) \sa type() */ QTableWidgetItem::QTableWidgetItem(const QString &text, int type) - : rtti(type), view(0), d(new QTableWidgetItemPrivate(this)), + : rtti(type), view(nullptr), d(new QTableWidgetItemPrivate(this)), itemFlags(Qt::ItemIsEditable |Qt::ItemIsSelectable |Qt::ItemIsUserCheckable @@ -1334,7 +1372,7 @@ QTableWidgetItem::QTableWidgetItem(const QString &text, int type) \sa type() */ QTableWidgetItem::QTableWidgetItem(const QIcon &icon, const QString &text, int type) - : rtti(type), view(0), d(new QTableWidgetItemPrivate(this)), + : rtti(type), view(nullptr), d(new QTableWidgetItemPrivate(this)), itemFlags(Qt::ItemIsEditable |Qt::ItemIsSelectable |Qt::ItemIsUserCheckable @@ -1351,9 +1389,8 @@ QTableWidgetItem::QTableWidgetItem(const QIcon &icon, const QString &text, int t */ QTableWidgetItem::~QTableWidgetItem() { - if (QTableModel *model = (view ? qobject_cast<QTableModel*>(view->model()) : 0)) + if (QTableModel *model = tableModel()) model->removeItem(this); - view = 0; delete d; } @@ -1389,7 +1426,7 @@ void QTableWidgetItem::setData(int role, const QVariant &value) } if (!found) values.append(QWidgetItemData(role, value)); - if (QTableModel *model = (view ? qobject_cast<QTableModel*>(view->model()) : nullptr)) + if (QTableModel *model = tableModel()) { const QVector<int> roles((role == Qt::DisplayRole) ? QVector<int>({Qt::DisplayRole, Qt::EditRole}) : @@ -1444,6 +1481,16 @@ void QTableWidgetItem::write(QDataStream &out) const } /*! + \internal + returns the QTableModel if a view is set +*/ +QTableModel *QTableWidgetItem::tableModel() const +{ + return (view ? qobject_cast<QTableModel*>(view->model()) : nullptr); +} + + +/*! \relates QTableWidgetItem Reads a table widget item from stream \a in into \a item. @@ -1486,7 +1533,7 @@ QDataStream &operator<<(QDataStream &out, const QTableWidgetItem &item) \sa data(), flags() */ QTableWidgetItem::QTableWidgetItem(const QTableWidgetItem &other) - : rtti(Type), values(other.values), view(0), + : rtti(Type), values(other.values), view(nullptr), d(new QTableWidgetItemPrivate(this)), itemFlags(other.itemFlags) { @@ -2305,6 +2352,7 @@ void QTableWidget::setCellWidget(int row, int column, QWidget *widget) QAbstractItemView::setIndexWidget(index, widget); } +#if QT_DEPRECATED_SINCE(5, 13) /*! Returns \c true if the \a item is selected, otherwise returns \c false. @@ -2315,9 +2363,7 @@ void QTableWidget::setCellWidget(int row, int column, QWidget *widget) bool QTableWidget::isItemSelected(const QTableWidgetItem *item) const { - Q_D(const QTableWidget); - QModelIndex index = d->tableModel()->index(item); - return selectionModel()->isSelected(index); + return ((item && item->tableWidget() == this) ? item->isSelected() : false); } /*! @@ -2329,10 +2375,10 @@ bool QTableWidget::isItemSelected(const QTableWidgetItem *item) const */ void QTableWidget::setItemSelected(const QTableWidgetItem *item, bool select) { - Q_D(QTableWidget); - QModelIndex index = d->tableModel()->index(item); - selectionModel()->select(index, select ? QItemSelectionModel::Select : QItemSelectionModel::Deselect); + if (item && item->tableWidget() == this) + const_cast<QTableWidgetItem*>(item)->setSelected(select); } +#endif /*! Selects or deselects the \a range depending on \a select. diff --git a/src/widgets/itemviews/qtablewidget.h b/src/widgets/itemviews/qtablewidget.h index 9de27d164f..d93032f3f0 100644 --- a/src/widgets/itemviews/qtablewidget.h +++ b/src/widgets/itemviews/qtablewidget.h @@ -92,8 +92,8 @@ public: inline int row() const; inline int column() const; - inline void setSelected(bool select); - inline bool isSelected() const; + void setSelected(bool select); + bool isSelected() const; inline Qt::ItemFlags flags() const { return itemFlags; } void setFlags(Qt::ItemFlags flags); @@ -131,20 +131,28 @@ public: inline void setTextAlignment(int alignment) { setData(Qt::TextAlignmentRole, alignment); } +#if QT_DEPRECATED_SINCE(5, 13) + QT_DEPRECATED_X ("Use QTableWidgetItem::background() instead") inline QColor backgroundColor() const - { return qvariant_cast<QColor>(data(Qt::BackgroundColorRole)); } + { return qvariant_cast<QColor>(data(Qt::BackgroundRole)); } + QT_DEPRECATED_X ("Use QTableWidgetItem::setBackground() instead") inline void setBackgroundColor(const QColor &color) - { setData(Qt::BackgroundColorRole, color); } + { setData(Qt::BackgroundRole, color); } +#endif inline QBrush background() const { return qvariant_cast<QBrush>(data(Qt::BackgroundRole)); } inline void setBackground(const QBrush &brush) { setData(Qt::BackgroundRole, brush); } +#if QT_DEPRECATED_SINCE(5, 13) + QT_DEPRECATED_X ("Use QTableWidgetItem::foreground() instead") inline QColor textColor() const - { return qvariant_cast<QColor>(data(Qt::TextColorRole)); } + { return qvariant_cast<QColor>(data(Qt::ForegroundRole)); } + QT_DEPRECATED_X ("Use QTableWidgetItem::setForeground() instead") inline void setTextColor(const QColor &color) - { setData(Qt::TextColorRole, color); } + { setData(Qt::ForegroundRole, color); } +#endif inline QBrush foreground() const { return qvariant_cast<QBrush>(data(Qt::ForegroundRole)); } @@ -175,6 +183,9 @@ public: inline int type() const { return rtti; } private: + QTableModel *tableModel() const; + +private: int rtti; QVector<QWidgetItemData> values; QTableWidget *view; @@ -268,8 +279,12 @@ public: void setCellWidget(int row, int column, QWidget *widget); inline void removeCellWidget(int row, int column); +#if QT_DEPRECATED_SINCE(5, 13) + QT_DEPRECATED_X ("Use QTableWidgetItem::isSelected() instead") bool isItemSelected(const QTableWidgetItem *item) const; + QT_DEPRECATED_X ("Use QTableWidgetItem::setSelected() instead") void setItemSelected(const QTableWidgetItem *item, bool select); +#endif void setRangeSelected(const QTableWidgetSelectionRange &range, bool select); QList<QTableWidgetSelectionRange> selectedRanges() const; @@ -375,12 +390,6 @@ inline int QTableWidgetItem::row() const inline int QTableWidgetItem::column() const { return (view ? view->column(this) : -1); } -inline void QTableWidgetItem::setSelected(bool aselect) -{ if (view) view->setItemSelected(this, aselect); } - -inline bool QTableWidgetItem::isSelected() const -{ return (view ? view->isItemSelected(this) : false); } - QT_END_NAMESPACE #endif // QTABLEWIDGET_H diff --git a/src/widgets/itemviews/qtablewidget_p.h b/src/widgets/itemviews/qtablewidget_p.h index 9899272fce..d88326f129 100644 --- a/src/widgets/itemviews/qtablewidget_p.h +++ b/src/widgets/itemviews/qtablewidget_p.h @@ -129,6 +129,9 @@ public: QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; bool setData(const QModelIndex &index, const QVariant &value, int role) override; bool setItemData(const QModelIndex &index, const QMap<int, QVariant> &roles) override; +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + bool clearItemData(const QModelIndex &index) override; +#endif QMap<int, QVariant> itemData(const QModelIndex &index) const override; diff --git a/src/widgets/itemviews/qtreeview.cpp b/src/widgets/itemviews/qtreeview.cpp index f3647f656a..e7196c9d5d 100644 --- a/src/widgets/itemviews/qtreeview.cpp +++ b/src/widgets/itemviews/qtreeview.cpp @@ -1089,15 +1089,8 @@ void QTreeView::keyboardSearch(const QString &search) if (start.column() > 0) index = index.sibling(index.row(), start.column()); - if (index.isValid()) { - QItemSelectionModel::SelectionFlags flags = (d->selectionMode == SingleSelection - ? QItemSelectionModel::SelectionFlags( - QItemSelectionModel::ClearAndSelect - |d->selectionBehaviorFlags()) - : QItemSelectionModel::SelectionFlags( - QItemSelectionModel::NoUpdate)); - selectionModel()->setCurrentIndex(index, flags); - } + if (index.isValid()) + setCurrentIndex(index); } /*! @@ -1992,21 +1985,7 @@ void QTreeView::keyPressEvent(QKeyEvent *event) if (d->isIndexValid(current) && d->model && d->itemsExpandable) { switch (event->key()) { case Qt::Key_Asterisk: { - // do layouting only once after expanding is done - d->doDelayedItemsLayout(); - QStack<QModelIndex> parents; - parents.push(current); - while (!parents.isEmpty()) { - QModelIndex parent = parents.pop(); - for (int row = 0; row < d->model->rowCount(parent); ++row) { - QModelIndex child = d->model->index(row, 0, parent); - if (!d->isIndexValid(child)) - break; - parents.push(child); - expand(child); - } - } - expand(current); + expandRecursively(current); break; } case Qt::Key_Plus: expand(current); @@ -2160,12 +2139,10 @@ int QTreeView::verticalOffset() const // ### find a faster way to do this d->executePostedLayout(); int offset = 0; - for (int i = 0; i < d->viewItems.count(); ++i) { - if (i == verticalScrollBar()->value()) - return offset; + const int cnt = std::min(d->viewItems.count(), verticalScrollBar()->value()); + for (int i = 0; i < cnt; ++i) offset += d->itemHeight(i); - } - return 0; + return offset; } // scroll per pixel return verticalScrollBar()->value(); @@ -2621,10 +2598,13 @@ void QTreeView::resizeColumnToContents(int column) d->header->resizeSection(column, qMax(contents, header)); } +#if QT_DEPRECATED_SINCE(5, 13) /*! \obsolete \overload + This function is deprecated. Use + sortByColumn(int column, Qt::SortOrder order) instead. Sorts the model by the values in the given \a column. */ void QTreeView::sortByColumn(int column) @@ -2632,6 +2612,7 @@ void QTreeView::sortByColumn(int column) Q_D(QTreeView); sortByColumn(column, d->header->sortIndicatorOrder()); } +#endif /*! \since 4.2 @@ -2647,10 +2628,12 @@ void QTreeView::sortByColumn(int column) void QTreeView::sortByColumn(int column, Qt::SortOrder order) { Q_D(QTreeView); - - //If sorting is enabled will emit a signal connected to _q_sortIndicatorChanged, which then actually sorts + if (column < 0) + return; + // If sorting is enabled it will emit a signal connected to + // _q_sortIndicatorChanged, which then actually sorts d->header->setSortIndicator(column, order); - //If sorting is not enabled, force to sort now. + // If sorting is not enabled, force to sort now if (!d->sortingEnabled) d->model->sort(column, order); } @@ -2694,11 +2677,7 @@ QSize QTreeView::viewportSizeHint() const QSize result = QSize(d->header->length(), deepestRect.bottom() + 1); // add size for header - result += QSize(0, d->header->isVisible() ? d->header->height() : 0); - - // add size for scrollbars - result += QSize(verticalScrollBar()->isVisible() ? verticalScrollBar()->width() : 0, - horizontalScrollBar()->isVisible() ? horizontalScrollBar()->height() : 0); + result += QSize(0, d->header->isHidden() ? 0 : d->header->height()); return result; } @@ -2707,7 +2686,7 @@ QSize QTreeView::viewportSizeHint() const \since 4.2 Expands all expandable items. - Warning: if the model contains a large number of items, + \warning: if the model contains a large number of items, this function will take some time to execute. \sa collapseAll(), expand(), collapse(), setExpanded() @@ -2723,6 +2702,50 @@ void QTreeView::expandAll() } /*! + \since 5.13 + Expands the item at the given \a index and all its children to the + given \a depth. The \a depth is relative to the given \a index. + A \a depth of -1 will expand all children, a \a depth of 0 will + only expand the given \a index. + + \warning: if the model contains a large number of items, + this function will take some time to execute. + + \sa expandAll() +*/ +void QTreeView::expandRecursively(const QModelIndex &index, int depth) +{ + Q_D(QTreeView); + + if (depth < -1) + return; + // do layouting only once after expanding is done + d->doDelayedItemsLayout(); + expand(index); + if (depth == 0) + return; + QStack<QPair<QModelIndex, int>> parents; + parents.push({index, 0}); + while (!parents.isEmpty()) { + const QPair<QModelIndex, int> elem = parents.pop(); + const QModelIndex &parent = elem.first; + const int curDepth = elem.second; + const int rowCount = d->model->rowCount(parent); + for (int row = 0; row < rowCount; ++row) { + const QModelIndex child = d->model->index(row, 0, parent); + if (!d->isIndexValid(child)) + break; + if (depth == -1 || curDepth + 1 < depth) + parents.push({child, curDepth + 1}); + if (d->isIndexExpanded(child)) + continue; + if (d->storeExpanded(child)) + emit expanded(child); + } + } +} + +/*! \since 4.2 Collapses all expanded items. diff --git a/src/widgets/itemviews/qtreeview.h b/src/widgets/itemviews/qtreeview.h index 33dbf1c1ce..e9cc1beedb 100644 --- a/src/widgets/itemviews/qtreeview.h +++ b/src/widgets/itemviews/qtreeview.h @@ -143,7 +143,6 @@ public: void doItemsLayout() override; void reset() override; - void sortByColumn(int column, Qt::SortOrder order); void dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector<int> &roles = QVector<int>()) override; void selectAll() override; @@ -158,8 +157,13 @@ public Q_SLOTS: void expand(const QModelIndex &index); void collapse(const QModelIndex &index); void resizeColumnToContents(int column); +#if QT_DEPRECATED_SINCE(5, 13) + QT_DEPRECATED_X ("Use QTreeeView::sortByColumn(int column, Qt::SortOrder order) instead") void sortByColumn(int column); +#endif + void sortByColumn(int column, Qt::SortOrder order); void expandAll(); + void expandRecursively(const QModelIndex &index, int depth = -1); void collapseAll(); void expandToDepth(int depth); diff --git a/src/widgets/itemviews/qtreewidget.cpp b/src/widgets/itemviews/qtreewidget.cpp index a0af27115d..ac117b1c07 100644 --- a/src/widgets/itemviews/qtreewidget.cpp +++ b/src/widgets/itemviews/qtreewidget.cpp @@ -390,6 +390,27 @@ bool QTreeModel::setData(const QModelIndex &index, const QVariant &value, int ro return false; } +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) +bool QTreeModel::clearItemData(const QModelIndex &index) +{ + if (!checkIndex(index, CheckIndexOption::IndexIsValid)) + return false; + QTreeWidgetItem *itm = item(index); + if (!itm) + return false; + const auto beginIter = itm->values.at(index.column()).cbegin(); + const auto endIter = itm->values.at(index.column()).cend(); + if (std::all_of(beginIter, endIter, [](const QWidgetItemData& data) -> bool { return !data.value.isValid(); }) + && !itm->d->display.at(index.column()).isValid()) { + return true; //it's already cleared + } + itm->d->display[index.column()] = QVariant(); + itm->values[index.column()].clear(); + emit dataChanged(index, index, QVector<int>{}); + return true; +} +#endif + QMap<int, QVariant> QTreeModel::itemData(const QModelIndex &index) const { QMap<int, QVariant> roles; @@ -635,7 +656,7 @@ void QTreeModel::ensureSorted(int column, Qt::SortOrder order, // we are going to change the persistent indexes, so we need to prepare if (!changed) { // this will only happen once changed = true; - emit layoutAboutToBeChanged(); // the selection model needs to know + emit layoutAboutToBeChanged({parent}, QAbstractItemModel::VerticalSortHint); // the selection model needs to know oldPersistentIndexes = persistentIndexList(); newPersistentIndexes = oldPersistentIndexes; } @@ -668,7 +689,7 @@ void QTreeModel::ensureSorted(int column, Qt::SortOrder order, if (changed) { itm->children = lst; changePersistentIndexList(oldPersistentIndexes, newPersistentIndexes); - emit layoutChanged(); + emit layoutChanged({parent}, QAbstractItemModel::VerticalSortHint); } } @@ -988,8 +1009,18 @@ void QTreeModel::timerEvent(QTimerEvent *ev) Sets the selected state of the item to \a select. \sa isSelected() - */ +void QTreeWidgetItem::setSelected(bool select) +{ + const QTreeModel *model = treeModel(); + if (!model || !view->selectionModel()) + return; + const QModelIndex index = model->index(this, 0); + view->selectionModel()->select(index, (select ? QItemSelectionModel::Select + : QItemSelectionModel::Deselect) + | QItemSelectionModel::Rows); + d->selected = select; +} /*! \fn bool QTreeWidgetItem::isSelected() const @@ -999,6 +1030,10 @@ void QTreeModel::timerEvent(QTimerEvent *ev) \sa setSelected() */ +bool QTreeWidgetItem::isSelected() const +{ + return d->selected; +} /*! \fn void QTreeWidgetItem::setHidden(bool hide) @@ -1012,12 +1047,18 @@ void QTreeModel::timerEvent(QTimerEvent *ev) \sa isHidden() */ -void QTreeWidgetItem::setHidden(bool ahide) +void QTreeWidgetItem::setHidden(bool hide) { - if (view) { - view->setItemHidden(this, ahide); - d->hidden = ahide; + const QTreeModel *model = treeModel(); + if (!model) + return; + if (this == model->headerItem) { + view->header()->setHidden(hide); + } else { + const QModelIndex index = view->d_func()->index(this); + view->setRowHidden(index.row(), index.parent(), hide); } + d->hidden = hide; } /*! @@ -1031,7 +1072,15 @@ void QTreeWidgetItem::setHidden(bool ahide) bool QTreeWidgetItem::isHidden() const { - return (view ? d->hidden : false); + const QTreeModel *model = treeModel(); + if (!model) + return false; + if (this == model->headerItem) + return view->header()->isHidden(); + if (view->d_func()->hiddenIndexes.isEmpty()) + return false; + QTreeModel::SkipSorting skipSorting(model); + return view->d_func()->isRowHidden(view->d_func()->index(this)); } /*! @@ -1043,6 +1092,14 @@ bool QTreeWidgetItem::isHidden() const \sa isExpanded() */ +void QTreeWidgetItem::setExpanded(bool expand) +{ + const QTreeModel *model = treeModel(); + if (!model) + return; + QTreeModel::SkipSorting skipSorting(model); + view->setExpanded(view->d_func()->index(this), expand); +} /*! \fn bool QTreeWidgetItem::isExpanded() const @@ -1052,6 +1109,14 @@ bool QTreeWidgetItem::isHidden() const \sa setExpanded() */ +bool QTreeWidgetItem::isExpanded() const +{ + const QTreeModel *model = treeModel(); + if (!model) + return false; + QTreeModel::SkipSorting skipSorting(model); + return view->isExpanded(view->d_func()->index(this)); +} /*! \fn void QTreeWidgetItem::setFirstColumnSpanned(bool span) @@ -1062,6 +1127,14 @@ bool QTreeWidgetItem::isHidden() const \sa isFirstColumnSpanned() */ +void QTreeWidgetItem::setFirstColumnSpanned(bool span) +{ + const QTreeModel *model = treeModel(); + if (!model || this == model->headerItem) + return; // We can't set the header items to spanning + const QModelIndex index = model->index(this, 0); + view->setFirstColumnSpanned(index.row(), index.parent(), span); +} /*! \fn bool QTreeWidgetItem::isFirstColumnSpanned() const @@ -1071,6 +1144,14 @@ bool QTreeWidgetItem::isHidden() const \sa setFirstColumnSpanned() */ +bool QTreeWidgetItem::isFirstColumnSpanned() const +{ + const QTreeModel *model = treeModel(); + if (!model || this == model->headerItem) + return false; + const QModelIndex index = model->index(this, 0); + return view->isFirstColumnSpanned(index.row(), index.parent()); +} /*! \fn QString QTreeWidgetItem::text(int column) const @@ -1325,7 +1406,7 @@ bool QTreeWidgetItem::isHidden() const \sa type() */ QTreeWidgetItem::QTreeWidgetItem(int type) - : rtti(type), view(0), d(new QTreeWidgetItemPrivate(this)), par(0), + : rtti(type), view(nullptr), d(new QTreeWidgetItemPrivate(this)), par(nullptr), itemFlags(Qt::ItemIsSelectable |Qt::ItemIsUserCheckable |Qt::ItemIsEnabled @@ -1344,7 +1425,7 @@ QTreeWidgetItem::QTreeWidgetItem(int type) \sa type() */ QTreeWidgetItem::QTreeWidgetItem(const QStringList &strings, int type) - : rtti(type), view(0), d(new QTreeWidgetItemPrivate(this)), par(0), + : rtti(type), view(nullptr), d(new QTreeWidgetItemPrivate(this)), par(nullptr), itemFlags(Qt::ItemIsSelectable |Qt::ItemIsUserCheckable |Qt::ItemIsEnabled @@ -1364,16 +1445,16 @@ QTreeWidgetItem::QTreeWidgetItem(const QStringList &strings, int type) \sa type() */ -QTreeWidgetItem::QTreeWidgetItem(QTreeWidget *view, int type) - : rtti(type), view(0), d(new QTreeWidgetItemPrivate(this)), par(0), +QTreeWidgetItem::QTreeWidgetItem(QTreeWidget *treeview, int type) + : rtti(type), view(nullptr), d(new QTreeWidgetItemPrivate(this)), par(nullptr), itemFlags(Qt::ItemIsSelectable |Qt::ItemIsUserCheckable |Qt::ItemIsEnabled |Qt::ItemIsDragEnabled |Qt::ItemIsDropEnabled) { - if (view && view->model()) { - QTreeModel *model = qobject_cast<QTreeModel*>(view->model()); + // do not set this->view here otherwise insertChild() will fail + if (QTreeModel *model = treeModel(treeview)) { model->rootItem->addChild(this); values.reserve(model->headerItem->columnCount()); } @@ -1389,8 +1470,8 @@ QTreeWidgetItem::QTreeWidgetItem(QTreeWidget *view, int type) \sa type() */ -QTreeWidgetItem::QTreeWidgetItem(QTreeWidget *view, const QStringList &strings, int type) - : rtti(type), view(0), d(new QTreeWidgetItemPrivate(this)), par(0), +QTreeWidgetItem::QTreeWidgetItem(QTreeWidget *treeview, const QStringList &strings, int type) + : rtti(type), view(nullptr), d(new QTreeWidgetItemPrivate(this)), par(nullptr), itemFlags(Qt::ItemIsSelectable |Qt::ItemIsUserCheckable |Qt::ItemIsEnabled @@ -1399,8 +1480,8 @@ QTreeWidgetItem::QTreeWidgetItem(QTreeWidget *view, const QStringList &strings, { for (int i = 0; i < strings.count(); ++i) setText(i, strings.at(i)); - if (view && view->model()) { - QTreeModel *model = qobject_cast<QTreeModel*>(view->model()); + // do not set this->view here otherwise insertChild() will fail + if (QTreeModel *model = treeModel(treeview)) { model->rootItem->addChild(this); values.reserve(model->headerItem->columnCount()); } @@ -1414,21 +1495,19 @@ QTreeWidgetItem::QTreeWidgetItem(QTreeWidget *view, const QStringList &strings, \sa type() */ -QTreeWidgetItem::QTreeWidgetItem(QTreeWidget *view, QTreeWidgetItem *after, int type) - : rtti(type), view(0), d(new QTreeWidgetItemPrivate(this)), par(0), +QTreeWidgetItem::QTreeWidgetItem(QTreeWidget *treeview, QTreeWidgetItem *after, int type) + : rtti(type), view(nullptr), d(new QTreeWidgetItemPrivate(this)), par(nullptr), itemFlags(Qt::ItemIsSelectable |Qt::ItemIsUserCheckable |Qt::ItemIsEnabled |Qt::ItemIsDragEnabled |Qt::ItemIsDropEnabled) { - if (view) { - QTreeModel *model = qobject_cast<QTreeModel*>(view->model()); - if (model) { - int i = model->rootItem->children.indexOf(after) + 1; - model->rootItem->insertChild(i, this); - values.reserve(model->headerItem->columnCount()); - } + // do not set this->view here otherwise insertChild() will fail + if (QTreeModel *model = treeModel(treeview)) { + int i = model->rootItem->children.indexOf(after) + 1; + model->rootItem->insertChild(i, this); + values.reserve(model->headerItem->columnCount()); } } @@ -1438,7 +1517,7 @@ QTreeWidgetItem::QTreeWidgetItem(QTreeWidget *view, QTreeWidgetItem *after, int \sa type() */ QTreeWidgetItem::QTreeWidgetItem(QTreeWidgetItem *parent, int type) - : rtti(type), view(0), d(new QTreeWidgetItemPrivate(this)), par(0), + : rtti(type), view(nullptr), d(new QTreeWidgetItemPrivate(this)), par(nullptr), itemFlags(Qt::ItemIsSelectable |Qt::ItemIsUserCheckable |Qt::ItemIsEnabled @@ -1456,7 +1535,7 @@ QTreeWidgetItem::QTreeWidgetItem(QTreeWidgetItem *parent, int type) \sa type() */ QTreeWidgetItem::QTreeWidgetItem(QTreeWidgetItem *parent, const QStringList &strings, int type) - : rtti(type), view(0), d(new QTreeWidgetItemPrivate(this)), par(0), + : rtti(type), view(nullptr), d(new QTreeWidgetItemPrivate(this)), par(nullptr), itemFlags(Qt::ItemIsSelectable |Qt::ItemIsUserCheckable |Qt::ItemIsEnabled @@ -1478,7 +1557,7 @@ QTreeWidgetItem::QTreeWidgetItem(QTreeWidgetItem *parent, const QStringList &str \sa type() */ QTreeWidgetItem::QTreeWidgetItem(QTreeWidgetItem *parent, QTreeWidgetItem *after, int type) - : rtti(type), view(0), d(new QTreeWidgetItemPrivate(this)), par(0), + : rtti(type), view(nullptr), d(new QTreeWidgetItemPrivate(this)), par(nullptr), itemFlags(Qt::ItemIsSelectable |Qt::ItemIsUserCheckable |Qt::ItemIsEnabled @@ -1501,7 +1580,7 @@ QTreeWidgetItem::QTreeWidgetItem(QTreeWidgetItem *parent, QTreeWidgetItem *after QTreeWidgetItem::~QTreeWidgetItem() { - QTreeModel *model = (view ? qobject_cast<QTreeModel*>(view->model()) : 0); + QTreeModel *model = treeModel(); bool wasSkipSort = false; if (model) { wasSkipSort = model->skipPendingSort; @@ -1663,16 +1742,17 @@ void QTreeWidgetItem::setFlags(Qt::ItemFlags flags) void QTreeWidgetItemPrivate::updateHiddenStatus(QTreeWidgetItem *item, bool inserting) { - QTreeModel *model = (item->view ? qobject_cast<QTreeModel*>(item->view->model()) : 0); + QTreeModel *model = item->treeModel(); if (!model) return; QStack<QTreeWidgetItem *> parents; parents.push(item); while (!parents.isEmpty()) { QTreeWidgetItem *parent = parents.pop(); - QModelIndex index = model->index(parent, 0); - if (parent->d->hidden) + if (parent->d->hidden) { + const QModelIndex index = model->index(parent, 0); item->view->setRowHidden(index.row(), index.parent(), inserting); + } for (int i = 0; i < parent->children.count(); ++i) { QTreeWidgetItem *child = parent->children.at(i); parents.push(child); @@ -1737,7 +1817,7 @@ void QTreeWidgetItem::setData(int column, int role, const QVariant &value) if (column < 0) return; - QTreeModel *model = (view ? qobject_cast<QTreeModel*>(view->model()) : 0); + QTreeModel *model = treeModel(); switch (role) { case Qt::EditRole: case Qt::DisplayRole: { @@ -1945,7 +2025,7 @@ void QTreeWidgetItem::insertChild(int index, QTreeWidgetItem *child) if (index < 0 || index > children.count() || child == 0 || child->view != 0 || child->par != 0) return; - if (QTreeModel *model = (view ? qobject_cast<QTreeModel*>(view->model()) : 0)) { + if (QTreeModel *model = treeModel()) { const bool wasSkipSort = model->skipPendingSort; model->skipPendingSort = true; if (model->rootItem == this) @@ -1996,7 +2076,7 @@ QTreeWidgetItem *QTreeWidgetItem::takeChild(int index) { // we move this outside the check of the index to allow executing // pending sorts from inline functions, using this function (hack) - QTreeModel *model = (view ? qobject_cast<QTreeModel*>(view->model()) : 0); + QTreeModel *model = treeModel(); if (model) { // This will trigger a layoutChanged signal, thus we might want to optimize // this function by not emitting the rowsRemoved signal etc to the view. @@ -2054,7 +2134,7 @@ void QTreeWidgetItem::insertChildren(int index, const QList<QTreeWidgetItem*> &c insertChild(index, children.at(n)); return; } - QTreeModel *model = (view ? qobject_cast<QTreeModel*>(view->model()) : 0); + QTreeModel *model = treeModel(); QStack<QTreeWidgetItem*> stack; QList<QTreeWidgetItem*> itemsToInsert; for (int n = 0; n < children.count(); ++n) { @@ -2101,7 +2181,7 @@ QList<QTreeWidgetItem*> QTreeWidgetItem::takeChildren() { QList<QTreeWidgetItem*> removed; if (children.count() > 0) { - QTreeModel *model = (view ? qobject_cast<QTreeModel*>(view->model()) : 0); + QTreeModel *model = treeModel(); if (model) { // This will trigger a layoutChanged signal, thus we might want to optimize // this function by not emitting the rowsRemoved signal etc to the view. @@ -2133,7 +2213,7 @@ QList<QTreeWidgetItem*> QTreeWidgetItem::takeChildren() void QTreeWidgetItemPrivate::sortChildren(int column, Qt::SortOrder order, bool climb) { - QTreeModel *model = (q->view ? qobject_cast<QTreeModel*>(q->view->model()) : 0); + QTreeModel *model = q->treeModel(); if (!model) return; model->sortItems(&q->children, column, order); @@ -2156,7 +2236,7 @@ void QTreeWidgetItemPrivate::sortChildren(int column, Qt::SortOrder order, bool */ void QTreeWidgetItem::sortChildren(int column, Qt::SortOrder order, bool climb) { - QTreeModel *model = (view ? qobject_cast<QTreeModel*>(view->model()) : 0); + QTreeModel *model = treeModel(); if (!model) return; if (model->isChanging()) @@ -2164,9 +2244,9 @@ void QTreeWidgetItem::sortChildren(int column, Qt::SortOrder order, bool climb) QTreeModel::SkipSorting skipSorting(model); int oldSortColumn = view->d_func()->explicitSortColumn; view->d_func()->explicitSortColumn = column; - emit model->layoutAboutToBeChanged(); + emit model->layoutAboutToBeChanged({}, QAbstractItemModel::VerticalSortHint); d->sortChildren(column, order, climb); - emit model->layoutChanged(); + emit model->layoutChanged({}, QAbstractItemModel::VerticalSortHint); view->d_func()->explicitSortColumn = oldSortColumn; } @@ -2236,7 +2316,7 @@ void QTreeWidgetItem::emitDataChanged() */ void QTreeWidgetItem::itemChanged() { - if (QTreeModel *model = (view ? qobject_cast<QTreeModel*>(view->model()) : 0)) + if (QTreeModel *model = treeModel()) model->itemChanged(this); } @@ -2245,10 +2325,21 @@ void QTreeWidgetItem::itemChanged() */ void QTreeWidgetItem::executePendingSort() const { - if (QTreeModel *model = (view ? qobject_cast<QTreeModel*>(view->model()) : 0)) + if (QTreeModel *model = treeModel()) model->executePendingSort(); } +/*! + \internal + returns the QTreeModel if a view is set +*/ +QTreeModel *QTreeWidgetItem::treeModel(QTreeWidget *v) const +{ + if (!v) + v = view; + return (v ? qobject_cast<QTreeModel*>(v->model()) : nullptr); +} + #ifndef QT_NO_DATASTREAM /*! @@ -3027,6 +3118,7 @@ void QTreeWidget::setItemWidget(QTreeWidgetItem *item, int column, QWidget *widg QAbstractItemView::setIndexWidget(d->index(item, column), widget); } +#if QT_DEPRECATED_SINCE(5, 13) /*! Returns \c true if the \a item is selected; otherwise returns \c false. @@ -3038,9 +3130,7 @@ void QTreeWidget::setItemWidget(QTreeWidgetItem *item, int column, QWidget *widg */ bool QTreeWidget::isItemSelected(const QTreeWidgetItem *item) const { - if (!item) - return false; - return item->d->selected; + return ((item && item->treeWidget() == this) ? item->isSelected() : false); } /*! @@ -3055,16 +3145,10 @@ bool QTreeWidget::isItemSelected(const QTreeWidgetItem *item) const */ void QTreeWidget::setItemSelected(const QTreeWidgetItem *item, bool select) { - Q_D(QTreeWidget); - - if (!item) - return; - - selectionModel()->select(d->index(item), (select ? QItemSelectionModel::Select - : QItemSelectionModel::Deselect) - |QItemSelectionModel::Rows); - item->d->selected = select; + if (item && item->treeWidget() == this) + const_cast<QTreeWidgetItem*>(item)->setSelected(select); } +#endif /*! Returns a list of all selected non-hidden items. @@ -3081,7 +3165,7 @@ QList<QTreeWidgetItem*> QTreeWidget::selectedItems() const seen.reserve(indexes.count()); for (const auto &index : indexes) { QTreeWidgetItem *item = d->item(index); - if (isItemHidden(item) || seen.contains(item)) + if (item->isHidden() || seen.contains(item)) continue; seen.insert(item); items.append(item); @@ -3105,6 +3189,7 @@ QList<QTreeWidgetItem*> QTreeWidget::findItems(const QString &text, Qt::MatchFla return items; } +#if QT_DEPRECATED_SINCE(5, 13) /*! Returns \c true if the \a item is explicitly hidden, otherwise returns \c false. @@ -3114,13 +3199,7 @@ QList<QTreeWidgetItem*> QTreeWidget::findItems(const QString &text, Qt::MatchFla */ bool QTreeWidget::isItemHidden(const QTreeWidgetItem *item) const { - Q_D(const QTreeWidget); - if (item == d->treeModel()->headerItem) - return header()->isHidden(); - if (d->hiddenIndexes.isEmpty()) - return false; - QTreeModel::SkipSorting skipSorting(d->treeModel()); - return d->isRowHidden(d->index(item)); + return ((item && item->treeWidget() == this) ? item->isHidden() : false); } /*! @@ -3134,16 +3213,8 @@ bool QTreeWidget::isItemHidden(const QTreeWidgetItem *item) const */ void QTreeWidget::setItemHidden(const QTreeWidgetItem *item, bool hide) { - if (!item) - return; - Q_D(QTreeWidget); - if (item == d->treeModel()->headerItem) { - header()->setHidden(hide); - } else { - const QModelIndex index = d->index(item); - setRowHidden(index.row(), index.parent(), hide); - } - item->d->hidden = hide; + if (item && item->treeWidget() == this) + const_cast<QTreeWidgetItem*>(item)->setHidden(hide); } /*! @@ -3157,9 +3228,7 @@ void QTreeWidget::setItemHidden(const QTreeWidgetItem *item, bool hide) */ bool QTreeWidget::isItemExpanded(const QTreeWidgetItem *item) const { - Q_D(const QTreeWidget); - QTreeModel::SkipSorting skipSorting(d->treeModel()); - return isExpanded(d->index(item)); + return ((item && item->treeWidget() == this) ? item->isExpanded() : false); } /*! @@ -3174,9 +3243,8 @@ bool QTreeWidget::isItemExpanded(const QTreeWidgetItem *item) const */ void QTreeWidget::setItemExpanded(const QTreeWidgetItem *item, bool expand) { - Q_D(QTreeWidget); - QTreeModel::SkipSorting skipSorting(d->treeModel()); - setExpanded(d->index(item), expand); + if (item && item->treeWidget() == this) + const_cast<QTreeWidgetItem*>(item)->setExpanded(expand); } /*! @@ -3186,14 +3254,14 @@ void QTreeWidget::setItemExpanded(const QTreeWidgetItem *item, bool expand) otherwise returns \c false. \sa setFirstItemColumnSpanned() + + \obsolete + + This function is deprecated. Use \l{QTreeWidgetItem::isFirstColumnSpanned()} instead. */ bool QTreeWidget::isFirstItemColumnSpanned(const QTreeWidgetItem *item) const { - Q_D(const QTreeWidget); - if (item == d->treeModel()->headerItem) - return false; // We can't set the header items to spanning - const QModelIndex index = d->index(item); - return isFirstColumnSpanned(index.row(), index.parent()); + return ((item && item->treeWidget() == this) ? item->isFirstColumnSpanned() : false); } /*! @@ -3203,15 +3271,17 @@ bool QTreeWidget::isFirstItemColumnSpanned(const QTreeWidgetItem *item) const otherwise the item will show one section per column. \sa isFirstItemColumnSpanned() + + \obsolete + + This function is deprecated. Use \l{QTreeWidgetItem::setFirstColumnSpanned()} instead. */ void QTreeWidget::setFirstItemColumnSpanned(const QTreeWidgetItem *item, bool span) { - Q_D(QTreeWidget); - if (item == d->treeModel()->headerItem) - return; // We can't set header items to spanning - const QModelIndex index = d->index(item); - setFirstColumnSpanned(index.row(), index.parent(), span); + if (item && item->treeWidget() == this) + const_cast<QTreeWidgetItem*>(item)->setFirstColumnSpanned(span); } +#endif /*! \since 4.3 diff --git a/src/widgets/itemviews/qtreewidget.h b/src/widgets/itemviews/qtreewidget.h index 975f208702..bed77b336d 100644 --- a/src/widgets/itemviews/qtreewidget.h +++ b/src/widgets/itemviews/qtreewidget.h @@ -66,9 +66,9 @@ public: enum ItemType { Type = 0, UserType = 1000 }; explicit QTreeWidgetItem(int type = Type); explicit QTreeWidgetItem(const QStringList &strings, int type = Type); - explicit QTreeWidgetItem(QTreeWidget *view, int type = Type); - QTreeWidgetItem(QTreeWidget *view, const QStringList &strings, int type = Type); - QTreeWidgetItem(QTreeWidget *view, QTreeWidgetItem *after, int type = Type); + explicit QTreeWidgetItem(QTreeWidget *treeview, int type = Type); + QTreeWidgetItem(QTreeWidget *treeview, const QStringList &strings, int type = Type); + QTreeWidgetItem(QTreeWidget *treeview, QTreeWidgetItem *after, int type = Type); explicit QTreeWidgetItem(QTreeWidgetItem *parent, int type = Type); QTreeWidgetItem(QTreeWidgetItem *parent, const QStringList &strings, int type = Type); QTreeWidgetItem(QTreeWidgetItem *parent, QTreeWidgetItem *after, int type = Type); @@ -79,17 +79,17 @@ public: inline QTreeWidget *treeWidget() const { return view; } - inline void setSelected(bool select); - inline bool isSelected() const; + void setSelected(bool select); + bool isSelected() const; void setHidden(bool hide); bool isHidden() const; - inline void setExpanded(bool expand); - inline bool isExpanded() const; + void setExpanded(bool expand); + bool isExpanded() const; - inline void setFirstColumnSpanned(bool span); - inline bool isFirstColumnSpanned() const; + void setFirstColumnSpanned(bool span); + bool isFirstColumnSpanned() const; inline void setDisabled(bool disabled); inline bool isDisabled() const; @@ -134,20 +134,28 @@ public: inline void setTextAlignment(int column, int alignment) { setData(column, Qt::TextAlignmentRole, alignment); } +#if QT_DEPRECATED_SINCE(5, 13) + QT_DEPRECATED_X ("Use QTreeWidgetItem::background() instead") inline QColor backgroundColor(int column) const - { return qvariant_cast<QColor>(data(column, Qt::BackgroundColorRole)); } + { return qvariant_cast<QColor>(data(column, Qt::BackgroundRole)); } + QT_DEPRECATED_X ("Use QTreeWidgetItem::setBackground() instead") inline void setBackgroundColor(int column, const QColor &color) - { setData(column, Qt::BackgroundColorRole, color); } + { setData(column, Qt::BackgroundRole, color); } +#endif inline QBrush background(int column) const { return qvariant_cast<QBrush>(data(column, Qt::BackgroundRole)); } inline void setBackground(int column, const QBrush &brush) { setData(column, Qt::BackgroundRole, brush); } +#if QT_DEPRECATED_SINCE(5, 13) + QT_DEPRECATED_X ("Use QTreeWidgetItem::foreground() instead") inline QColor textColor(int column) const - { return qvariant_cast<QColor>(data(column, Qt::TextColorRole)); } + { return qvariant_cast<QColor>(data(column, Qt::ForegroundRole)); } + QT_DEPRECATED_X ("Use QTreeWidgetItem::setForeground() instead") inline void setTextColor(int column, const QColor &color) - { setData(column, Qt::TextColorRole, color); } + { setData(column, Qt::ForegroundRole, color); } +#endif inline QBrush foreground(int column) const { return qvariant_cast<QBrush>(data(column, Qt::ForegroundRole)); } @@ -207,6 +215,7 @@ private: QVariant childrenCheckState(int column) const; void itemChanged(); void executePendingSort() const; + QTreeModel *treeModel(QTreeWidget *v = nullptr) const; int rtti; // One item has a vector of column entries. Each column has a vector of (role, value) pairs. @@ -306,20 +315,32 @@ public: void setItemWidget(QTreeWidgetItem *item, int column, QWidget *widget); inline void removeItemWidget(QTreeWidgetItem *item, int column); +#if QT_DEPRECATED_SINCE(5, 13) + QT_DEPRECATED_X ("Use QTreeWidgetItem::isSelected() instead") bool isItemSelected(const QTreeWidgetItem *item) const; + QT_DEPRECATED_X ("Use QTreeWidgetItem::setSelected() instead") void setItemSelected(const QTreeWidgetItem *item, bool select); +#endif QList<QTreeWidgetItem*> selectedItems() const; QList<QTreeWidgetItem*> findItems(const QString &text, Qt::MatchFlags flags, int column = 0) const; +#if QT_DEPRECATED_SINCE(5, 13) + QT_DEPRECATED_X ("Use QTreeWidgetItem::isHidden() instead") bool isItemHidden(const QTreeWidgetItem *item) const; + QT_DEPRECATED_X ("Use QTreeWidgetItem::setHidden() instead") void setItemHidden(const QTreeWidgetItem *item, bool hide); + QT_DEPRECATED_X ("Use QTreeWidgetItem::isExpanded() instead") bool isItemExpanded(const QTreeWidgetItem *item) const; + QT_DEPRECATED_X ("Use QTreeWidgetItem::setExpanded() instead") void setItemExpanded(const QTreeWidgetItem *item, bool expand); + QT_DEPRECATED_X ("Use QTreeWidgetItem::isFirstColumnSpanned() instead") bool isFirstItemColumnSpanned(const QTreeWidgetItem *item) const; + QT_DEPRECATED_X ("Use QTreeWidgetItem::setFirstColumnSpanned() instead") void setFirstItemColumnSpanned(const QTreeWidgetItem *item, bool span); +#endif QTreeWidgetItem *itemAbove(const QTreeWidgetItem *item) const; QTreeWidgetItem *itemBelow(const QTreeWidgetItem *item) const; @@ -404,24 +425,6 @@ inline QTreeWidgetItem *QTreeWidget::itemAt(int ax, int ay) const inline void QTreeWidget::setHeaderLabel(const QString &alabel) { setHeaderLabels(QStringList(alabel)); } -inline void QTreeWidgetItem::setSelected(bool aselect) -{ if (view) view->setItemSelected(this, aselect); } - -inline bool QTreeWidgetItem::isSelected() const -{ return (view ? view->isItemSelected(this) : false); } - -inline void QTreeWidgetItem::setExpanded(bool aexpand) -{ if (view) view->setItemExpanded(this, aexpand); } - -inline bool QTreeWidgetItem::isExpanded() const -{ return (view ? view->isItemExpanded(this) : false); } - -inline void QTreeWidgetItem::setFirstColumnSpanned(bool aspan) -{ if (view) view->setFirstItemColumnSpanned(this, aspan); } - -inline bool QTreeWidgetItem::isFirstColumnSpanned() const -{ return (view ? view->isFirstItemColumnSpanned(this) : false); } - inline void QTreeWidgetItem::setDisabled(bool disabled) { setFlags(disabled ? (flags() & ~Qt::ItemIsEnabled) : flags() | Qt::ItemIsEnabled); } diff --git a/src/widgets/itemviews/qtreewidget_p.h b/src/widgets/itemviews/qtreewidget_p.h index adc2c2c421..ee4a633468 100644 --- a/src/widgets/itemviews/qtreewidget_p.h +++ b/src/widgets/itemviews/qtreewidget_p.h @@ -99,7 +99,9 @@ public: QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; bool setData(const QModelIndex &index, const QVariant &value, int role) override; - +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + bool clearItemData(const QModelIndex &index) override; +#endif QMap<int, QVariant> itemData(const QModelIndex &index) const override; QVariant headerData(int section, Qt::Orientation orientation, int role) const override; diff --git a/src/widgets/kernel/qapplication.cpp b/src/widgets/kernel/qapplication.cpp index f9db6155af..595bdf621d 100644 --- a/src/widgets/kernel/qapplication.cpp +++ b/src/widgets/kernel/qapplication.cpp @@ -1445,6 +1445,7 @@ void QApplicationPrivate::setPalette_helper(const QPalette &palette, const char* else *QApplicationPrivate::set_pal = palette; QCoreApplication::setAttribute(Qt::AA_SetPalette); + emit qGuiApp->paletteChanged(*QGuiApplicationPrivate::app_pal); } } @@ -3908,6 +3909,7 @@ Qt::NavigationMode QApplication::navigationMode() return QApplicationPrivate::navigationMode; } +# if QT_DEPRECATED_SINCE(5, 13) /*! Sets whether Qt should use focus navigation suitable for use with a minimal keypad. @@ -3950,6 +3952,7 @@ bool QApplication::keypadNavigationEnabled() return QApplicationPrivate::navigationMode == Qt::NavigationModeKeypadTabOrder || QApplicationPrivate::navigationMode == Qt::NavigationModeKeypadDirectional; } +# endif #endif /*! diff --git a/src/widgets/kernel/qapplication.h b/src/widgets/kernel/qapplication.h index 7a5d7ba1a9..27e743a28d 100644 --- a/src/widgets/kernel/qapplication.h +++ b/src/widgets/kernel/qapplication.h @@ -180,8 +180,12 @@ public: bool notify(QObject *, QEvent *) override; #ifdef QT_KEYPAD_NAVIGATION - static Q_DECL_DEPRECATED void setKeypadNavigationEnabled(bool); - static bool keypadNavigationEnabled(); +# if QT_DEPRECATED_SINCE(5, 13) + static QT_DEPRECATED_X ("Use QApplication::setNavigationMode() instead") + void setKeypadNavigationEnabled(bool); + static QT_DEPRECATED_X ("Use QApplication::navigationMode() instead") + bool keypadNavigationEnabled(); +# endif static void setNavigationMode(Qt::NavigationMode mode); static Qt::NavigationMode navigationMode(); #endif diff --git a/src/widgets/kernel/qformlayout.cpp b/src/widgets/kernel/qformlayout.cpp index 66e8858e21..101ce8b64c 100644 --- a/src/widgets/kernel/qformlayout.cpp +++ b/src/widgets/kernel/qformlayout.cpp @@ -419,13 +419,15 @@ void QFormLayoutPrivate::updateSizes() if (label) { maxMinLblWidth = qMax(maxMinLblWidth, label->minSize.width()); maxShLblWidth = qMax(maxShLblWidth, label->sizeHint.width()); - if (field) { + } + if (field) { + if (field->fullRow) { + maxMinIfldWidth = qMax(maxMinIfldWidth, field->minSize.width()); + maxShIfldWidth = qMax(maxShIfldWidth, field->sizeHint.width()); + } else { maxMinFldWidth = qMax(maxMinFldWidth, field->minSize.width() + field->sbsHSpace); maxShFldWidth = qMax(maxShFldWidth, field->sizeHint.width() + field->sbsHSpace); } - } else if (field) { - maxMinIfldWidth = qMax(maxMinIfldWidth, field->minSize.width()); - maxShIfldWidth = qMax(maxShIfldWidth, field->sizeHint.width()); } prevLbl = label; diff --git a/src/widgets/kernel/qgesturemanager.cpp b/src/widgets/kernel/qgesturemanager.cpp index c4188044cf..57d6994c88 100644 --- a/src/widgets/kernel/qgesturemanager.cpp +++ b/src/widgets/kernel/qgesturemanager.cpp @@ -136,7 +136,7 @@ Qt::GestureType QGestureManager::registerGestureRecognizer(QGestureRecognizer *r ++m_lastCustomGestureId; type = Qt::GestureType(m_lastCustomGestureId); } - m_recognizers.insertMulti(type, recognizer); + m_recognizers.insert(type, recognizer); return type; } @@ -522,7 +522,7 @@ bool QGestureManager::filterEvent(QWidget *receiver, QEvent *event) for(ContextIterator it = w->d_func()->gestureContext.constBegin(), e = w->d_func()->gestureContext.constEnd(); it != e; ++it) { types.insert(it.key(), 0); - contexts.insertMulti(w, it.key()); + contexts.insert(w, it.key()); } } // find all gesture contexts for the widget tree @@ -534,7 +534,7 @@ bool QGestureManager::filterEvent(QWidget *receiver, QEvent *event) if (!(it.value() & Qt::DontStartGestureOnChildren)) { if (!types.contains(it.key())) { types.insert(it.key(), 0); - contexts.insertMulti(w, it.key()); + contexts.insert(w, it.key()); } } } @@ -556,7 +556,7 @@ bool QGestureManager::filterEvent(QGraphicsObject *receiver, QEvent *event) for(ContextIterator it = item->QGraphicsItem::d_func()->gestureContext.constBegin(), e = item->QGraphicsItem::d_func()->gestureContext.constEnd(); it != e; ++it) { types.insert(it.key(), 0); - contexts.insertMulti(item, it.key()); + contexts.insert(item, it.key()); } } // find all gesture contexts for the graphics object tree @@ -569,7 +569,7 @@ bool QGestureManager::filterEvent(QGraphicsObject *receiver, QEvent *event) if (!(it.value() & Qt::DontStartGestureOnChildren)) { if (!types.contains(it.key())) { types.insert(it.key(), 0); - contexts.insertMulti(item, it.key()); + contexts.insert(item, it.key()); } } } diff --git a/src/widgets/kernel/qwhatsthis.cpp b/src/widgets/kernel/qwhatsthis.cpp index 1fa83d3238..4a798a7490 100644 --- a/src/widgets/kernel/qwhatsthis.cpp +++ b/src/widgets/kernel/qwhatsthis.cpp @@ -398,10 +398,10 @@ QWhatsThisPrivate::QWhatsThisPrivate() #ifdef QT_NO_CURSOR Q_UNUSED(sentEvent); #else - QApplication::setOverrideCursor((!sentEvent || !e.isAccepted())? + QGuiApplication::setOverrideCursor((!sentEvent || !e.isAccepted())? Qt::ForbiddenCursor:Qt::WhatsThisCursor); } else { - QApplication::setOverrideCursor(Qt::WhatsThisCursor); + QGuiApplication::setOverrideCursor(Qt::WhatsThisCursor); #endif } #ifndef QT_NO_ACCESSIBILITY @@ -417,7 +417,7 @@ QWhatsThisPrivate::~QWhatsThisPrivate() action->setChecked(false); #endif // QT_CONFIG(action) #ifndef QT_NO_CURSOR - QApplication::restoreOverrideCursor(); + QGuiApplication::restoreOverrideCursor(); #endif #ifndef QT_NO_ACCESSIBILITY QAccessibleEvent event(this, QAccessible::ContextHelpEnd); diff --git a/src/widgets/kernel/qwidget.cpp b/src/widgets/kernel/qwidget.cpp index bcfae46155..ccfd3534cd 100644 --- a/src/widgets/kernel/qwidget.cpp +++ b/src/widgets/kernel/qwidget.cpp @@ -2412,29 +2412,34 @@ static inline void fillRegion(QPainter *painter, const QRegion &rgn, const QBrus } } -void QWidgetPrivate::paintBackground(QPainter *painter, const QRegion &rgn, int flags) const +bool QWidgetPrivate::updateBrushOrigin(QPainter *painter, const QBrush &brush) const { - Q_Q(const QWidget); - #if QT_CONFIG(scrollarea) - bool resetBrushOrigin = false; - QPointF oldBrushOrigin; + Q_Q(const QWidget); //If we are painting the viewport of a scrollarea, we must apply an offset to the brush in case we are drawing a texture + if (brush.style() == Qt::NoBrush || brush.style() == Qt::SolidPattern) + return false; QAbstractScrollArea *scrollArea = qobject_cast<QAbstractScrollArea *>(parent); if (scrollArea && scrollArea->viewport() == q) { QObjectData *scrollPrivate = static_cast<QWidget *>(scrollArea)->d_ptr.data(); QAbstractScrollAreaPrivate *priv = static_cast<QAbstractScrollAreaPrivate *>(scrollPrivate); - oldBrushOrigin = painter->brushOrigin(); - resetBrushOrigin = true; painter->setBrushOrigin(-priv->contentsOffset()); - } #endif // QT_CONFIG(scrollarea) + return true; +} +void QWidgetPrivate::paintBackground(QPainter *painter, const QRegion &rgn, int flags) const +{ + Q_Q(const QWidget); + + bool brushOriginSet = false; const QBrush autoFillBrush = q->palette().brush(q->backgroundRole()); if ((flags & DrawAsRoot) && !(q->autoFillBackground() && autoFillBrush.isOpaque())) { const QBrush bg = q->palette().brush(QPalette::Window); + if (!brushOriginSet) + brushOriginSet = updateBrushOrigin(painter, bg); if (!(flags & DontSetCompositionMode)) { //copy alpha straight in QPainter::CompositionMode oldMode = painter->compositionMode(); @@ -2446,8 +2451,11 @@ void QWidgetPrivate::paintBackground(QPainter *painter, const QRegion &rgn, int } } - if (q->autoFillBackground()) + if (q->autoFillBackground()) { + if (!brushOriginSet) + brushOriginSet = updateBrushOrigin(painter, autoFillBrush); fillRegion(painter, rgn, autoFillBrush); + } if (q->testAttribute(Qt::WA_StyledBackground)) { painter->setClipRegion(rgn); @@ -2455,11 +2463,6 @@ void QWidgetPrivate::paintBackground(QPainter *painter, const QRegion &rgn, int opt.initFrom(q); q->style()->drawPrimitive(QStyle::PE_Widget, &opt, painter, q); } - -#if QT_CONFIG(scrollarea) - if (resetBrushOrigin) - painter->setBrushOrigin(oldBrushOrigin); -#endif // QT_CONFIG(scrollarea) } /* @@ -4916,9 +4919,9 @@ void QWidget::unsetLayoutDirection() Some underlying window implementations will reset the cursor if it leaves a widget even if the mouse is grabbed. If you want to have a cursor set for all widgets, even when outside the window, consider - QApplication::setOverrideCursor(). + QGuiApplication::setOverrideCursor(). - \sa QApplication::setOverrideCursor() + \sa QGuiApplication::setOverrideCursor() */ #ifndef QT_NO_CURSOR diff --git a/src/widgets/kernel/qwidget.h b/src/widgets/kernel/qwidget.h index 9d5fe89c70..4e5ef5a111 100644 --- a/src/widgets/kernel/qwidget.h +++ b/src/widgets/kernel/qwidget.h @@ -235,7 +235,10 @@ public: bool isEnabled() const; bool isEnabledTo(const QWidget *) const; +#if QT_DEPRECATED_SINCE(5, 13) + QT_DEPRECATED_X ("Use isEnabled() instead") bool isEnabledToTLW() const; +#endif public Q_SLOTS: void setEnabled(bool); @@ -769,8 +772,10 @@ inline bool QWidget::isEnabled() const inline bool QWidget::isModal() const { return data->window_modality != Qt::NonModal; } +#if QT_DEPRECATED_SINCE(5, 13) inline bool QWidget::isEnabledToTLW() const { return isEnabled(); } +#endif inline int QWidget::minimumWidth() const { return minimumSize().width(); } diff --git a/src/widgets/kernel/qwidget_p.h b/src/widgets/kernel/qwidget_p.h index be45c4c868..1f995278f4 100644 --- a/src/widgets/kernel/qwidget_p.h +++ b/src/widgets/kernel/qwidget_p.h @@ -150,7 +150,7 @@ public: } private: - Q_DISABLE_COPY(QWidgetBackingStoreTracker) + Q_DISABLE_COPY_MOVE(QWidgetBackingStoreTracker) private: QWidgetBackingStore* m_ptr; @@ -399,6 +399,7 @@ public: void setUpdatesEnabled_helper(bool ); + bool updateBrushOrigin(QPainter *, const QBrush &brush) const; void paintBackground(QPainter *, const QRegion &, int flags = DrawAsRoot) const; bool isAboutToShow() const; QRegion prepareToRender(const QRegion ®ion, QWidget::RenderFlags renderFlags); diff --git a/src/widgets/kernel/qwidgetbackingstore_p.h b/src/widgets/kernel/qwidgetbackingstore_p.h index 53ccda850a..41469a04bb 100644 --- a/src/widgets/kernel/qwidgetbackingstore_p.h +++ b/src/widgets/kernel/qwidgetbackingstore_p.h @@ -305,7 +305,7 @@ private: friend class QWidget; friend class QBackingStore; - Q_DISABLE_COPY(QWidgetBackingStore) + Q_DISABLE_COPY_MOVE(QWidgetBackingStore) }; QT_END_NAMESPACE diff --git a/src/widgets/statemachine/qbasickeyeventtransition_p.h b/src/widgets/statemachine/qbasickeyeventtransition_p.h index 5007b79739..7e1b978bba 100644 --- a/src/widgets/statemachine/qbasickeyeventtransition_p.h +++ b/src/widgets/statemachine/qbasickeyeventtransition_p.h @@ -84,7 +84,7 @@ protected: void onTransition(QEvent *) override; private: - Q_DISABLE_COPY(QBasicKeyEventTransition) + Q_DISABLE_COPY_MOVE(QBasicKeyEventTransition) Q_DECLARE_PRIVATE(QBasicKeyEventTransition) }; diff --git a/src/widgets/statemachine/qbasicmouseeventtransition_p.h b/src/widgets/statemachine/qbasicmouseeventtransition_p.h index 93d2a5ec61..132e223535 100644 --- a/src/widgets/statemachine/qbasicmouseeventtransition_p.h +++ b/src/widgets/statemachine/qbasicmouseeventtransition_p.h @@ -87,7 +87,7 @@ protected: void onTransition(QEvent *) override; private: - Q_DISABLE_COPY(QBasicMouseEventTransition) + Q_DISABLE_COPY_MOVE(QBasicMouseEventTransition) Q_DECLARE_PRIVATE(QBasicMouseEventTransition) }; diff --git a/src/widgets/styles/qcommonstyle.cpp b/src/widgets/styles/qcommonstyle.cpp index 10dfad2754..fc48a8ca26 100644 --- a/src/widgets/styles/qcommonstyle.cpp +++ b/src/widgets/styles/qcommonstyle.cpp @@ -100,6 +100,9 @@ #if QT_CONFIG(wizard) #include <qwizard.h> #endif +#if QT_CONFIG(filedialog) +#include <qsidebar_p.h> +#endif #include <qfileinfo.h> #include <qdir.h> #if QT_CONFIG(settings) @@ -3071,7 +3074,7 @@ QRect QCommonStyle::subElementRect(SubElement sr, const QStyleOption *opt, } d->cachedOption = new QStyleOptionViewItem(*vopt); } - if (sr == SE_ViewItemCheckIndicator) + if (sr == SE_ItemViewItemCheckIndicator) r = d->checkRect; else if (sr == SE_ItemViewItemDecoration) r = d->decorationRect; @@ -4293,8 +4296,10 @@ QRect QCommonStyle::subControlRect(ComplexControl cc, const QStyleOptionComplex int topMargin = 0; int topHeight = 0; int verticalAlignment = proxy()->styleHint(SH_GroupBox_TextLabelVerticalAlignment, groupBox, widget); - if (groupBox->text.size() || (groupBox->subControls & QStyle::SC_GroupBoxCheckBox)) { - topHeight = groupBox->fontMetrics.height(); + bool hasCheckBox = groupBox->subControls & QStyle::SC_GroupBoxCheckBox; + if (groupBox->text.size() || hasCheckBox) { + int checkBoxHeight = hasCheckBox ? proxy()->pixelMetric(PM_IndicatorHeight, groupBox, widget) : 0; + topHeight = qMax(groupBox->fontMetrics.height(), checkBoxHeight); if (verticalAlignment & Qt::AlignVCenter) topMargin = topHeight / 2; else if (verticalAlignment & Qt::AlignTop) @@ -4319,20 +4324,24 @@ QRect QCommonStyle::subControlRect(ComplexControl cc, const QStyleOptionComplex case SC_GroupBoxCheckBox: case SC_GroupBoxLabel: { QFontMetrics fontMetrics = groupBox->fontMetrics; - int h = fontMetrics.height(); + int th = fontMetrics.height(); int tw = fontMetrics.size(Qt::TextShowMnemonic, groupBox->text + QLatin1Char(' ')).width(); int marg = (groupBox->features & QStyleOptionFrame::Flat) ? 0 : 8; ret = groupBox->rect.adjusted(marg, 0, -marg, 0); - ret.setHeight(h); int indicatorWidth = proxy()->pixelMetric(PM_IndicatorWidth, opt, widget); + int indicatorHeight = proxy()->pixelMetric(PM_IndicatorHeight, opt, widget); int indicatorSpace = proxy()->pixelMetric(PM_CheckBoxLabelSpacing, opt, widget) - 1; bool hasCheckBox = groupBox->subControls & QStyle::SC_GroupBoxCheckBox; - int checkBoxSize = hasCheckBox ? (indicatorWidth + indicatorSpace) : 0; + int checkBoxWidth = hasCheckBox ? (indicatorWidth + indicatorSpace) : 0; + int checkBoxHeight = hasCheckBox ? indicatorHeight : 0; + + int h = qMax(th, checkBoxHeight); + ret.setHeight(h); // Adjusted rect for label + indicatorWidth + indicatorSpace QRect totalRect = alignedRect(groupBox->direction, groupBox->textAlignment, - QSize(tw + checkBoxSize, h), ret); + QSize(tw + checkBoxWidth, h), ret); // Adjust totalRect if checkbox is set if (hasCheckBox) { @@ -4340,15 +4349,14 @@ QRect QCommonStyle::subControlRect(ComplexControl cc, const QStyleOptionComplex int left = 0; // Adjust for check box if (sc == SC_GroupBoxCheckBox) { - int indicatorHeight = proxy()->pixelMetric(PM_IndicatorHeight, opt, widget); left = ltr ? totalRect.left() : (totalRect.right() - indicatorWidth); - int top = totalRect.top() + qMax(0, fontMetrics.height() - indicatorHeight) / 2; + int top = totalRect.top() + (h - checkBoxHeight) / 2; totalRect.setRect(left, top, indicatorWidth, indicatorHeight); // Adjust for label } else { - left = ltr ? (totalRect.left() + checkBoxSize - 2) : totalRect.left(); - totalRect.setRect(left, totalRect.top(), - totalRect.width() - checkBoxSize, totalRect.height()); + left = ltr ? (totalRect.left() + checkBoxWidth - 2) : totalRect.left(); + int top = totalRect.top() + (h - th) / 2; + totalRect.setRect(left, top, totalRect.width() - checkBoxWidth, th); } } ret = totalRect; @@ -4724,9 +4732,16 @@ int QCommonStyle::pixelMetric(PixelMetric m, const QStyleOption *opt, const QWid break; case PM_TabBarIconSize: - case PM_ListViewIconSize: ret = proxy()->pixelMetric(PM_SmallIconSize, opt, widget); break; + case PM_ListViewIconSize: +#if QT_CONFIG(filedialog) + if (qobject_cast<const QSidebar *>(widget)) + ret = int(QStyleHelper::dpiScaled(24.)); + else +#endif + ret = proxy()->pixelMetric(PM_SmallIconSize, opt, widget); + break; case PM_ButtonIconSize: case PM_SmallIconSize: @@ -4906,8 +4921,8 @@ QSize QCommonStyle::sizeFromContents(ContentsType ct, const QStyleOption *opt, break; #if QT_CONFIG(groupbox) case CT_GroupBox: - if (const QGroupBox *grb = static_cast<const QGroupBox *>(widget)) - sz += QSize(!grb->isFlat() ? 16 : 0, 0); + if (const QStyleOptionGroupBox *styleOpt = qstyleoption_cast<const QStyleOptionGroupBox *>(opt)) + sz += QSize(styleOpt->features.testFlag(QStyleOptionFrame::Flat) ? 0 : 16, 0); break; #endif // QT_CONFIG(groupbox) case CT_MdiControls: diff --git a/src/widgets/styles/qdrawutil.cpp b/src/widgets/styles/qdrawutil.cpp index 299dbb9f82..d30b43a679 100644 --- a/src/widgets/styles/qdrawutil.cpp +++ b/src/widgets/styles/qdrawutil.cpp @@ -51,7 +51,7 @@ QT_BEGIN_NAMESPACE namespace { class PainterStateGuard { - Q_DISABLE_COPY(PainterStateGuard) + Q_DISABLE_COPY_MOVE(PainterStateGuard) public: explicit PainterStateGuard(QPainter *p) : m_painter(p) {} ~PainterStateGuard() diff --git a/src/widgets/styles/qfusionstyle.cpp b/src/widgets/styles/qfusionstyle.cpp index c565932889..85c7a35a72 100644 --- a/src/widgets/styles/qfusionstyle.cpp +++ b/src/widgets/styles/qfusionstyle.cpp @@ -3225,7 +3225,7 @@ QSize QFusionStyle::sizeFromContents(ContentsType type, const QStyleOption *opti QFont fontBold = menuItem->font; fontBold.setBold(true); QFontMetrics fmBold(fontBold); - w += fmBold.width(menuItem->text) - fm.horizontalAdvance(menuItem->text); + w += fmBold.horizontalAdvance(menuItem->text) - fm.horizontalAdvance(menuItem->text); } const int checkcol = qMax<int>(maxpmw, QStyleHelper::dpiScaled(QFusionStylePrivate::menuCheckMarkWidth)); // Windows always shows a check column w += checkcol; diff --git a/src/widgets/styles/qstyle.h b/src/widgets/styles/qstyle.h index 9192dae864..8256f908db 100644 --- a/src/widgets/styles/qstyle.h +++ b/src/widgets/styles/qstyle.h @@ -308,8 +308,8 @@ public: SE_TabWidgetLeftCorner, SE_TabWidgetRightCorner, - SE_ViewItemCheckIndicator, // ### Qt 6: remove - SE_ItemViewItemCheckIndicator = SE_ViewItemCheckIndicator, + SE_ItemViewItemCheckIndicator, + SE_ViewItemCheckIndicator = SE_ItemViewItemCheckIndicator, // ### Qt 6: remove SE_TabBarTearIndicator, SE_TabBarTearIndicatorLeft = SE_TabBarTearIndicator, diff --git a/src/widgets/styles/qstylesheetstyle.cpp b/src/widgets/styles/qstylesheetstyle.cpp index 96c6fdf2e2..5ed7195b60 100644 --- a/src/widgets/styles/qstylesheetstyle.cpp +++ b/src/widgets/styles/qstylesheetstyle.cpp @@ -44,6 +44,7 @@ #include "private/qcssutil_p.h" #include <qdebug.h> +#include <qdir.h> #include <qapplication.h> #if QT_CONFIG(menu) #include <qmenu.h> @@ -957,8 +958,10 @@ QRenderRule::QRenderRule(const QVector<Declaration> &declarations, const QObject origin = Origin_Padding; Origin clip = Origin_Border; if (v.extractBackground(&brush, &uri, &repeat, &alignment, &origin, &attachment, &clip)) { - bg = new QStyleSheetBackgroundData(brush, QStyleSheetStyle::loadPixmap(uri, object), - repeat, alignment, origin, attachment, clip); + QPixmap pixmap = QStyleSheetStyle::loadPixmap(uri, object); + if (!uri.isEmpty() && pixmap.isNull()) + qWarning("Could not create pixmap from %s", qPrintable(QDir::toNativeSeparators(uri))); + bg = new QStyleSheetBackgroundData(brush, pixmap, repeat, alignment, origin, attachment, clip); } QBrush sfg, fg; @@ -3243,8 +3246,8 @@ void QStyleSheetStyle::drawComplexControl(ComplexControl cc, const QStyleOptionC #if QT_CONFIG(scrollbar) case CC_ScrollBar: if (const QStyleOptionSlider *sb = qstyleoption_cast<const QStyleOptionSlider *>(opt)) { - QStyleOptionSlider sbOpt(*sb); if (!rule.hasDrawable()) { + QStyleOptionSlider sbOpt(*sb); sbOpt.rect = rule.borderRect(opt->rect); rule.drawBackgroundImage(p, opt->rect); baseStyle()->drawComplexControl(cc, &sbOpt, p, w); @@ -5079,21 +5082,27 @@ QSize QStyleSheetStyle::sizeFromContents(ContentsType ct, const QStyleOption *op QRenderRule subRule = renderRule(w, opt, pe); if ((pe == PseudoElement_MenuSeparator) && subRule.hasContentsSize()) { return QSize(sz.width(), subRule.size().height()); - } else if ((pe == PseudoElement_Item) && (subRule.hasBox() || subRule.hasBorder())) { - int width = csz.width(); + } + if ((pe == PseudoElement_Item) && (subRule.hasBox() || subRule.hasBorder() || subRule.hasFont)) { + QSize sz(csz); if (mi->text.contains(QLatin1Char('\t'))) - width += 12; //as in QCommonStyle + sz.rwidth() += 12; //as in QCommonStyle bool checkable = mi->checkType != QStyleOptionMenuItem::NotCheckable; if (checkable) { QRenderRule subSubRule = renderRule(w, opt, PseudoElement_MenuCheckMark); QRect checkmarkRect = positionRect(w, subRule, subSubRule, PseudoElement_MenuCheckMark, opt->rect, opt->direction); - width += checkmarkRect.width(); + sz.rwidth() += checkmarkRect.width(); } if (!mi->icon.isNull()) { QPixmap pixmap = mi->icon.pixmap(pixelMetric(PM_SmallIconSize)); - width += pixmap.width(); + sz.rwidth() += pixmap.width(); + } + if (subRule.hasFont) { + QFontMetrics fm(subRule.font); + const QRect r = fm.boundingRect(QRect(), Qt::TextSingleLine | Qt::TextShowMnemonic, mi->text); + sz = sz.expandedTo(r.size()); } - return subRule.boxSize(subRule.adjustSize(QSize(width, csz.height()))); + return subRule.boxSize(subRule.adjustSize(sz)); } } break; @@ -5764,11 +5773,10 @@ QRect QStyleSheetStyle::subElementRect(SubElement se, const QStyleOption *opt, c case SE_PushButtonContents: case SE_PushButtonFocusRect: if (const QStyleOptionButton *btn = qstyleoption_cast<const QStyleOptionButton *>(opt)) { - QStyleOptionButton btnOpt(*btn); if (rule.hasBox() || !rule.hasNativeBorder()) return visualRect(opt->direction, opt->rect, rule.contentsRect(opt->rect)); - return rule.baseStyleCanDraw() ? baseStyle()->subElementRect(se, &btnOpt, w) - : QWindowsStyle::subElementRect(se, &btnOpt, w); + return rule.baseStyleCanDraw() ? baseStyle()->subElementRect(se, btn, w) + : QWindowsStyle::subElementRect(se, btn, w); } break; @@ -5823,7 +5831,7 @@ QRect QStyleSheetStyle::subElementRect(SubElement se, const QStyleOption *opt, c return ParentStyle::subElementRect(se, opt, w); #if QT_CONFIG(itemviews) - case SE_ViewItemCheckIndicator: + case SE_ItemViewItemCheckIndicator: if (!qstyleoption_cast<const QStyleOptionViewItem *>(opt)) { return subElementRect(SE_CheckBoxIndicator, opt, w); } diff --git a/src/widgets/styles/qstylesheetstyle_p.h b/src/widgets/styles/qstylesheetstyle_p.h index d4edb83525..9c4b87fc32 100644 --- a/src/widgets/styles/qstylesheetstyle_p.h +++ b/src/widgets/styles/qstylesheetstyle_p.h @@ -173,7 +173,7 @@ public: static int numinstances; private: - Q_DISABLE_COPY(QStyleSheetStyle) + Q_DISABLE_COPY_MOVE(QStyleSheetStyle) Q_DECLARE_PRIVATE(QStyleSheetStyle) }; diff --git a/src/widgets/styles/qwindowsstyle_p.h b/src/widgets/styles/qwindowsstyle_p.h index 7993b9f1c6..47816ff651 100644 --- a/src/widgets/styles/qwindowsstyle_p.h +++ b/src/widgets/styles/qwindowsstyle_p.h @@ -102,7 +102,7 @@ protected: QWindowsStyle(QWindowsStylePrivate &dd); private: - Q_DISABLE_COPY(QWindowsStyle) + Q_DISABLE_COPY_MOVE(QWindowsStyle) Q_DECLARE_PRIVATE(QWindowsStyle) }; diff --git a/src/widgets/widgets/qabstractscrollarea.cpp b/src/widgets/widgets/qabstractscrollarea.cpp index 598d173144..fd5d7d8069 100644 --- a/src/widgets/widgets/qabstractscrollarea.cpp +++ b/src/widgets/widgets/qabstractscrollarea.cpp @@ -1604,8 +1604,10 @@ QSize QAbstractScrollArea::sizeHint() const if (!d->sizeHint.isValid() || d->sizeAdjustPolicy == QAbstractScrollArea::AdjustToContents) { const int f = 2 * d->frameWidth; const QSize frame( f, f ); - const QSize scrollbars(d->vbarpolicy == Qt::ScrollBarAlwaysOn ? d->vbar->sizeHint().width() : 0, - d->hbarpolicy == Qt::ScrollBarAlwaysOn ? d->hbar->sizeHint().height() : 0); + const bool vbarHidden = d->vbar->isHidden() || d->vbarpolicy == Qt::ScrollBarAlwaysOff; + const bool hbarHidden = d->hbar->isHidden() || d->hbarpolicy == Qt::ScrollBarAlwaysOff; + const QSize scrollbars(vbarHidden ? 0 : d->vbar->sizeHint().width(), + hbarHidden ? 0 : d->hbar->sizeHint().height()); d->sizeHint = frame + scrollbars + viewportSizeHint(); } return d->sizeHint; diff --git a/src/widgets/widgets/qcalendarwidget.cpp b/src/widgets/widgets/qcalendarwidget.cpp index 4946969360..0553972591 100644 --- a/src/widgets/widgets/qcalendarwidget.cpp +++ b/src/widgets/widgets/qcalendarwidget.cpp @@ -1178,9 +1178,9 @@ QVariant QCalendarModel::data(const QModelIndex &index, int role) const } QTextCharFormat fmt = formatForCell(row, column); - if (role == Qt::BackgroundColorRole) + if (role == Qt::BackgroundRole) return fmt.background().color(); - if (role == Qt::TextColorRole) + if (role == Qt::ForegroundRole) return fmt.foreground().color(); if (role == Qt::FontRole) return fmt.font(); diff --git a/src/widgets/widgets/qcombobox.cpp b/src/widgets/widgets/qcombobox.cpp index e20a0892b4..645b1a8c9e 100644 --- a/src/widgets/widgets/qcombobox.cpp +++ b/src/widgets/widgets/qcombobox.cpp @@ -1941,12 +1941,15 @@ const QValidator *QComboBox::validator() const performs case insensitive inline completion is automatically created. \note The completer is removed when the \l editable property becomes \c false. + Setting a completer on a QComboBox that is not editable will be ignored. */ void QComboBox::setCompleter(QCompleter *c) { Q_D(QComboBox); - if (!d->lineEdit) + if (!d->lineEdit) { + qWarning("Setting a QCompleter on non-editable QComboBox is not allowed."); return; + } d->lineEdit->setCompleter(c); if (c) { connect(c, SIGNAL(activated(QModelIndex)), this, SLOT(_q_completerActivated(QModelIndex))); diff --git a/src/widgets/widgets/qcommandlinkbutton.h b/src/widgets/widgets/qcommandlinkbutton.h index 2d01d63df8..3d2dd5784d 100644 --- a/src/widgets/widgets/qcommandlinkbutton.h +++ b/src/widgets/widgets/qcommandlinkbutton.h @@ -66,10 +66,16 @@ public: QString description() const; void setDescription(const QString &description); + // QTBUG-68722 +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) protected: +#else +public: +#endif QSize sizeHint() const override; int heightForWidth(int) const override; QSize minimumSizeHint() const override; +protected: bool event(QEvent *e) override; void paintEvent(QPaintEvent *) override; diff --git a/src/widgets/widgets/qdockwidget.cpp b/src/widgets/widgets/qdockwidget.cpp index 6c871aae2c..663225ebf3 100644 --- a/src/widgets/widgets/qdockwidget.cpp +++ b/src/widgets/widgets/qdockwidget.cpp @@ -922,7 +922,8 @@ bool QDockWidgetPrivate::mousePressEvent(QMouseEvent *event) initDrag(event->pos(), false); if (state) - state->ctrlDrag = hasFeature(this, QDockWidget::DockWidgetFloatable) && event->modifiers() & Qt::ControlModifier; + state->ctrlDrag = (hasFeature(this, QDockWidget::DockWidgetFloatable) && event->modifiers() & Qt::ControlModifier) || + (!hasFeature(this, QDockWidget::DockWidgetMovable) && q->isFloating()); return true; } @@ -1044,7 +1045,8 @@ void QDockWidgetPrivate::nonClientAreaMouseEvent(QMouseEvent *event) initDrag(event->pos(), true); if (state == 0) break; - state->ctrlDrag = event->modifiers() & Qt::ControlModifier; + state->ctrlDrag = (event->modifiers() & Qt::ControlModifier) || + (!hasFeature(this, QDockWidget::DockWidgetMovable) && q->isFloating()); startDrag(); break; case QEvent::NonClientAreaMouseMove: diff --git a/src/widgets/widgets/qlabel.cpp b/src/widgets/widgets/qlabel.cpp index 60f88df9af..a840bf4ee6 100644 --- a/src/widgets/widgets/qlabel.cpp +++ b/src/widgets/widgets/qlabel.cpp @@ -1098,7 +1098,7 @@ void QLabel::paintEvent(QPaintEvent *) QImage scaledImage = d->cachedimage->scaled(scaledSize, Qt::IgnoreAspectRatio, Qt::SmoothTransformation); - d->scaledpixmap = new QPixmap(QPixmap::fromImage(scaledImage)); + d->scaledpixmap = new QPixmap(QPixmap::fromImage(std::move(scaledImage))); d->scaledpixmap->setDevicePixelRatio(devicePixelRatioF()); } pix = *d->scaledpixmap; diff --git a/src/widgets/widgets/qmainwindow.cpp b/src/widgets/widgets/qmainwindow.cpp index 411b482c11..fae3aebba4 100644 --- a/src/widgets/widgets/qmainwindow.cpp +++ b/src/widgets/widgets/qmainwindow.cpp @@ -851,7 +851,11 @@ void QMainWindow::removeToolBar(QToolBar *toolbar) \sa addToolBar(), addToolBarBreak(), Qt::ToolBarArea */ -Qt::ToolBarArea QMainWindow::toolBarArea(QToolBar *toolbar) const +Qt::ToolBarArea QMainWindow::toolBarArea( +#if QT_VERSION >= QT_VERSION_CHECK(6,0,0) + const +#endif + QToolBar *toolbar) const { return d_func()->layout->toolBarArea(toolbar); } /*! diff --git a/src/widgets/widgets/qmainwindow.h b/src/widgets/widgets/qmainwindow.h index 8f2a192446..85e3f87d77 100644 --- a/src/widgets/widgets/qmainwindow.h +++ b/src/widgets/widgets/qmainwindow.h @@ -158,7 +158,11 @@ public: bool unifiedTitleAndToolBarOnMac() const; - Qt::ToolBarArea toolBarArea(QToolBar *toolbar) const; + Qt::ToolBarArea toolBarArea( +#if QT_VERSION >= QT_VERSION_CHECK(6,0,0) + const +#endif + QToolBar *toolbar) const; bool toolBarBreak(QToolBar *toolbar) const; #endif #if QT_CONFIG(dockwidget) diff --git a/src/widgets/widgets/qmainwindowlayout.cpp b/src/widgets/widgets/qmainwindowlayout.cpp index 053bfbf024..ed054c7e9a 100644 --- a/src/widgets/widgets/qmainwindowlayout.cpp +++ b/src/widgets/widgets/qmainwindowlayout.cpp @@ -1388,7 +1388,7 @@ void QMainWindowLayout::insertToolBar(QToolBar *before, QToolBar *toolbar) invalidate(); } -Qt::ToolBarArea QMainWindowLayout::toolBarArea(QToolBar *toolbar) const +Qt::ToolBarArea QMainWindowLayout::toolBarArea(const QToolBar *toolbar) const { QInternal::DockPosition pos = layoutState.toolBarAreaLayout.findToolBar(toolbar); switch (pos) { diff --git a/src/widgets/widgets/qmainwindowlayout_p.h b/src/widgets/widgets/qmainwindowlayout_p.h index 72cbec2350..a375d856bb 100644 --- a/src/widgets/widgets/qmainwindowlayout_p.h +++ b/src/widgets/widgets/qmainwindowlayout_p.h @@ -475,7 +475,7 @@ public: void addToolBar(Qt::ToolBarArea area, QToolBar *toolbar, bool needAddChildWidget = true); void insertToolBar(QToolBar *before, QToolBar *toolbar); - Qt::ToolBarArea toolBarArea(QToolBar *toolbar) const; + Qt::ToolBarArea toolBarArea(const QToolBar *toolbar) const; bool toolBarBreak(QToolBar *toolBar) const; void getStyleOptionInfo(QStyleOptionToolBar *option, QToolBar *toolBar) const; void removeToolBar(QToolBar *toolbar); diff --git a/src/widgets/widgets/qmdiarea.cpp b/src/widgets/widgets/qmdiarea.cpp index f32cd26478..104cbdbcda 100644 --- a/src/widgets/widgets/qmdiarea.cpp +++ b/src/widgets/widgets/qmdiarea.cpp @@ -954,14 +954,6 @@ void QMdiAreaPrivate::rearrange(Rearranger *rearranger) } } - if (active && rearranger->type() == Rearranger::RegularTiler && !tileCalledFromResizeEvent) { - // Move active window in front if necessary. That's the case if we - // have any windows with staysOnTopHint set. - int indexToActive = widgets.indexOf((QWidget *)active); - if (indexToActive > 0) - widgets.move(indexToActive, 0); - } - QRect domain = viewport->rect(); if (rearranger->type() == Rearranger::RegularTiler && !widgets.isEmpty()) domain = resizeToMinimumTileSize(minSubWindowSize, widgets.count()); @@ -1296,7 +1288,11 @@ QRect QMdiAreaPrivate::resizeToMinimumTileSize(const QSize &minSubWindowSize, in minAreaHeight += 2 * frame; } const QSize diff = QSize(minAreaWidth, minAreaHeight).expandedTo(q->size()) - q->size(); - topLevel->resize(topLevel->size() + diff); + // Only resize topLevel widget if scroll bars are disabled. + if (hbarpolicy == Qt::ScrollBarAlwaysOff) + topLevel->resize(topLevel->size().width() + diff.width(), topLevel->size().height()); + if (vbarpolicy == Qt::ScrollBarAlwaysOff) + topLevel->resize(topLevel->size().width(), topLevel->size().height() + diff.height()); } QRect domain = viewport->rect(); @@ -2640,7 +2636,11 @@ bool QMdiArea::eventFilter(QObject *object, QEvent *event) #endif // QT_CONFIG(tabbar) Q_FALLTHROUGH(); case QEvent::Hide: - d->isSubWindowsTiled = false; + // Do not reset the isSubWindowsTiled flag if the event is a spontaneous system window event. + // This ensures that tiling will be performed during the resizeEvent after an application + // window minimize (hide) and then restore (show). + if (!event->spontaneous()) + d->isSubWindowsTiled = false; break; #if QT_CONFIG(rubberband) case QEvent::Close: diff --git a/src/widgets/widgets/qmenu.cpp b/src/widgets/widgets/qmenu.cpp index c79e88f094..bf1102434c 100644 --- a/src/widgets/widgets/qmenu.cpp +++ b/src/widgets/widgets/qmenu.cpp @@ -1800,21 +1800,6 @@ QAction *QMenu::addAction(const QString &text, const QObject *receiver, const ch return action; } -/*!\fn template<typename PointerToMemberFunction> QAction *QMenu::addAction(const QString &text, const QObject *receiver, PointerToMemberFunction method, const QKeySequence &shortcut = 0) - - \since 5.6 - - \overload - - This convenience function creates a new action with the text \a - text and an optional shortcut \a shortcut. The action's - \l{QAction::triggered()}{triggered()} signal is connected to the - \a method of the \a receiver. The function adds the newly created - action to the menu's list of actions and returns it. - - QMenu takes ownership of the returned QAction. -*/ - /*!\fn template<typename Functor> QAction *QMenu::addAction(const QString &text, Functor functor, const QKeySequence &shortcut = 0) \since 5.6 @@ -1839,25 +1824,11 @@ QAction *QMenu::addAction(const QString &text, const QObject *receiver, const ch This convenience function creates a new action with the text \a text and an optional shortcut \a shortcut. The action's \l{QAction::triggered()}{triggered()} signal is connected to the - \a functor. The function adds the newly created - action to the menu's list of actions and returns it. + \a functor. The functor can be a pointer to a member function of + the \a context object. The newly created action is added to the + menu's list of actions and a pointer to it is returned. - If \a context is destroyed, the functor will not be called. - - QMenu takes ownership of the returned QAction. -*/ - -/*!\fn template<typename PointerToMemberFunction> QAction *QMenu::addAction(const QIcon &icon, const QString &text, const QObject *receiver, PointerToMemberFunction method, const QKeySequence &shortcut = 0) - - \since 5.6 - - \overload - - This convenience function creates a new action with an \a icon - and some \a text and an optional shortcut \a shortcut. The action's - \l{QAction::triggered()}{triggered()} signal is connected to the - \a method of the \a receiver. The function adds the newly created - action to the menu's list of actions and returns it. + If the \a context object is destroyed, the functor will not be called. QMenu takes ownership of the returned QAction. */ @@ -1886,8 +1857,9 @@ QAction *QMenu::addAction(const QString &text, const QObject *receiver, const ch This convenience function creates a new action with an \a icon and some \a text and an optional shortcut \a shortcut. The action's \l{QAction::triggered()}{triggered()} signal is connected to the - \a functor. The function adds the newly created - action to the menu's list of actions and returns it. + \a functor. The \a functor can be a pointer to a member function + of the \a context object. The newly created action is added to the + menu's list of actions and a pointer to it is returned. If \a context is destroyed, the functor will not be called. diff --git a/src/widgets/widgets/qmenu.h b/src/widgets/widgets/qmenu.h index 628f818b5e..84ab9e027a 100644 --- a/src/widgets/widgets/qmenu.h +++ b/src/widgets/widgets/qmenu.h @@ -82,14 +82,10 @@ public: QAction *addAction(const QIcon &icon, const QString &text, const QObject *receiver, const char* member, const QKeySequence &shortcut = 0); #ifdef Q_CLANG_QDOC - template<typename PointerToMemberFunction> - QAction *addAction(const QString &text, const QObject *receiver, PointerToMemberFunction method, const QKeySequence &shortcut = 0); template<typename Functor> QAction *addAction(const QString &text, Functor functor, const QKeySequence &shortcut = 0); template<typename Functor> QAction *addAction(const QString &text, const QObject *context, Functor functor, const QKeySequence &shortcut = 0); - template<typename PointerToMemberFunction> - QAction *addAction(const QIcon &icon, const QString &text, const QObject *receiver, PointerToMemberFunction method, const QKeySequence &shortcut = 0); template<typename Functor> QAction *addAction(const QIcon &icon, const QString &text, Functor functor, const QKeySequence &shortcut = 0); template<typename Functor> diff --git a/src/widgets/widgets/qmenu_p.h b/src/widgets/widgets/qmenu_p.h index 721a35bf90..c39dd33b08 100644 --- a/src/widgets/widgets/qmenu_p.h +++ b/src/widgets/widgets/qmenu_p.h @@ -115,7 +115,7 @@ private: class QMenuSloppyState { - Q_DISABLE_COPY(QMenuSloppyState) + Q_DISABLE_COPY_MOVE(QMenuSloppyState) public: QMenuSloppyState() : m_enabled(false) diff --git a/src/widgets/widgets/qplaintextedit.cpp b/src/widgets/widgets/qplaintextedit.cpp index d6f6a364a8..b498d5fe7a 100644 --- a/src/widgets/widgets/qplaintextedit.cpp +++ b/src/widgets/widgets/qplaintextedit.cpp @@ -1614,7 +1614,7 @@ void QPlainTextEdit::timerEvent(QTimerEvent *e) const QPoint globalPos = QCursor::pos(); pos = d->viewport->mapFromGlobal(globalPos); QMouseEvent ev(QEvent::MouseMove, pos, d->viewport->mapTo(d->viewport->topLevelWidget(), pos), globalPos, - Qt::LeftButton, Qt::LeftButton, Qt::NoModifier); + Qt::LeftButton, Qt::LeftButton, QGuiApplication::keyboardModifiers()); mouseMoveEvent(&ev); } int deltaY = qMax(pos.y() - visible.top(), visible.bottom() - pos.y()) - visible.height(); @@ -2891,6 +2891,7 @@ void QPlainTextEdit::setCenterOnScroll(bool enabled) if (enabled == d->centerOnScroll) return; d->centerOnScroll = enabled; + d->_q_adjustScrollbars(); } @@ -2928,6 +2929,27 @@ bool QPlainTextEdit::find(const QRegExp &exp, QTextDocument::FindFlags options) #endif /*! + \fn bool QTextEdit::find(const QRegularExpression &exp, QTextDocument::FindFlags options) + + \since 5.13 + \overload + + Finds the next occurrence, matching the regular expression, \a exp, using the given + \a options. The QTextDocument::FindCaseSensitively option is ignored for this overload, + use QRegularExpression::CaseInsensitiveOption instead. + + Returns \c true if a match was found and changes the cursor to select the match; + otherwise returns \c false. +*/ +#if QT_CONFIG(regularexpression) +bool QPlainTextEdit::find(const QRegularExpression &exp, QTextDocument::FindFlags options) +{ + Q_D(QPlainTextEdit); + return d->control->find(exp, options); +} +#endif + +/*! \fn void QPlainTextEdit::copyAvailable(bool yes) This signal is emitted when text is selected or de-selected in the diff --git a/src/widgets/widgets/qplaintextedit.h b/src/widgets/widgets/qplaintextedit.h index e5ac4c82b8..a5945d649a 100644 --- a/src/widgets/widgets/qplaintextedit.h +++ b/src/widgets/widgets/qplaintextedit.h @@ -60,6 +60,7 @@ class QMenu; class QPlainTextEditPrivate; class QMimeData; class QPagedPaintDevice; +class QRegularExpression; class Q_WIDGETS_EXPORT QPlainTextEdit : public QAbstractScrollArea { @@ -149,6 +150,9 @@ public: #ifndef QT_NO_REGEXP bool find(const QRegExp &exp, QTextDocument::FindFlags options = QTextDocument::FindFlags()); #endif +#if QT_CONFIG(regularexpression) + bool find(const QRegularExpression &exp, QTextDocument::FindFlags options = QTextDocument::FindFlags()); +#endif inline QString toPlainText() const { return document()->toPlainText(); } diff --git a/src/widgets/widgets/qtextbrowser.cpp b/src/widgets/widgets/qtextbrowser.cpp index 09541bb53b..bb9a4fed91 100644 --- a/src/widgets/widgets/qtextbrowser.cpp +++ b/src/widgets/widgets/qtextbrowser.cpp @@ -276,7 +276,7 @@ void QTextBrowserPrivate::setSource(const QUrl &url) Q_Q(QTextBrowser); #ifndef QT_NO_CURSOR if (q->isVisible()) - QApplication::setOverrideCursor(Qt::WaitCursor); + QGuiApplication::setOverrideCursor(Qt::WaitCursor); #endif textOrSourceChanged = true; @@ -310,7 +310,7 @@ void QTextBrowserPrivate::setSource(const QUrl &url) const QStringRef firstTag = txt.leftRef(txt.indexOf(QLatin1Char('>')) + 1); if (firstTag.startsWith(QLatin1String("<qt")) && firstTag.contains(QLatin1String("type")) && firstTag.contains(QLatin1String("detail"))) { #ifndef QT_NO_CURSOR - QApplication::restoreOverrideCursor(); + QGuiApplication::restoreOverrideCursor(); #endif #if QT_CONFIG(whatsthis) QWhatsThis::showText(QCursor::pos(), txt, q); @@ -355,7 +355,7 @@ void QTextBrowserPrivate::setSource(const QUrl &url) #ifndef QT_NO_CURSOR if (q->isVisible()) - QApplication::restoreOverrideCursor(); + QGuiApplication::restoreOverrideCursor(); #endif emit q->sourceChanged(url); } diff --git a/src/widgets/widgets/qtextedit.cpp b/src/widgets/widgets/qtextedit.cpp index e3a45680ef..920133d493 100644 --- a/src/widgets/widgets/qtextedit.cpp +++ b/src/widgets/widgets/qtextedit.cpp @@ -105,6 +105,14 @@ public: else ed->insertFromMimeData(source); } + QVariant loadResource(int type, const QUrl &name) override { + auto *ed = qobject_cast<QTextEdit *>(parent()); + if (!ed) + return QWidgetTextControl::loadResource(type, name); + + QUrl resolvedName = ed->d_func()->resolveUrl(name); + return ed->loadResource(type, resolvedName); + } }; QTextEditPrivate::QTextEditPrivate() @@ -2534,6 +2542,27 @@ bool QTextEdit::find(const QRegExp &exp, QTextDocument::FindFlags options) #endif /*! + \fn bool QTextEdit::find(const QRegularExpression &exp, QTextDocument::FindFlags options) + + \since 5.13 + \overload + + Finds the next occurrence, matching the regular expression, \a exp, using the given + \a options. The QTextDocument::FindCaseSensitively option is ignored for this overload, + use QRegularExpression::CaseInsensitiveOption instead. + + Returns \c true if a match was found and changes the cursor to select the match; + otherwise returns \c false. +*/ +#if QT_CONFIG(regularexpression) +bool QTextEdit::find(const QRegularExpression &exp, QTextDocument::FindFlags options) +{ + Q_D(QTextEdit); + return d->control->find(exp, options); +} +#endif + +/*! \fn void QTextEdit::copyAvailable(bool yes) This signal is emitted when text is selected or de-selected in the diff --git a/src/widgets/widgets/qtextedit.h b/src/widgets/widgets/qtextedit.h index 51d6c2ccba..3aa23aaace 100644 --- a/src/widgets/widgets/qtextedit.h +++ b/src/widgets/widgets/qtextedit.h @@ -57,6 +57,7 @@ class QMenu; class QTextEditPrivate; class QMimeData; class QPagedPaintDevice; +class QRegularExpression; class Q_WIDGETS_EXPORT QTextEdit : public QAbstractScrollArea { @@ -165,6 +166,9 @@ public: #ifndef QT_NO_REGEXP bool find(const QRegExp &exp, QTextDocument::FindFlags options = QTextDocument::FindFlags()); #endif +#if QT_CONFIG(regularexpression) + bool find(const QRegularExpression &exp, QTextDocument::FindFlags options = QTextDocument::FindFlags()); +#endif QString toPlainText() const; #ifndef QT_NO_TEXTHTMLPARSER diff --git a/src/widgets/widgets/qtoolbar.cpp b/src/widgets/widgets/qtoolbar.cpp index 4af71c126e..1cd30e4d0d 100644 --- a/src/widgets/widgets/qtoolbar.cpp +++ b/src/widgets/widgets/qtoolbar.cpp @@ -799,18 +799,6 @@ QAction *QToolBar::addAction(const QIcon &icon, const QString &text, return action; } -/*!\fn template<typename PointerToMemberFunction> QAction *QToolBar::addAction(const QString &text, const QObject *receiver, PointerToMemberFunction method) - - \since 5.6 - - \overload - - Creates a new action with the given \a text. This action is added to - the end of the toolbar. The action's - \l{QAction::triggered()}{triggered()} signal is connected to the - \a method of the \a receiver. -*/ - /*!\fn template<typename Functor> QAction *QToolBar::addAction(const QString &text, Functor functor) \since 5.6 @@ -829,24 +817,13 @@ QAction *QToolBar::addAction(const QIcon &icon, const QString &text, \overload - Creates a new action with the given \a text. This action is added to - the end of the toolbar. The action's + Creates a new action with the given \a text. This action is added + to the end of the toolbar. The action's \l{QAction::triggered()}{triggered()} signal is connected to the - \a functor. - - If \a context is destroyed, the functor will not be called. -*/ - -/*!\fn template<typename PointerToMemberFunction> QAction *QToolBar::addAction(const QIcon &icon, const QString &text, const QObject *receiver, PointerToMemberFunction method) - - \since 5.6 + \a functor. The \a functor can be a pointer to a member function + in the \a context object. - \overload - - Creates a new action with the given \a icon and \a text. This - action is added to the end of the toolbar. The action's - \l{QAction::triggered()}{triggered()} signal is connected to the - \a method of the \a receiver. + If the \a context object is destroyed, the \a functor will not be called. */ /*!\fn template<typename Functor> QAction *QToolBar::addAction(const QIcon &icon, const QString &text, Functor functor) @@ -870,9 +847,10 @@ QAction *QToolBar::addAction(const QIcon &icon, const QString &text, Creates a new action with the given \a icon and \a text. This action is added to the end of the toolbar. The action's \l{QAction::triggered()}{triggered()} signal is connected to the - \a functor. + \a functor. The \a functor can be a pointer to a member function + of the \a context object. - If \a context is destroyed, the functor will not be called. + If the \a context object is destroyed, the \a functor will not be called. */ /*! diff --git a/src/widgets/widgets/qtoolbar.h b/src/widgets/widgets/qtoolbar.h index 4ae83190d1..0c434e8d1d 100644 --- a/src/widgets/widgets/qtoolbar.h +++ b/src/widgets/widgets/qtoolbar.h @@ -99,15 +99,11 @@ public: QAction *addAction(const QString &text, const QObject *receiver, const char* member); QAction *addAction(const QIcon &icon, const QString &text, const QObject *receiver, const char* member); -#ifdef Q_QDOC - template<typename PointerToMemberFunction> - QAction *addAction(const QString &text, const QObject *receiver, PointerToMemberFunction method); +#ifdef Q_CLANG_QDOC template<typename Functor> QAction *addAction(const QString &text, Functor functor); template<typename Functor> QAction *addAction(const QString &text, const QObject *context, Functor functor); - template<typename PointerToMemberFunction> - QAction *addAction(const QIcon &icon, const QString &text, const QObject *receiver, PointerToMemberFunction method); template<typename Functor> QAction *addAction(const QIcon &icon, const QString &text, Functor functor); template<typename Functor> @@ -149,7 +145,7 @@ public: connect(result, &QAction::triggered, slot); return result; } -#endif // !Q_QDOC +#endif // !Q_CLANG_QDOC QAction *addSeparator(); QAction *insertSeparator(QAction *before); diff --git a/src/widgets/widgets/qtoolbararealayout.cpp b/src/widgets/widgets/qtoolbararealayout.cpp index edf497111b..884eface3c 100644 --- a/src/widgets/widgets/qtoolbararealayout.cpp +++ b/src/widgets/widgets/qtoolbararealayout.cpp @@ -789,7 +789,7 @@ void QToolBarAreaLayout::deleteAllLayoutItems() } } -QInternal::DockPosition QToolBarAreaLayout::findToolBar(QToolBar *toolBar) const +QInternal::DockPosition QToolBarAreaLayout::findToolBar(const QToolBar *toolBar) const { for (int i = 0; i < QInternal::DockCount; ++i) { const QToolBarAreaLayoutInfo &dock = docks[i]; diff --git a/src/widgets/widgets/qtoolbararealayout_p.h b/src/widgets/widgets/qtoolbararealayout_p.h index dffbab1f21..17747ef29b 100644 --- a/src/widgets/widgets/qtoolbararealayout_p.h +++ b/src/widgets/widgets/qtoolbararealayout_p.h @@ -196,7 +196,7 @@ public: void insertItem(QInternal::DockPosition pos, QLayoutItem *item); void insertItem(QToolBar *before, QLayoutItem *item); - QInternal::DockPosition findToolBar(QToolBar *toolBar) const; + QInternal::DockPosition findToolBar(const QToolBar *toolBar) const; bool toolBarBreak(QToolBar *toolBar) const; void getStyleOptionInfo(QStyleOptionToolBar *option, QToolBar *toolBar) const; diff --git a/src/widgets/widgets/qwidgetresizehandler_p.h b/src/widgets/widgets/qwidgetresizehandler_p.h index b87bbd6229..89bc759cc2 100644 --- a/src/widgets/widgets/qwidgetresizehandler_p.h +++ b/src/widgets/widgets/qwidgetresizehandler_p.h @@ -100,7 +100,7 @@ protected: void keyPressEvent(QKeyEvent *e); private: - Q_DISABLE_COPY(QWidgetResizeHandler) + Q_DISABLE_COPY_MOVE(QWidgetResizeHandler) enum MousePosition { Nowhere, diff --git a/src/widgets/widgets/qwidgettextcontrol.cpp b/src/widgets/widgets/qwidgettextcontrol.cpp index e179ea3b40..711c4bfd2a 100644 --- a/src/widgets/widgets/qwidgettextcontrol.cpp +++ b/src/widgets/widgets/qwidgettextcontrol.cpp @@ -57,9 +57,6 @@ #include <qtimer.h> #include "private/qtextdocumentlayout_p.h" #include "private/qabstracttextdocumentlayout_p.h" -#if QT_CONFIG(textedit) -#include "private/qtextedit_p.h" -#endif #include "qtextdocument.h" #include "private/qtextdocument_p.h" #include "qtextlist.h" @@ -218,6 +215,14 @@ bool QWidgetTextControlPrivate::cursorMoveKeyEvent(QKeyEvent *e) else if (e == QKeySequence::SelectPreviousLine) { op = QTextCursor::Up; mode = QTextCursor::KeepAnchor; + { + QTextBlock block = cursor.block(); + QTextLine line = currentTextLine(cursor); + if (!block.previous().isValid() + && line.isValid() + && line.lineNumber() == 0) + op = QTextCursor::Start; + } } else if (e == QKeySequence::SelectNextLine) { op = QTextCursor::Down; @@ -1357,15 +1362,8 @@ process: QVariant QWidgetTextControl::loadResource(int type, const QUrl &name) { -#if !QT_CONFIG(textedit) Q_UNUSED(type); Q_UNUSED(name); -#else - if (QTextEdit *textEdit = qobject_cast<QTextEdit *>(parent())) { - QUrl resolvedName = textEdit->d_func()->resolveUrl(name); - return textEdit->loadResource(type, resolvedName); - } -#endif return QVariant(); } @@ -3094,6 +3092,19 @@ bool QWidgetTextControl::find(const QRegExp &exp, QTextDocument::FindFlags optio } #endif +#if QT_CONFIG(regularexpression) +bool QWidgetTextControl::find(const QRegularExpression &exp, QTextDocument::FindFlags options) +{ + Q_D(QWidgetTextControl); + QTextCursor search = d->doc->find(exp, d->cursor, options); + if (search.isNull()) + return false; + + setTextCursor(search); + return true; +} +#endif + QString QWidgetTextControl::toPlainText() const { return document()->toPlainText(); diff --git a/src/widgets/widgets/qwidgettextcontrol_p.h b/src/widgets/widgets/qwidgettextcontrol_p.h index 4b2acbd934..202ba36454 100644 --- a/src/widgets/widgets/qwidgettextcontrol_p.h +++ b/src/widgets/widgets/qwidgettextcontrol_p.h @@ -80,6 +80,7 @@ class QMenu; class QWidgetTextControlPrivate; class QAbstractScrollArea; class QEvent; +class QRegularExpression; class QTimerEvent; class Q_WIDGETS_EXPORT QWidgetTextControl : public QInputControl @@ -119,6 +120,9 @@ public: #ifndef QT_NO_REGEXP bool find(const QRegExp &exp, QTextDocument::FindFlags options = 0); #endif +#if QT_CONFIG(regularexpression) + bool find(const QRegularExpression &exp, QTextDocument::FindFlags options = 0); +#endif QString toPlainText() const; #ifndef QT_NO_TEXTHTMLPARSER @@ -263,7 +267,7 @@ protected: virtual bool event(QEvent *e) override; private: - Q_DISABLE_COPY(QWidgetTextControl) + Q_DISABLE_COPY_MOVE(QWidgetTextControl) Q_PRIVATE_SLOT(d_func(), void _q_updateCurrentCharFormatAndSelection()) Q_PRIVATE_SLOT(d_func(), void _q_emitCursorPosChanged(const QTextCursor &)) Q_PRIVATE_SLOT(d_func(), void _q_deleteSelected()) |