QT 笔记 QGraphicsItem 介绍

介绍

QGraphicsItem是Qt中用于在图形视图框架中表示可视图形项的基类。在Qt的图形视图框架中,你可以使用QGraphicsItem及其派生类来创建可在图形场景中显示的图形元素。下面是关于QGraphicsItem的一些重要信息:

  • 作用QGraphicsItem是所有在图形场景中可视的图形项的基类,用于表示图形元素。
  • 功能QGraphicsItem提供了一种方法来管理图形项的位置、外观、交互等属性,使其能够在图形视图框架中进行显示和交互。
  • 常用功能
    • 设置和获取图形项的位置和尺寸。
    • 控制图形项的外观,如颜色、笔刷、边框等。
    • 处理图形项的交互事件,如鼠标点击、拖动等。
    • 实现图形项的碰撞检测、坐标转换等功能。

判断相关函数

isActive() 否处于活动状态

项是否处于活动状态。仅当场景处于活动状态时,项才能处于活动状态。只有活动项才能获得输入焦点。

isAncestorOf 是否是孩子的祖先

isAncestorOf(const QGraphicsItem *child)

如果当前项是参数项的祖先则返回true。

isBlockedByModalPanel 是否被模态面板阻

isBlockedByModalPanel(QGraphicsItem **blockingPanel = nullptr)

如果当前项被模态面板阻止,则返回true,否则返回false。如果blockingPanel不为nullptr,则将blockingPanel设置为阻止此项的模态面板。如果此项未被阻止,则此功能将不会设置blockingPanel。对于不在场景中的项,此函数始终返回false。

isClipped() 是否被裁剪

如果项被裁剪,则返回true。如果项设置了ItemClipsToShape标志,或其任何祖先设置了ItemClipsChildrenToShape标志,则该项将被裁剪。

isEnabled() 是否启用

判断是否启用

isObscured 是否被上方矩形完全遮盖

isObscured(const QRectF &rect = QRectF()) 	
isObscured(qreal x, qreal y, qreal w, qreal h) 	

如果rect被其上方任何碰撞项的不透明形状完全遮盖(即,Z值高于当前项),则返回true。(实用)

isObscuredBy 是否被上方的项完全遮盖

isObscuredBy(const QGraphicsItem *item) 	

如果当前项的边界矩形完全被参数中的项的不透明形状遮盖,则返回true。基本实现将项的opaqueArea()映射到该项的坐标系,然后检查该项的boundingRect()是否完全包含在映射的形状中。可以重新实现此功能,以提供一种自定义算法来确定该项是否被项遮盖。

isPanel() 是否是面板

项是否是面板。

isSelected() 是否被选中

项是否被选中

isUnderMouse() 是否位于鼠标下方

当前项是否位于一个视图鼠标光标的下方。(实用)

isVisible() 是否对父项可见

当前项是否对参数中的父项可见(即使isVisible()为true,也可能对其祖先不可见。即使isVisible()为false,它的祖先也可能可见)。参数parent可以为空的情况下,此函数将返回当前项对于场景是否可见。如果任何祖先被隐藏,则项本身将被隐式隐藏,在这种情况下,此函数将返回false。

isVisibleTo(const QGraphicsItem *parent)

当前项是否对参数中的父项可见(即使isVisible()为true,也可能对其祖先不可见。即使isVisible()为false,它的祖先也可能可见)。参数parent可以为空的情况下,此函数将返回当前项对于场景是否可见。如果任何祖先被隐藏,则项本身将被隐式隐藏,在这种情况下,此函数将返回false。

isWidget() 是否是QGraphicsWidget

当前项是否是QGraphicsWidget。

isWindow() 是否是QGraphicsWidget窗口

当前项是否是QGraphicsWidget窗口。(QGraphicsWidget对象设置了 windowFlags为Qt::Window)

设置相关函数

setAcceptDrops 接受拖放事件

setAcceptDrops(bool on)  

如果on为true,则此项目将接受拖放事件;否则,它对拖放事件是透明的。默认情况下,项不接受拖放事件。

setAcceptHoverEvents 接受悬停事件

setAcceptHoverEvents(bool enabled)

如果enabled为true,此项目将接受悬停事件;否则,它将忽略它们。默认情况下,项目不接受悬停事件。

setAcceptTouchEvents 接受触摸事件

setAcceptTouchEvents(bool enabled)

如果enabled为true,此项目将接受触摸事件;否则,它将忽略它们。默认情况下,项目不接受触摸事件。

setAcceptedMouseButtons 接受鼠标事件

setAcceptedMouseButtons(Qt::MouseButtons buttons)

设置此项接受鼠标事件的鼠标按钮

setActive

setActive(bool active) 活动状态

如果active为true,并且场景处于活动状态,则此项目的面板将被激活。否则,表示未激活面板。

setBoundingRegionGranularity 将边界区域粒度设置为粒度

setBoundingRegionGranularity(qreal granularity)

将边界区域粒度设置为粒度;介于0和1之间且包括0和1的值。默认值为0(即,最低粒度,其中边界区域对应于项目的边界矩形)。

setCacheMode 缓存模式

setCacheMode(QGraphicsItem::CacheMode mode, const QSize &logicalCacheSize = QSize())

将项的缓存模式设置为mode。

setCursor 鼠标光标形状

setCursor(const QCursor &cursor)
为光标项设置当前光标形状。鼠标光标在该项上时将呈现此形状。有关一系列有用的形状,请参阅预定义光标对象列表。

setData 设置键值

setData(int key, const QVariant &value)

为键key设置该项的自定义数据为value。

setEnabled 启用状态

setEnabled(bool enabled)

