diff options
Diffstat (limited to 'src/widgets/graphicsview/qgraphicsitem.cpp')
-rw-r--r-- | src/widgets/graphicsview/qgraphicsitem.cpp | 159 |
1 files changed, 33 insertions, 126 deletions
diff --git a/src/widgets/graphicsview/qgraphicsitem.cpp b/src/widgets/graphicsview/qgraphicsitem.cpp index 69a331a563..17ea830cab 100644 --- a/src/widgets/graphicsview/qgraphicsitem.cpp +++ b/src/widgets/graphicsview/qgraphicsitem.cpp @@ -1,41 +1,5 @@ -/**************************************************************************** -** -** Copyright (C) 2021 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtWidgets module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** 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. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only /*! \class QGraphicsItem @@ -132,7 +96,6 @@ \image graphicsview-parentchild.png - \target Transformations \section1 Transformations QGraphicsItem supports projective transformations in addition to its base @@ -829,6 +792,8 @@ QT_BEGIN_NAMESPACE +QT_IMPL_METATYPE_EXTERN_TAGGED(QGraphicsItem*, QGraphicsItem_ptr) + static inline void _q_adjustRect(QRect *rect) { Q_ASSERT(rect); @@ -939,7 +904,6 @@ QGraphicsItemPrivate::QGraphicsItemPrivate() scenePosDescendants(false), pendingPolish(false), mayHaveChildWithGraphicsEffect(false), - isDeclarativeItem(false), sendParentChangeNotification(false), dirtyChildrenBoundingRect(true), globalStackingOrder(-1), @@ -1071,7 +1035,7 @@ void QGraphicsItemPrivate::setIsMemberOfGroup(bool enabled) Q_Q(QGraphicsItem); isMemberOfGroup = enabled; if (!qgraphicsitem_cast<QGraphicsItemGroup *>(q)) { - for (QGraphicsItem *child : qAsConst(children)) + for (QGraphicsItem *child : std::as_const(children)) child->d_func()->setIsMemberOfGroup(enabled); } } @@ -2210,7 +2174,7 @@ bool QGraphicsItem::isBlockedByModalPanel(QGraphicsItem **blockingPanel) const if (!scene_d->popupWidgets.isEmpty() && scene_d->popupWidgets.first() == this) return false; - for (int i = 0; i < scene_d->modalPanels.count(); ++i) { + for (int i = 0; i < scene_d->modalPanels.size(); ++i) { QGraphicsItem *modalPanel = scene_d->modalPanels.at(i); if (modalPanel->panelModality() == QGraphicsItem::SceneModal) { // Scene modal panels block all non-descendents. @@ -2493,7 +2457,7 @@ void QGraphicsItemPrivate::setVisibleHelper(bool newVisible, bool explicitly, const bool updateChildren = update && !((flags & QGraphicsItem::ItemClipsChildrenToShape || flags & QGraphicsItem::ItemContainsChildrenInShape) && !(flags & QGraphicsItem::ItemHasNoContents)); - for (QGraphicsItem *child : qAsConst(children)) { + for (QGraphicsItem *child : std::as_const(children)) { if (!newVisible || !child->d_ptr->explicitlyHidden) child->d_ptr->setVisibleHelper(newVisible, false, updateChildren, hiddenByPanel); } @@ -2685,7 +2649,7 @@ void QGraphicsItemPrivate::setEnabledHelper(bool newEnabled, bool explicitly, bo if (update) q_ptr->update(); - for (QGraphicsItem *child : qAsConst(children)) { + for (QGraphicsItem *child : std::as_const(children)) { if (!newEnabled || !child->d_ptr->explicitlyDisabled) child->d_ptr->setEnabledHelper(newEnabled, /* explicitly = */ false); } @@ -3126,7 +3090,7 @@ Qt::MouseButtons QGraphicsItem::acceptedMouseButtons() const mouse events to the first item beneath it that does. To disable mouse events for an item (i.e., make it transparent for mouse - events), call setAcceptedMouseButtons(0). + events), call setAcceptedMouseButtons(Qt::NoButton). \sa acceptedMouseButtons(), mousePressEvent() */ @@ -3248,7 +3212,7 @@ bool QGraphicsItem::filtersChildEvents() const \since 4.6 If \a enabled is true, this item is set to filter all events for - all its children (i.e., all events intented for any of its + all its children (i.e., all events intended for any of its children are instead sent to this item); otherwise, if \a enabled is false, this item will only handle its own events. The default value is false. @@ -3290,7 +3254,7 @@ bool QGraphicsItem::handlesChildEvents() const \deprecated If \a enabled is true, this item is set to handle all events for - all its children (i.e., all events intented for any of its + all its children (i.e., all events intended for any of its children are instead sent to this item); otherwise, if \a enabled is false, this item will only handle its own events. The default value is false. @@ -3952,7 +3916,7 @@ void QGraphicsItem::ensureVisible(const QRectF &rect, int xmargin, int ymargin) sceneRect = sceneTransform().mapRect(rect); else sceneRect = sceneBoundingRect(); - for (QGraphicsView *view : qAsConst(d_ptr->scene->d_func()->views)) + for (QGraphicsView *view : std::as_const(d_ptr->scene->d_func()->views)) view->ensureVisible(sceneRect, xmargin, ymargin); } } @@ -4662,7 +4626,7 @@ inline void QGraphicsItemPrivate::sendScenePosChange() if (flags & QGraphicsItem::ItemSendsScenePositionChanges) q->itemChange(QGraphicsItem::ItemScenePositionHasChanged, q->scenePos()); if (scenePosDescendants) { - for (QGraphicsItem *item : qAsConst(scene->d_func()->scenePosItems)) { + for (QGraphicsItem *item : std::as_const(scene->d_func()->scenePosItems)) { if (q->isAncestorOf(item)) item->itemChange(QGraphicsItem::ItemScenePositionHasChanged, item->scenePos()); } @@ -6537,7 +6501,7 @@ void QGraphicsItem::setData(int key, const QVariant &value) } /*! - \fn T qgraphicsitem_cast(QGraphicsItem *item) + \fn template <class T> qgraphicsitem_cast(QGraphicsItem *item) \relates QGraphicsItem \since 4.2 @@ -7118,7 +7082,7 @@ void QGraphicsItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event) selectedItems = d_ptr->scene->selectedItems(); initialPositions = d_ptr->scene->d_func()->movingItemsInitialPositions; if (initialPositions.isEmpty()) { - for (QGraphicsItem *item : qAsConst(selectedItems)) + for (QGraphicsItem *item : std::as_const(selectedItems)) initialPositions[item] = item->pos(); initialPositions[this] = pos(); } @@ -7227,7 +7191,7 @@ void QGraphicsItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) // temporarily removing this item from the selection list. if (d_ptr->selected) { scene->d_func()->selectedItems.remove(this); - for (QGraphicsItem *item : qAsConst(scene->d_func()->selectedItems)) { + for (QGraphicsItem *item : std::as_const(scene->d_func()->selectedItems)) { if (item->isSelected()) { selectionChanged = true; break; @@ -7685,66 +7649,6 @@ void QGraphicsObject::updateMicroFocus() QGraphicsItem::updateMicroFocus(); } -void QGraphicsItemPrivate::children_append(QDeclarativeListProperty<QGraphicsObject> *list, QGraphicsObject *item) -{ - if (item) { - QGraphicsObject *graphicsObject = static_cast<QGraphicsObject *>(list->object); - if (QGraphicsItemPrivate::get(graphicsObject)->sendParentChangeNotification) { - item->setParentItem(graphicsObject); - } else { - QGraphicsItemPrivate::get(item)->setParentItemHelper(graphicsObject, nullptr, nullptr); - } - } -} - -int QGraphicsItemPrivate::children_count(QDeclarativeListProperty<QGraphicsObject> *list) -{ - QGraphicsItemPrivate *d = QGraphicsItemPrivate::get(static_cast<QGraphicsObject *>(list->object)); - return d->children.count(); -} - -QGraphicsObject *QGraphicsItemPrivate::children_at(QDeclarativeListProperty<QGraphicsObject> *list, int index) -{ - QGraphicsItemPrivate *d = QGraphicsItemPrivate::get(static_cast<QGraphicsObject *>(list->object)); - if (index >= 0 && index < d->children.count()) - return d->children.at(index)->toGraphicsObject(); - else - return nullptr; -} - -void QGraphicsItemPrivate::children_clear(QDeclarativeListProperty<QGraphicsObject> *list) -{ - QGraphicsItemPrivate *d = QGraphicsItemPrivate::get(static_cast<QGraphicsObject *>(list->object)); - int childCount = d->children.count(); - if (d->sendParentChangeNotification) { - for (int index = 0; index < childCount; index++) - d->children.at(0)->setParentItem(nullptr); - } else { - for (int index = 0; index < childCount; index++) - QGraphicsItemPrivate::get(d->children.at(0))->setParentItemHelper(nullptr, nullptr, nullptr); - } -} - -/*! - Returns a list of this item's children. - - The items are sorted by stacking order. This takes into account both the - items' insertion order and their Z-values. - -*/ -QDeclarativeListProperty<QGraphicsObject> QGraphicsItemPrivate::childrenList() -{ - Q_Q(QGraphicsItem); - if (isObject) { - QGraphicsObject *that = static_cast<QGraphicsObject *>(q); - return QDeclarativeListProperty<QGraphicsObject>(that, &children, children_append, - children_count, children_at, children_clear); - } else { - //QGraphicsItem is not supported for this property - return QDeclarativeListProperty<QGraphicsObject>(); - } -} - /*! \internal Returns the width of the item @@ -10093,6 +9997,7 @@ bool QGraphicsTextItem::sceneEvent(QEvent *event) case QEvent::GraphicsSceneMouseRelease: case QEvent::KeyPress: case QEvent::KeyRelease: + case QEvent::InputMethod: // Reset the focus widget's input context, regardless // of how this item gained or lost focus. if (event->type() == QEvent::FocusIn || event->type() == QEvent::FocusOut) { @@ -10308,7 +10213,9 @@ void QGraphicsTextItem::hoverLeaveEvent(QGraphicsSceneHoverEvent *event) QVariant QGraphicsTextItem::inputMethodQuery(Qt::InputMethodQuery query) const { QVariant v; - if (query == Qt::ImHints) + if (query == Qt::ImEnabled) + return isEnabled(); + else if (query == Qt::ImHints) v = int(inputMethodHints()); else if (dd->control) v = dd->control->inputMethodQuery(query, QVariant()); @@ -10396,16 +10303,16 @@ QWidgetTextControl *QGraphicsTextItemPrivate::textControl() const control = new QWidgetTextControl(that); control->setTextInteractionFlags(Qt::NoTextInteraction); - QObject::connect(control, SIGNAL(updateRequest(QRectF)), - qq, SLOT(_q_update(QRectF))); - QObject::connect(control, SIGNAL(documentSizeChanged(QSizeF)), - qq, SLOT(_q_updateBoundingRect(QSizeF))); - QObject::connect(control, SIGNAL(visibilityRequest(QRectF)), - qq, SLOT(_q_ensureVisible(QRectF))); - QObject::connect(control, SIGNAL(linkActivated(QString)), - qq, SIGNAL(linkActivated(QString))); - QObject::connect(control, SIGNAL(linkHovered(QString)), - qq, SIGNAL(linkHovered(QString))); + QObject::connect(control, &QWidgetTextControl::updateRequest, qq, + [dd = that->dd](const QRectF &rect) { dd->_q_update(rect); }); + QObject::connect(control, &QWidgetTextControl::documentSizeChanged, qq, + [dd = that->dd](QSizeF size) { dd->_q_updateBoundingRect(size); }); + QObject::connect(control, &QWidgetTextControl::visibilityRequest, qq, + [dd = that->dd](const QRectF &rect) { dd->_q_ensureVisible(rect); }); + QObject::connect(control, &QWidgetTextControl::linkActivated, qq, + &QGraphicsTextItem::linkActivated); + QObject::connect(control, &QWidgetTextControl::linkHovered, qq, + &QGraphicsTextItem::linkHovered); const QSizeF pgSize = control->document()->pageSize(); if (pgSize.height() != -1) { @@ -10608,7 +10515,7 @@ void QGraphicsSimpleTextItemPrivate::updateBoundingRect() br = QRectF(); } else { QString tmp = text; - tmp.replace(QLatin1Char('\n'), QChar::LineSeparator); + tmp.replace(u'\n', QChar::LineSeparator); QStackTextEngine engine(tmp, font); QTextLayout layout(&engine); br = setupTextLayout(&layout); @@ -10769,7 +10676,7 @@ void QGraphicsSimpleTextItem::paint(QPainter *painter, const QStyleOptionGraphic painter->setFont(d->font); QString tmp = d->text; - tmp.replace(QLatin1Char('\n'), QChar::LineSeparator); + tmp.replace(u'\n', QChar::LineSeparator); QStackTextEngine engine(tmp, d->font); QTextLayout layout(&engine); @@ -10781,7 +10688,7 @@ void QGraphicsSimpleTextItem::paint(QPainter *painter, const QStyleOptionGraphic } else { QTextLayout::FormatRange range; range.start = 0; - range.length = layout.text().length(); + range.length = layout.text().size(); range.format.setTextOutline(d->pen); layout.setFormats(QList<QTextLayout::FormatRange>(1, range)); } |