如果enabled为true,则启用该项;否则,禁用。
禁用的项是可见的,但它们不接收任何事件,不能成为焦点也不能被选中。鼠标事件被丢弃;除非项目也是不可见的,或者它不接受鼠标事件(参见acceptedMouseButtons()),否则它们不会传播。一个被禁用的项目不能成为鼠标抓取器,因此,如果一个项目在抓取鼠标时被禁用,它就会失去抓取器,就像它在被禁用时有焦点,它就会失去焦点一样。
禁用项通常使用灰色绘制(参见QPalette::Disabled)。
如果禁用父项,则其所有子项也将禁用。如果你启用一个父项,所有的子项都将被启用,除非它们已经被显式禁用(即,如果你在一个子项上调用setEnabled(false),如果它的父项被禁用,它将不会被重新启用,然后再次启用)。
默认情况下,项是启用的。
注意:如果您安装了事件过滤器,您仍然可以在事件传递给项目之前拦截事件;此机制忽略项的启用状态。

setFiltersChildEvents 过滤事件

setFiltersChildEvents(bool enabled)

如果enabled为true,则将此项目设置为过滤所有子项目的所有事件(即,针对其任何子项目的所有事件都被发送到此项目);否则,如果enabled为false,则此项将只处理其自己的事件。默认值为false。

setFlag 设置标志

setFlag(QGraphicsItem::GraphicsItemFlag flag, bool enabled = true)

如果enabled为true,则项目标志flag为启用;否则,禁用。

setFlags 设置标志

setFlags(QGraphicsItem::GraphicsItemFlags flags)

将项标志设置为flags。flags中的所有标志都是启用的;所有不在标志中的标志都被禁用。
如果项目有焦点,并且flags没有启用ItemIsFocusable,则该项目将由于调用该函数而失去焦点。类似地,如果项目已被选中,并且flags未启用ItemIsSelectable,则该项目将自动取消选中。
缺省情况下,不启用任何标志。(QGraphicsWidget默认启用ItemSendsGeometryChanges标志,以便跟踪位置变化。)

setFocus 键盘输入焦点

setFocus(Qt::FocusReason focusReason = Qt::OtherFocusReason)

为该项目提供键盘输入焦点。focusReason参数将被传递到这个函数生成的任何焦点事件中;它用来解释是什么导致了该项目的焦点。
只有设置了ItemIsFocusable标志的启用项才能接受键盘焦点。
如果此项目不可见、不活动或不与场景关联,则它将不会获得即时输入焦点。然而,它将被注册为它的子树的首选焦点项,如果它以后变得可见的话。
作为调用这个函数的结果,这个项目将通过focusReason接收一个焦点事件。如果另一个项目已经有了焦点,那么该项目将首先收到一个焦点输出事件,表明它已经失去了输入焦点。

setFocusProxy 焦点代理

setFocusProxy(QGraphicsItem *item)

将项的焦点代理设置为item。
如果项目具有焦点代理,则焦点代理将在项目获得输入焦点时接收输入焦点。项目本身仍然具有焦点(即,hasFocus()将返回true),但是只有焦点代理将接收键盘输入。
焦点代理本身可以有一个焦点代理,以此类推。在这种情况下,键盘输入将由最外层的焦点代理处理。
焦点代理项必须与此项属于同一场景。

setGraphicsEffect 设置效果

setGraphicsEffect(QGraphicsEffect *effect)

将effect设置为项目的效果。如果此项目上已经安装了效果,QGraphicsItem将在安装新效果之前删除现有效果。您可以通过调用setgraphicseeffect (nullptr)来删除现有的效果。
如果effect是安装在其他项目上的效果,setGraphicsEffect()将从项目中删除效果并将其安装在该项目上。
QGraphicsItem拥有所有权。
注意:此函数将对其自身及其所有子函数应用此效果。

setGroup 设置组

setGroup(QGraphicsItemGroup *group)

将此项目添加到项目组组中。如果group为nullptr,则该项将从任何当前组中删除,并作为前一个组的父组的子组添加。

setInputMethodHints 设置提示

setInputMethodHints(Qt::InputMethodHints hints)

将该项的当前输入法提示设置为提示。

setOpacity 透明度

setOpacity(qreal opacity)

设置该项的局部不透明度,介于0.0(透明)和1.0(不透明)之间。项目的局部不透明度与父不透明度和父不透明度结合到effectiveOpacity()中。
默认情况下,不透明度从父节点传播到子节点,所以如果父节点的不透明度为0.5,子节点的不透明度也为0.5,那么子节点的有效不透明度将为0.25。
不透明度属性决定了传递给paint()函数的绘制器的状态。如果项被缓存,即ItemCoordinateCache或DeviceCoordinateCache,则在呈现项时将有效属性应用于项的缓存。
有两个项目标志会影响项目的不透明度与父项目的组合方式:ItemIgnoresParentOpacity和ItemDoesntPropagateOpacityToChildren。
注意:将项目的不透明度设置为0不会使项目不可见(根据isVisible()),但该项目将被视为不可见的项目。有关更多信息,请参阅setVisible()的文档。

setPanelModality 设置模态

setPanelModality(QGraphicsItem::PanelModality panelModality)

将该项的模态设置为panelModality。
更改可见项的模态会立即生效。

setParentItem 设置父项

setParentItem(QGraphicsItem *newParent)

将该项的父项设置为newParent。如果此项已经有父项,则首先将其从前一个父项中删除。如果newParent为0,则此项将成为顶级项。
注意,这将隐式地将该图形项添加到父场景中。你不应该自己将物品添加到场景中。
在newParent的祖先项上调用此函数时的行为是未定义的。

setPos 设置位置

setPos(const QPointF &pos)
setPos(qreal x, qreal y)

将项目的位置设置为pos,它位于父坐标中。对于没有父项的项目,pos在场景坐标中。
项目的位置在父坐标中描述了它的原点(本地坐标(0,0))。

setRotation 设置旋转角度

setRotation(qreal angle)

设置绕Z轴的顺时针旋转角度(以度为单位)。默认值为0(即,不旋转项目)。赋负值将使项目逆时针旋转。通常情况下,旋转角度在(- 360,360)范围内,但也有可能在这个范围之外赋值(例如,旋转370度与旋转10度相同)。
项目围绕其转换原点旋转,默认情况下为(0,0)。您可以通过调用setTransformOriginPoint()来选择不同的转换原点。
旋转与项目的scale()、transform()和transforms()相结合,将项目的坐标系统映射到父项目。

setScale

setScale(qreal factor)

设置项目的比例因子。默认的比例因子是1.0(即,项目没有缩放)。比例系数为0.0将把项目折叠为单个点。如果您提供负比例因子,则项目将被翻转和镜像(即旋转180度)。
项目围绕其转换原点缩放,默认值为(0,0)。您可以通过调用setTransformOriginPoint()来选择不同的转换原点。
比例与项目的rotation()、transform()和transformations()相结合,将项目的坐标系统映射到父项目。

setSelected 是否可选

setSelected(bool selected)

如果selected为真值并且此项目是可选择的,则选中此项目;否则,未选中。
如果项目在一个组中,则通过此功能切换整个组的选择状态。如果选中该组,则选中该组中的所有项目;如果未选中该组,则不选中该组中的任何项目。
只能选择可见的、启用的、可选择的项目。如果selected为true,并且该项不可见或禁用或不可选,则此函数不执行任何操作。
缺省情况下,不允许选择项目。要启用选择,请设置ItemIsSelectable标志。
提供此功能是为了方便,允许单独切换项目的选定状态。然而,更常见的选择项目的方法是调用QGraphicsScene::setSelectionArea(),它将为场景中指定区域内的所有可见、启用和可选择的项目调用此函数。

setToolTip 设置工具提示

setToolTip(const QString &toolTip)

将项目的工具提示设置为toolTip。如果toolTip为空,则清除该项目的工具提示。

setTransform 设置变换矩阵

setTransform(const QTransform &matrix, bool combine = false)

将项目的当前变换矩阵设置为matrix。
如果combine为真,则矩阵与当前矩阵组合;否则,矩阵替换当前矩阵。Combine默认为false。
为了使用转换后的视图简化与项的交互,QGraphicsItem提供了mapTo…和mapFrom……可以在物品和场景坐标之间进行转换的功能。例如,你可以调用mapToScene()将项目坐标映射到场景坐标,或者调用mapFromScene()将场景坐标映射到项目坐标。
转换矩阵与项目的rotation(), scale() 和transformations()组合成一个组合转换,将项目的坐标系映射到它的父坐标系。

setTransformOriginPoint 设置转换原点

setTransformOriginPoint(const QPointF &origin)
setTransformOriginPoint(qreal x, qreal y)

在项坐标中设置转换的原点。

setTransformations 设置图形转换列表

setTransformations(const QList<QGraphicsTransform *> &transformations)

设置当前应用于此项的图形转换列表(qgraphicstrtransform)。
如果你想旋转或缩放一个项目,你应该调用setRotation()或setScale()。如果您想在一个项目上设置任意的转换,您可以调用setTransform()。
QGraphicsTransform 用于应用和控制项目上的单个转换操作链。它在动画中特别有用,其中每个转换操作需要独立或不同地插值。
这些转换与项目的rotation()、scale()和transform()相结合,将项目的坐标系统映射到父项目。

setVisible 设置是否可见

setVisible(bool visible)

如果visible为true,则使项目可见。否则,该项将不可见。不可见的物品不会被绘制,也不会收到任何事件。特别是,鼠标事件直接通过不可见的项目,并传递给任何可能在后面的项目。不可见的项目也是不可选择的,它们不能作为输入焦点,也不能被QGraphicsScene的项目定位函数检测到。
如果一个项目在抓取鼠标时变得不可见(即,当它正在接收鼠标事件时),它将自动失去鼠标抓取,并且不会通过使项目再次可见而重新获得抓取;它必须接受一个新的鼠标按压来重新获得鼠标抓取。
同样地,不可见的道具也不能有焦点,所以如果道具在变得不可见的时候有焦点,它就会失去焦点,并且不能通过让道具再次可见来恢复焦点。
如果隐藏父项,则它的所有子项也将被隐藏。如果你显示父项,所有的子项都会显示,除非它们被显式地隐藏(也就是说,如果你在一个子项上调用setVisible(false),即使它的父项被隐藏,它也不会被重新显示,然后再次显示)。
默认情况下,项是可见的;不需要在新项上调用setVisible()。
注意:不透明度设置为0的项仍然被认为是可见的,尽管它将被视为不可见的项:鼠标事件将通过它,它将不包括在QGraphicsView::items()返回的项中,等等。但是,该项目将保留焦点。

setX 位置的x坐标

setX(qreal x)

设置项目位置的x坐标。相当于调用setPos(x, y())。

setY 位置的y坐标

setY(qreal y)

设置项目位置的y坐标。相当于调用setPos(x(), y)。

setZValue 设置z值

setZValue(qreal z)
将项目的z值设置为z。z值决定兄弟(相邻)项目的堆叠顺序。高Z值的兄弟项目将始终绘制在Z值较低的兄弟项目的顶部。
如果恢复Z值,则项目的插入顺序将决定其堆叠顺序。
z值不会以任何方式影响项目的大小。
默认z值为0。

其他函数或属性

acceptDrops属性

在Qt中,acceptDrops是一个用于控制一个窗口部件(widget)是否接受拖放操作的属性。当acceptDrops属性被设置为true时,窗口部件将接受拖放操作;当设置为false时,窗口部件将拒绝拖放操作。

  • 作用acceptDrops属性用于指示窗口部件是否接受拖放操作。
  • 类型:布尔类型,可以设置为truefalse
  • 默认值:通常情况下,acceptDrops的默认值是false,即窗口部件默认不接受拖放操作。
  • 设置方法:你可以通过调用setAcceptDrops(true)setAcceptDrops(false)来设置窗口部件的acceptDrops属性。

使用示例

// 在一个自定义的QWidget中启用拖放功能
class MyWidget : public QWidget {
   
public:
    MyWidget(QWidget *parent = nullptr) : QWidget(parent) {
   
        setAcceptDrops(true); // 启用拖放功能
    }

    // 实现拖放事件的处理函数
    void dragEnterEvent(QDragEnterEvent *event) override {
   
        // 处理拖放进入事件
        event->acceptProposedAction();
    }

    void dropEvent(QDropEvent *event) override {
   
        // 处理拖放释放事件
        event->acceptProposedAction();
    }
};

在上面的示例中,我们创建了一个自定义的QWidget子类MyWidget,在构造函数中设置了acceptDrops属性为true,启用了拖放功能。同时,我们重写了dragEnterEventdropEvent函数来处理拖放事件。

注意事项

  • 在使用拖放功能时,除了设置窗口部件的acceptDrops属性外,还需要实现相应的事件处理函数来处理拖放事件,如dragEnterEventdropEvent等。
  • 通过设置窗口部件的acceptDrops属性为true,你可以实现在窗口部件上进行拖放操作,从而实现更加灵活的用户交互体验。

通过设置窗口部件的acceptDrops属性为true,你可以方便地启用拖放功能,让用户可以通过拖放操作在应用程序中进行数据交互和操作。

acceptHoverEvents属性

在Qt中,acceptHoverEvents是一个用于控制窗口部件(widget)是否接受鼠标悬停事件的属性。当acceptHoverEvents属性被设置为true时,窗口部件将接受鼠标悬停事件;当设置为false时,窗口部件将不接受鼠标悬停事件。

  • 作用acceptHoverEvents属性用于指示窗口部件是否接受鼠标悬停事件。
  • 类型:布尔类型,可以设置为truefalse
  • 默认值:通常情况下,acceptHoverEvents的默认值是false,即窗口部件默认不接受鼠标悬停事件。
  • 设置方法:你可以通过调用setAcceptHoverEvents(true)setAcceptHoverEvents(false)来设置窗口部件的acceptHoverEvents属性。

使用示例

// 在一个自定义的QWidget中启用鼠标悬停事件
class MyWidget : public QWidget {
   
public:
    MyWidget(QWidget *parent = nullptr) : QWidget(parent) {
   
        setAcceptHoverEvents(true); // 启用鼠标悬停事件
    }

    // 实现鼠标悬停事件的处理函数
    void hoverEnterEvent(QHoverEvent *event) override {
   
        // 处理鼠标悬停进入事件
    }

    void hoverLeaveEvent(QHoverEvent *event) override {
   
        // 处理鼠标悬停离开事件
    }

    void hoverMoveEvent(QHoverEvent *event) override {
   
        // 处理鼠标悬停移动事件
    }
};

在上面的示例中,我们创建了一个自定义的QWidget子类MyWidget,在构造函数中设置了acceptHoverEvents属性为true,启用了鼠标悬停事件。同时,我们重写了hoverEnterEventhoverLeaveEventhoverMoveEvent函数来处理鼠标悬停事件。

注意事项

  • 在使用鼠标悬停事件时,除了设置窗口部件的acceptHoverEvents属性外,还需要实现相应的事件处理函数来处理鼠标悬停事件,如hoverEnterEventhoverLeaveEventhoverMoveEvent等。
  • 通过设置窗口部件的acceptHoverEvents属性为true,你可以让窗口部件接受鼠标悬停事件,从而实现更加灵活的用户交互体验。

通过设置窗口部件的acceptHoverEvents属性为true,你可以方便地启用鼠标悬停事件,让用户可以通过鼠标悬停在窗口部件上时触发相应的交互效果或操作。

acceptTouchEvents属性

在Qt中,acceptTouchEvents是一个用于控制窗口部件(widget)是否接受触摸事件的属性。当acceptTouchEvents属性被设置为true时,窗口部件将接受触摸事件;当设置为false时,窗口部件将不接受触摸事件。

  • 作用acceptTouchEvents属性用于指示窗口部件是否接受触摸事件。
  • 类型:布尔类型,可以设置为truefalse
  • 默认值:通常情况下,acceptTouchEvents的默认值是false,即窗口部件默认不接受触摸事件。
  • 设置方法:你可以通过调用setAcceptTouchEvents(true)setAcceptTouchEvents(false)来设置窗口部件的acceptTouchEvents属性。

使用示例

// 在一个自定义的QWidget中启用触摸事件
class MyWidget : public QWidget {
   
public:
    MyWidget(QWidget *parent = nullptr) : QWidget(parent) {
   
        setAcceptTouchEvents(true); // 启用触摸事件
    }

    // 实现触摸事件的处理函数
    bool event(QEvent *event) override {
   
        if (event->type() == QEvent::TouchBegin) {
   
            // 处理触摸开始事件
            return true;
        } else if (event->type() == QEvent::TouchUpdate) {
   
            // 处理触摸更新事件
            return true;
        } else if (event->type() == QEvent::TouchEnd) {
   
            // 处理触摸结束事件
            return true;
        }
        
        return QWidget::event(event);
    }
};

在上面的示例中,我们创建了一个自定义的QWidget子类MyWidget,在构造函数中设置了acceptTouchEvents属性为true,启用了触摸事件。同时,我们重写了event函数来处理触摸事件,根据不同的事件类型(如TouchBeginTouchUpdateTouchEnd)来执行相应的操作。

注意事项

  • 在使用触摸事件时,除了设置窗口部件的acceptTouchEvents属性外,还需要实现相应的事件处理函数来处理触摸事件,如重写event函数并根据事件类型来处理触摸事件。
  • 通过设置窗口部件的acceptTouchEvents属性为true,你可以让窗口部件接受触摸事件,从而实现支持触摸屏的用户交互体验。

通过设置窗口部件的acceptTouchEvents属性为true,你可以方便地启用触摸事件,让用户可以通过触摸屏在窗口部件上进行交互操作。

acceptedMouseButtons 属性

acceptedMouseButtons 是 Qt 中用于指定窗口部件(widget)接受哪些鼠标按钮事件的属性。通过设置 acceptedMouseButtons,你可以限制窗口部件只接受特定的鼠标按钮事件。

  • 作用acceptedMouseButtons 属性用于指定窗口部件接受哪些鼠标按钮事件。
  • 类型:Qt::MouseButtons 枚举类型,可以设置为一个或多个鼠标按钮的组合。
  • 默认值:通常情况下,acceptedMouseButtons 的默认值是 Qt::AllButtons,表示窗口部件接受所有鼠标按钮事件。
  • 设置方法:你可以通过调用 setAcceptedMouseButtons(Qt::MouseButtons buttons) 来设置窗口部件的 acceptedMouseButtons 属性。

使用示例

// 在一个自定义的 QWidget 中设置接受特定鼠标按钮事件
class MyWidget : public QWidget {
   
public:
    MyWidget(QWidget *parent = nullptr) : QWidget(parent) {
   
        setAcceptedMouseButtons(Qt::LeftButton | Qt::RightButton); // 只接受左键和右键的鼠标按钮事件
    }

    // 实现鼠标事件的处理函数
    void mousePressEvent(QMouseEvent *event) override {
   
        if (event->button() == Qt::LeftButton) {
   
            // 处理左键点击事件
        } else if (event->button() == Qt::RightButton) {
   
            // 处理右键点击事件
        }
    }
};

在上面的示例中,我们创建了一个自定义的 QWidget 子类 MyWidget,在构造函数中设置了 acceptedMouseButtons 属性为 Qt::LeftButton | Qt::RightButton,表示窗口部件只接受左键和右键的鼠标按钮事件。同时,我们重写了 mousePressEvent 函数来处理鼠标按钮事件,并根据不同的按钮类型执行相应的操作。

注意事项

  • 通过设置窗口部件的 acceptedMouseButtons 属性,你可以限制窗口部件只接受特定的鼠标按钮事件,从而控制用户与窗口部件的交互行为。
  • 在实现鼠标事件处理函数时,记得根据 acceptedMouseButtons 的设置来判断具体的鼠标按钮事件,并执行相应的操作。

通过设置 acceptedMouseButtons 属性,你可以灵活地控制窗口部件接受哪些鼠标按钮事件,从而定制窗口部件的交互行为,以满足特定的用户需求。

advance() 函数

在Qt中,advance() 是一个用于告知窗口部件(widget)在下一个绘图更新时需要执行的函数。当调用 advance() 函数时,它会通知窗口部件,告知其需要在下一个绘图更新时执行额外的操作,比如更新动画、处理特定事件等。

  • 作用advance() 函数用于通知窗口部件在下一个绘图更新时需要执行额外的操作。
  • 调用时机:通常情况下,你可以在需要进行额外操作的地方调用 advance() 函数,比如在处理动画、特定事件等情况下。
  • 使用方法:直接调用窗口部件的 advance() 函数即可。

示例

// 在一个自定义的 QWidget 中使用 advance() 函数
class MyWidget : public QWidget {
   
public:
    MyWidget(QWidget *parent = nullptr) : QWidget(parent) {
   
        // 其他初始化操作
    }

    // 在某个需要执行额外操作的地方调用 advance()
    void someFunction() {
   
        // 执行一些操作
        advance(); // 调用 advance() 函数通知窗口部件在下一个绘图更新时执行额外操作
    }
};

在上面的示例中,我们创建了一个自定义的 QWidget 子类 MyWidget,在 someFunction() 函数中调用了 advance() 函数,通知窗口部件在下一个绘图更新时执行额外的操作。

注意事项

  • 调用 advance() 函数会触发 QEvent::UpdateRequest 事件,告知窗口部件在下一个绘图更新时需要执行额外的操作。
  • 在调用 advance() 函数后,窗口部件会在下一个绘图更新时进行相应的操作,这可以用于实现一些需要在特定时机执行的逻辑,比如更新动画状态、处理特定事件等。

通过调用 advance() 函数,你可以灵活地通知窗口部件在下一个绘图更新时执行额外的操作,从而实现更加定制化和交互性的窗口部件行为。

boundingRect 函数

在Qt中,boundingRect 是一个用于返回图形项(Graphics Item)边界矩形的函数。这个函数通常在自定义的图形项类中被重写,用于指定图形项的边界矩形,以便正确地进行绘制和碰撞检测。

  • 作用boundingRect 函数用于返回图形项的边界矩形,即该图形项占据的矩形区域。
  • 返回类型QRectF,表示一个浮点精度的矩形区域。
  • 使用方法:在自定义的图形项类中重写 boundingRect 函数,根据图形项的实际形状和位置来计算并返回边界矩形。

示例

// 自定义的图形项类,重写 boundingRect 函数
class CustomGraphicsItem : public QGraphicsItem {
   
public:
    QRectF boundingRect() const override {
   
        // 返回图形项的边界矩形,这里假设图形项位于原点,宽度为100,高度为50
        return QRectF(0, 0, 100, 50);
    }

    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = nullptr) override {
   
        // 在 paint 函数中绘制图形项的内容
        painter->drawRect(boundingRect()); // 绘制边界矩形
    }
};

在上面的示例中,我们创建了一个自定义的图形项类 CustomGraphicsItem,并重写了 boundingRect 函数以及 paint 函数。在 boundingRect 函数中,我们返回了一个矩形区域作为图形项的边界矩形,这里假设图形项位于原点,宽度为100,高度为50。在 paint 函数中,我们使用 painter 绘制了图形项的内容,包括绘制了边界矩形。

注意事项

  • boundingRect 函数的返回值应该准确地描述图形项的边界矩形,以确保正确的绘制和碰撞检测。
  • 在重写 boundingRect 函数时,应根据图形项的实际形状和位置来计算边界矩形,避免返回过大或过小的矩形,以提高性能和准确性。

通过重写 boundingRect 函数,你可以指定图形项的边界矩形,从而确保正确的绘制和碰撞检测,提升图形项的可视化效果和交互性。

boundingRegionGranularity 属性

boundingRegionGranularity 是用于指定绘图的粒度或精度的属性,通常用于优化绘图性能。在Qt中,这个属性通常用于控制绘图引擎在绘制图形项时的精细程度。

  • 作用boundingRegionGranularity 属性用于指定绘图引擎在计算图形项的边界矩形时的粒度或精度。通过调整这个属性,可以在绘图性能和绘制质量之间进行权衡。
  • 类型:通常是一个整数值,用于表示粒度的程度。
  • 默认值:具体的默认值取决于Qt的版本和具体的图形项类。

示例

// 设置 boundingRegionGranularity 属性
myGraphicsItem->setFlag(QGraphicsItem::ItemUsesExtendedStyleOption);
myGraphicsItem->setBoundingRegionGranularity(0.5);

在上面的示例中,我们展示了如何为一个图形项 myGraphicsItem 设置 boundingRegionGranularity 属性。通过调整这个属性,可以控制绘图引擎在计算图形项的边界矩形时的粒度,从而影响绘图性能和绘制质量。

注意事项

  • 调整 boundingRegionGranularity 属性可以在一定程度上优化绘图性能,特别是当有大量复杂的图形项需要绘制时。
  • 但是需要注意,过高的粒度可能会导致绘图性能下降,因为绘图引擎需要更多的计算来确定精细的边界矩形。

通过了解和调整 boundingRegionGranularity 属性,你可以在绘图性能和绘制质量之间找到一个平衡点,以获得最佳的绘图效果。如果你有任何其他问题或需要进一步的帮助,请随时告诉我。

cacheMode 属性

在Qt中,cacheMode 是用于设置图形项的缓存模式的属性。通过设置不同的缓存模式,可以优化图形项的绘制性能,特别是在需要频繁重绘的情况下。

  • 作用cacheMode 属性用于指定图形项的缓存模式,以优化绘图性能。
  • 类型:枚举类型,表示不同的缓存模式选项。
  • 默认值:具体的默认值取决于Qt的版本和具体的图形项类。

常见的 cacheMode

  1. QGraphicsItem::NoCache:不使用缓存,每次绘制都重新计算。
  2. QGraphicsItem::ItemCoordinateCache:使用局部坐标系缓存,适用于不经常变化的图形项。
  3. QGraphicsItem::DeviceCoordinateCache:使用设备坐标系缓存,适用于频繁变化但不需要重新计算坐标转换的图形项。
  4. QGraphicsItem::ItemCoordinateCache:使用局部坐标系缓存,适用于不经常变化的图形项。

示例

// 设置 cacheMode 属性
myGraphicsItem->setCacheMode(QGraphicsItem::DeviceCoordinateCache);

在上面的示例中,我们展示了如何为一个图形项 myGraphicsItem 设置 cacheMode 属性。通过调整这个属性,可以根据图形项的特性和需要优化绘图性能。

注意事项

  • 使用适当的 cacheMode 可以显著提高图形项的绘制性能,尤其是在需要频繁重绘或者复杂图形项的情况下。
  • 需要根据具体的应用场景和图形项的特性来选择合适的缓存模式,以获得最佳的性能表现。

通过了解和设置 cacheMode 属性,你可以有效地优化图形项的绘制性能,提升应用程序的用户体验。

childItems 函数

在Qt中,childItems 是一个函数,用于获取一个图形项的所有子图形项。当你在Qt中使用图形项来构建复杂的图形场景时,childItems 函数可以帮助你管理和操作图形项的层次结构。

  • 作用:获取一个图形项的所有子图形项。
  • 返回值:一个 QList<QGraphicsItem*> 类型的列表,包含了该图形项的所有子图形项。
  • 示例
    QList<QGraphicsItem*> items = parentItem->childItems();
    

示例代码

假设你有一个父图形项 parentItem,它包含了多个子图形项。你可以使用 childItems 函数来获取这些子图形项,然后对它们进行操作,比如移动、隐藏或删除。

QList<QGraphicsItem*> items = parentItem->childItems();
for (QGraphicsItem* item : items) {
   
    // 对每个子图形项进行操作
    item->setPos(item->pos() + QPointF(10, 10)); // 移动子图形项
    item->setVisible(false); // 隐藏子图形项
    // 其他操作...
}

注意事项

  • 使用 childItems 函数可以方便地遍历父图形项的所有子图形项,从而对它们进行批量操作。
  • 当你需要对图形场景中的多个图形项进行统一处理时,childItems 函数是一个很有用的工具。

通过使用 childItems 函数,你可以更加方便地管理复杂的图形场景中的图形项,从而实现更灵活和高效的图形界面交互。

childrenBoundingRect() 函数

在Qt中,childrenBoundingRect() 是一个函数,用于返回一个图形项的所有子图形项的边界矩形。这个函数返回的矩形是包围所有子图形项的最小矩形,可以帮助你确定父图形项的大小和位置,以便正确显示所有子图形项。

  • 作用:返回一个矩形,该矩形包围了图形项的所有子图形项。
  • 返回值:一个 QRectF 类型的矩形,表示所有子图形项的边界矩形。
  • 示例
    QRectF boundingRect = parentItem->childrenBoundingRect();
    

示例代码

假设你有一个父图形项 parentItem,它包含了多个子图形项。你可以使用 childrenBoundingRect() 函数来获取一个矩形,该矩形包围了所有子图形项的边界,从而可以根据这个矩形来确定父图形项的大小和位置。

QRectF boundingRect = parentItem->childrenBoundingRect();
parentItem->setPos(-boundingRect.width() / 2, -boundingRect.height() / 2);
parentItem->setSize(boundingRect.size());

在上面的示例中,我们获取了父图形项的所有子图形项的边界矩形,并根据这个矩形来设置父图形项的位置和大小,以确保所有子图形项都能正确显示在父图形项内部。

注意事项

  • 使用 childrenBoundingRect() 函数可以帮助你更好地管理和布局包含多个子图形项的父图形项。
  • 这个函数对于动态调整父图形项的大小和位置以适应子图形项的情况非常有用。

通过使用 childrenBoundingRect() 函数,你可以更好地控制父图形项与其子图形项之间的布局关系,从而实现更灵活和精确的图形界面设计。

clearFocus() 函数

在Qt中,clearFocus() 是一个函数,用于清除当前拥有焦点的部件(widget)的焦点。当一个部件(如按钮、文本框等)获得焦点时,它会响应键盘事件。通过调用 clearFocus() 函数,你可以将焦点从当前部件移除,使其不再响应键盘事件。

  • 作用:清除当前拥有焦点的部件的焦点。
  • 示例
    QWidget *currentFocusWidget = QApplication::focusWidget();
    if (currentFocusWidget) {
         
        currentFocusWidget->clearFocus();
    }
    

示例代码

以下是一个简单的示例代码,演示如何使用 clearFocus() 函数来清除当前拥有焦点的部件的焦点:

// 获取当前拥有焦点的部件
QWidget *currentFocusWidget = QApplication::focusWidget();

// 如果存在拥有焦点的部件,则清除其焦点
if (currentFocusWidget) {
   
    currentFocusWidget->clearFocus();
}

在上面的示例中,我们首先获取当前拥有焦点的部件,然后调用 clearFocus() 函数来清除它的焦点。这可以用于在特定情况下,例如用户执行某个操作后,希望将焦点从当前部件移除。

注意事项

  • clearFocus() 函数可以帮助你管理部件的焦点,确保正确的部件响应键盘事件。
  • 当你需要在程序中控制焦点的转移或清除时,可以使用这个函数来实现。

通过使用 clearFocus() 函数,你可以灵活地控制部件之间焦点的转移,从而提高用户界面的交互性和用户体验。

clipPath 进行裁剪

在Qt中,clipPath 是用于设置图形项(QGraphicsItem)裁剪路径的属性。裁剪路径可以用来限制图形项的绘制区域,只有在裁剪路径范围内的内容才会被显示,超出裁剪路径范围的内容将被隐藏。
在Qt中,你可以通过以下步骤来使用 clipPath 进行裁剪:

  1. 创建一个裁剪路径(QPainterPath)。
  2. 将裁剪路径设置为图形项的 clipPath 属性。

下面是一个简单的示例代码,演示了如何使用 clipPath 进行裁剪:

// 创建一个裁剪路径
QPainterPath clipPath;
clipPath.addRect(0, 0, 100, 100); // 在(0, 0)位置创建一个100x100的矩形裁剪区域

// 将裁剪路径设置为图形项的clipPath属性
yourGraphicsItem->setClipPath(clipPath);

在上面的示例中,我们首先创建了一个矩形裁剪路径,然后将其设置为图形项 yourGraphicsItemclipPath 属性。这样,只有在矩形裁剪区域内的内容才会被显示,超出裁剪区域的内容将被隐藏。

注意事项

  • 使用 clipPath 可以帮助你限制图形项的绘制区域,实现特定区域的显示效果。
  • 裁剪路径可以是任何形状,不仅限于矩形,你可以根据需要创建不同形状的裁剪路径。

通过使用 clipPath 属性,你可以灵活地控制图形项的显示范围,实现各种有趣的视觉效果。如果你有任何其他问题或需要进一步的帮助,请随时告诉我。

collidesWithItem 函数

在Qt中,collidesWithItem 是一个用于检测两个图形项(QGraphicsItem)是否相交的函数。它可以帮助你判断一个图形项是否与另一个图形项发生了碰撞。
collidesWithItem 函数有两个重载版本:

  1. bool QGraphicsItem::collidesWithItem(const QGraphicsItem *other, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape) const:检测当前图形项是否与指定的其他图形项相交。

  2. bool QGraphicsItem::collidesWithItem(const QGraphicsItem *other, Qt::ItemSelectionMode mode, const QPointF &scenePoint):检测当前图形项是否与指定的其他图形项相交,并指定场景中的点。

示例代码

以下是一个简单的示例代码,演示了如何使用 collidesWithItem 函数来检测两个图形项是否相交:

QGraphicsItem *item1 = ...; // 第一个图形项
QGraphicsItem *item2 = ...; // 第二个图形项

if (item1->collidesWithItem(item2)) {
   
    // 两个图形项发生了碰撞
    // 可以在这里处理碰撞事件
}

在这个示例中,我们首先获取了两个图形项 item1item2,然后使用 collidesWithItem 函数检测它们是否相交。如果它们相交,我们可以在相交的情况下执行特定的操作,比如处理碰撞事件或者改变它们的状态。

注意事项

  • collidesWithItem 函数可以帮助你检测图形项之间的碰撞,以便在需要时采取相应的行动。
  • 可以根据需要选择合适的重载版本,并根据返回值来判断是否发生了碰撞。

通过使用 collidesWithItem 函数,你可以在Qt中方便地检测图形项之间是否发生了碰撞,从而实现更加交互性和动态性的图形界面。

collidingItems()函数的功能:

collidingItems()函数是QGraphicsItem类中的一个非常有用的函数,用于获取与当前图形项发生碰撞的其他图形项列表。当您需要在Qt中实现碰撞检测时,这个函数可以帮助您快速找到与当前图形项碰撞的其他图形项,从而执行相应的操作。

  • 功能:获取与当前图形项发生碰撞的其他图形项列表。
  • 返回值QList<QGraphicsItem*>,包含与当前图形项发生碰撞的其他图形项。

使用示例:

下面是一个简单的示例,演示了如何使用collidingItems()函数来获取与给定QGraphicsItem发生碰撞的其他图形项并输出其信息:

#include <QGraphicsItem>

// 获取与给定图形项item发生碰撞的其他图形项列表
QList<QGraphicsItem*> getCollidingItems(QGraphicsItem* item)
{
   
    QList<QGraphicsItem*> collidingItems = item->collidingItems();

    // 输出碰撞的图形项信息
    for (QGraphicsItem* collidingItem : collidingItems) {
   
        qDebug() << "Colliding with item:" << collidingItem;
    }

    return collidingItems;
}

在这个示例中,getCollidingItems函数接受一个QGraphicsItem指针作为参数,并使用collidingItems()函数来获取与该图形项发生碰撞的其他图形项列表。然后,它遍历并输出碰撞的图形项信息。

通过使用collidingItems()函数,您可以轻松地实现碰撞检测逻辑,并在需要时处理碰撞事件。

collidesWithPath()函数的功能:

在Qt中,QGraphicsItem类还提供了一个名为collidesWithPath()的函数,用于检查图形项是否与给定的QPainterPath对象相交。该函数可以用于执行更复杂的碰撞检测,例如检查图形项是否与指定路径相交,而不仅仅是与其他图形项发生碰撞。

  • 功能:检查图形项是否与给定的QPainterPath对象相交。
  • 参数QPainterPath对象,用于检查与图形项的碰撞。
  • 返回值true表示相交,false表示不相交。

使用示例:

下面是一个简单的示例,演示了如何使用collidesWithPath()函数来检查一个QGraphicsItem对象是否与一个QPainterPath对象相交:

#include <QGraphicsItem>
#include <QPainterPath>

// 检查图形项item是否与给定路径path相交
bool checkCollisionWithPath(QGraphicsItem* item, const QPainterPath& path)
{
   
    return item->collidesWithPath(path);
}

在这个示例中,checkCollisionWithPath函数接受一个QGraphicsItem指针和一个QPainterPath对象作为参数,并使用collidesWithPath()函数来检查图形项是否与给定路径相交。函数将返回true表示相交,false表示不相交。

使用collidesWithPath()函数可以帮助您执行更灵活和复杂的碰撞检测,从而实现更多样化的图形项交互和处理逻辑。

commonAncestorItem()函数的功能:

用于查找两个QGraphicsItem对象的共同祖先(common ancestor)。共同祖先是指两个图形项在场景中的层次结构中共同的最近的祖先图形项。

  • 功能:查找两个QGraphicsItem对象的共同祖先。
  • 参数:另一个QGraphicsItem对象。
  • 返回值:返回两个图形项的共同祖先QGraphicsItem对象。

使用示例:

下面是一个简单的示例,演示了如何使用commonAncestorItem()函数来查找两个QGraphicsItem对象的共同祖先:

#include <QGraphicsItem>

// 查找两个图形项item1和item2的共同祖先
QGraphicsItem* findCommonAncestorItem(QGraphicsItem* item1, QGraphicsItem* item2)
{
   
    QGraphicsItem* commonAncestor = item1->commonAncestorItem(item2);

    return commonAncestor;
}

在这个示例中,findCommonAncestorItem函数接受两个QGraphicsItem指针作为参数,并使用commonAncestorItem()函数来查找这两个图形项的共同祖先。函数将返回一个QGraphicsItem指针,指向这两个图形项的共同祖先。

通过使用commonAncestorItem()函数,您可以轻松地查找两个图形项在场景中的层次结构中的共同祖先,这对于处理图形项之间的关系和交互非常有用。

contains()函数的功能:

用于检查指定的点是否在图形项的边界框内部。这个函数通常用于判断鼠标点击是否在图形项上,从而实现交互功能。

  • 功能:检查指定的点是否在图形项的边界框内部。
  • 参数QPointF类型的点坐标。
  • 返回值:如果点在图形项的边界框内部,则返回true;否则返回false

使用示例:

下面是一个简单的示例,演示了如何使用contains()函数来检查一个点是否在图形项

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@Hwang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值