QGraphicsScene * scene = new QGraphicsScene;
timer = new QTimer(this);
connect(timer, &QTimer::timeout, scene, &QGraphicsScene::advance);
timer->start(33);
void Mouse::advance(int step)
if (step == 0)
return;
static auto x = 0;
setPos(x,10*sin(x));
3、QRectF boundingRect()
图形项的外接矩形。纯虚函数。所有绘制都必须限制在此外接矩形区域内。视图使用它来确定该图形项是否需要重绘。尽管图形项的形状可以是任意的,但边界矩形始终为矩形,并且不受图形项变换的影响。如果要更改图形项的边界矩形,必须首先调用prepareGeometryChange()(否则图形项会有残影)。这会通知场景即将发生的更改,以便可以更新图形项几何索引。重新实现此功能,以使视图确定哪些部分(如果有的话)需要重绘。
4、QRegion boundingRegion(const QTransform &transform)
图形项的边界区域(轮廓区域)。返回区域的坐标空间取决于transform。如果将标识QTransform作为参数传递,则此函数将返回局部坐标区域。
轮廓区域描述了图形项的视觉内容的粗略轮廓。尽管计算成本很高,但是它比boundingRect()更精确,并且避免在更新图形项时不必要的重新绘制。这对于不复杂的图形项(例如线条或简单的多边形)特别有效。如果希望此函数在场景坐标中返回QRegion,则可以传递sceneTransform()作为参数。
5、QList<QGraphicsItem *> childItems()
返回子项列表。按堆叠顺序排序。
6、QRectF childrenBoundingRect()
在本地坐标中返回此图形项的后代(其子代、孙代等)的边界矩形。在将所有后代映射到本地坐标后,该矩形将包含所有后代。这不包括该项自己的边界矩形。它仅返回其后代的累积边界矩形。
7、void clearFocus()
图形项失去键盘输入焦点。可用于文本图形项QGraphicsTextItem设置可编辑setTextInteractionFlags(Qt::TextEditorInteraction)之后。
8、QPainterPath clipPath()
返回图形项的剪切路径,剪切路径限制了图形项的外观和交互(限制了图形项可以在其中绘制和接收事件的区域)。可以通过设置ItemClipsToShape或ItemClipsChildrenToShape标志来启用剪切。剪切路径是通过将所有剪切祖先的形状相交来计算的。如果图形项设置了ItemClipsToShape,则最终剪辑将与图形项自己的形状相交。裁剪会对所有涉及的图形项造成性能损失,通常应尽可能避免使用裁剪(如果图形项始终在boundingRect()或shape()边界内绘制,则无需裁剪)。例:上面的小老鼠设置:
setFlag(QGraphicsItem::ItemClipsToShape, true);
Mouse *mouse = new Mouse;
scene->addItem(mouse);
auto path = mouse->clipPath();
qDebug()<<path.isEmpty()<<path;
即裁剪得到的绘制路径是shape()设置的路径:
裁剪之后老鼠的形状变了,不在路径范围内的被裁剪掉了。
9、bool collidesWithPath(const QPainterPath &path, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape)
图形项与路径碰撞检测。碰撞由模式决定。如果图形项与该路径相交或包含,则发送碰撞。此函数检查图形项的shape()或boundingRect()(取决于模式)是否包含在路径中,而不检查路径是否包含在图形项的shape()或boundingRect()中。
10、bool collidesWithItem(const QGraphicsItem *other, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape)
图形项间碰撞检测。如果当前图形项与其他图形项发生碰撞,则返回true;否则,返回true。否则返回false。将参数中的模式应用于其他对象,然后将生成的形状或边界矩形与当前图形项的形状进行比较,根据是否相交、包含确定是否发送碰撞。默认实现基于检测形状交集(两个图形项上都调用shape())。当形状复杂时,任意形状-形状相交的复杂性会大幅度提升,因此此操作会非常耗时。可以选择在自定义图形项中重新实现此功能,以提供自定义算法。
Qt::ItemSelectionMode:
Qt::ContainsItemShape:如果被检测项的shape()完全包含在检测项内,算做碰撞。Qt::IntersectsItemShape:如果被检测项的形状shape()与检测项有交集,算做碰撞。Qt::ContainsItemBoundingRect:如果被检测项的外接矩形boundingRect()完全包含在检测项内,算做碰撞。Qt::IntersectsItemBoundingRect:如果被检测项的外接矩形boundingRect()与检测项有交集,算做碰撞。
11、QList<QGraphicsItem *> collidingItems(Qt::ItemSelectionMode mode = Qt::IntersectsItemShape)
获取与当前项碰撞的图形项列表。
12、QGraphicsItem * commonAncestorItem(const QGraphicsItem *other)
返回当前图形项与参数图形项最接近的公共祖先项。(实用)
13、bool contains(const QPointF &point)
如果图形项包含以本地坐标(图形项坐标)表示的点,则返回true。虚函数,源码:
14、QVariant data(int key)
以QVariant的形式返回此项的自定义数据。
15、void setData(int key, const QVariant &value)
将此图形项的自定义数据设置为key值。(实用)
实际上每个图形项的数据都保存在静态全局对象里的。(知识点:Q_GLOBAL_STATIC宏的作用是创建静态全局对象)
16、QTransform deviceTransform(const QTransform &viewportTransform)
返回转换后的矩阵。例:
item = new sliderGraphicsPixmapItem("",Qt::Horizontal);
gphs->addItem(item);
item->setPos(40,40);
qDebug()<<item->deviceTransform(gphv->viewportTransform()).map(QPointF(0, 0));
auto transf = gphv->viewportTransform();
transf.scale(0.5,0.5);
gphv->setTransform(transf);
qDebug()<<item->deviceTransform(gphv->viewportTransform()).map(QPointF(0, 0));
点(0,0)在经过视图的视口转换矩阵处理后在视图中所处的位置。
17、qreal effectiveOpacity()
获取有效不透明度。此值是图形项自身的不透明度及其父级和祖先级不透明度的组合。
18、void ensureVisible(const QRectF &rect = QRectF(), int xmargin = 50, int ymargin = 50)
尝试滚动视图以确保rect在视图的视口内可见。 如果rect为空rect(默认值),则默认为图形项的外接矩形。 xmargin和ymargin是视图用于页边距的像素数。如果无法达到指定的矩形,则将内容滚动到最近的有效位置。如果QGraphicsView不能查看此图形项,则此功能不执行任何操作。例:
19、QGraphicsItem *focusItem()
获取当前图形项的子项或子孙项中获得输入焦点的项。
20、void grabKeyboard()
抓取键盘输入。图形项A将接收到场景的所有键盘输入,直到发生以下事件之一:
- 变得不可见
- 从场景中删除
- 被删除
- 调用ungrabKeyboard()
- 图形项B调用grabKeyboard();当图形项B调用ungrabKeyboard()时,图形项A将重新抓取键盘输入。
当图形项抓取键盘输入时,它将收到QEvent::GrabKeyboard事件。当它失去键盘输入时,它会收到QEvent::UngrabKeyboard事件。这些事件可用于通过获取输入焦点以外的其他方式检测图形项何时获得或失去键盘控制权。几乎没有必要在Qt中显式地抓住键盘,因为Qt会智能地抓住并释放它。只有可见的图形项才能获取键盘输入。在不可见的图形项上调用grabKeyboard()无效。
21、void grabMouse()
抓住鼠标输入。图形项A将接收该场景的所有鼠标事件,直到发生以下任何事件:
- 变得不可见
- 从场景中删除
- 目被删除
- 调用ungrabMouse()
- 图形项B调用grabMouse();当图形项B调用ungrabMouse()时,图形项A将重新获得鼠标抓取。
当图形项抓取鼠标输入时,它将收到QEvent::GrabMouse事件。当失去鼠标抓取时,它将收到QEvent::UngrabMouse事件。这些事件可用于通过接收鼠标按钮事件以外的其他方式检测图形项何时获得或失去鼠标抓取。几乎没有必要在Qt中显式地抓住鼠标,因为Qt会智能地抓住并释放它。当按下鼠标按钮时,Qt会抓住鼠标,并保持抓住鼠标,直到释放最后一个鼠标按钮为止。请注意,只有可见的图形项才能抓取鼠标输入。在不可见的图形项上调用grabMouse()无效。
22、bool hasFocus()
失去焦点返回false,获得焦点返回true。
23、void installSceneEventFilter(QGraphicsItem *filterItem)
在filterItem上为当前图形项安装一个事件过滤器,使当前图形项的所有事件首先转发到filterItem的sceneEventFilter()函数交给它过滤传递处理。
24、bool isActive()
图形项是否处于活动状态。仅当场景处于活动状态时,图形项才能处于活动状态。只有活动图形项才能获得输入焦点。
25、bool isAncestorOf(const QGraphicsItem*child)
如果当前图形项是参数图形项的祖先则返回true。
26、bool isBlockedByModalPanel(QGraphicsItem**blockingPanel = nullptr)
如果当前图形项被模态面板阻止,则返回true,否则返回false。如果blockingPanel不为nullptr,则将blockingPanel设置为阻止此图形项的模态面板。如果此图形项未被阻止,则此功能将不会设置blockingPanel。对于不在场景中的图形项,此函数始终返回false。
27、bool isClipped()
如果图形项被裁剪,则返回true。如果图形项设置了ItemClipsToShape标志,或其任何祖先设置了ItemClipsChildrenToShape标志,则该图形项将被裁剪。
28、bool isObscured(const QRectF &rect = QRectF())
如果rect被其上方任何碰撞图形项的不透明形状完全遮盖(即,Z值高于当前图形项),则返回true。(实用)
29、bool isObscuredBy(const QGraphicsItem*item)
如果当前图形项的边界矩形完全被参数中的图形项的不透明形状遮盖,则返回true。基本实现将图形项的opaqueArea()映射到该图形项的坐标系,然后检查该图形项的boundingRect()是否完全包含在映射的形状中。可以重新实现此功能,以提供一种自定义算法来确定该图形项是否被图形项遮盖。
30、bool isPanel()
图形项是否是面板。
31、bool isSelected()
图形项是否被选中。
32、bool isUnderMouse()
如果图形项当前是否位于一个视图鼠标光标的下方。(实用)
33、bool isVisibleTo(const QGraphicsItem *parent)
当前图形项是否对参数中的父项可见(即使isVisible()为true,也可能对其祖先不可见。即使isVisible()为false,它的祖先也可能可见)。参数parent可以为空的情况下,此函数将返回当前图形项对于场景是否可见。如果任何祖先被隐藏,则图形项本身将被隐式隐藏,在这种情况下,此函数将返回false。
34、bool isWidget()
当前图形项是否是QGraphicsWidget。
35、bool isWindow()
当前图形项是否是QGraphicsWidget窗口。(QGraphicsWidget对象设置了 windowFlags为Qt::Window)
36、QVariant itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant &value)
图形项状态改变的通知。见上面1.2。
37、QTransform itemTransform(const QGraphicsItem*other, bool *ok = nullptr)
返回一个QTransform,它将该图形项的坐标映射到其他图形项。如果ok不为nullptr,并且没有这种转换,则ok=false。例:
QGraphicsProxyWidget * item = new QGraphicsProxyWidget();
item->setWidget(new QPushButton("xx"));
item->setFlags(QGraphicsItem::ItemIsMovable|QGraphicsItem::ItemIsSelectable);
gphs->addItem(item);
item->setPos(50,50);
DiscButtonGraphicsPixmapItem * item2 = new DiscButtonGraphicsPixmapItem();
gphs->addItem(item2);
item2->setPos(150,150);
bool ok;
auto trsf = item2->itemTransform(item,&ok);
qDebug()<<trsf.map(QPointF(0,0))<<ok;
38、void moveBy(qreal dx, qreal dy)
水平移动dx点,垂直移动dy点。此函数等效于调用setPos(pos()+ QPointF(dx,dy))。
39、QPainterPath opaqueArea() (虚函数)
返回一个形状,该形状表示图形项的不透明区域。如果使用不透明的笔刷填充该区域,则该区域是不透明的。默认实现返回一个空的QPainterPath,指示该图形项是完全透明的。
40、void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0) (纯虚函数)
以图形项坐标绘制图形项的内容。在QGraphicsItem子类中重新实现此函数,以使用painter提供图形项的绘画实现。option参数为图形项提供样式选项,例如其状态,暴露区域等。应确保将所有绘画限制在boundingRect()的边界内。
41、QGraphicsItem *panel()
返回图形项的面板,如果该图形项没有面板,则返回nullptr。如果该图形项是面板,它将自行返回。 否则,它将返回作为面板的最接近的祖先。
42、QGraphicsItem *parentItem()
返回指向图形项父项的指针。
43、QGraphicsObject *parentObject()
返回指向图形项父项的指针,并将其转换为QGraphicsObject。如果父项不是QGraphicsObject,则返回nullptr。
44、QGraphicsWidget *parentWidget()
返回指向项的父小部件的指针。项的父小部件是最接近的QGraphicsWidget父项。
45、QPointF pos()
返回图形项的原点(本地坐标(0,0))在父坐标中的位置。 如果图形项没有父项,返回其在场景坐标中的位置。
46、void prepareGeometryChange()
准备要更改图形项的几何形状。在更改图形项的边界矩形以保持QGraphicsScene的索引最新之前,请调用此函数。
47、void removeSceneEventFilter(QGraphicsItem *filterItem)
从事件过滤器中移除图形项。
48、void resetTransform()
将所有转换属性重置为其默认值。等效于调用setTransform(QTransform())。
49、QRectF sceneBoundingRect()
通过将sceneTransform()与boundingRect()组合在一起,以场景坐标形式返回图形项的边界矩形。
50、bool sceneEventFilter(QGraphicsItem *item, QEvent *event)
过滤item的事件event。在子类中重新实现此功能可以将当前图形项用作其他图形项的事件过滤器,从而在它们能够响应之前拦截发送给这些图形项的事件。重新实现必须返回true以防止对给定事件进行进一步处理,以确保不会将其传递给监视的图形项,或者返回false来指示事件应由事件系统进一步传播。
51、QPointF scenePos()
返回图形项在场景坐标中的位置。 这等效于调用mapToScene(0,0)。
52、QTransform sceneTransform()
返回此图形项所在场景的转换矩阵。
53、void scroll(qreal dx, qreal dy, const QRectF &rect = QRectF())
用dx,dy滚动图形项的rect的区域。如果rect为空rect,则滚动图形项的边界rect。滚动后,该图形项将发布新暴露区域的更新。仅当启用QGraphicsItem::ItemCoordinateCache时才支持滚动。否则,调用此函数等效于调用update(rect)。
item3->scroll(20,20);
54、void setAcceptHoverEvents(bool enabled)
设置是否接受鼠标悬停事件。默认为不接受。
父项在他们的子项之前接受悬停进入事件,而在他们的子项之后接受离开事件。但是,如果光标进入子级,则父级不会收到悬停离开事件。父级将保持“悬停”状态,直到光标离开其区域(包括其子项区域)为止。
如果设置了父项处理子项事件,则父项将在光标经过其子项时接收悬停移动,拖动移动和放置事件,但不会接收到悬浮进入和悬浮离开事件。
55、void setAcceptedMouseButtons(Qt::MouseButtons buttons)
设置接受鼠标事件的鼠标按键。默认情况下,接受所有鼠标按键。如果某个图形项接受鼠标按钮,则在为该按键传递鼠标按下事件时,它将成为鼠标抓取器图形项。但是如果该图形项不接受鼠标按钮,则场景会将鼠标事件转发到它下面的第一个图形项。
56、void setActive(bool active)
如果active为true,并且场景为active,则图形项的面板将被激活。 否则,图形项的面板将被禁用。
如果图形项不是活动场景的一部分,则active将决定当该场景变为活动状态或将图形项添加到场景时面板发生什么情况。如果为true,则将图形项添加到场景或激活场景时,将激活图形项的面板。 否则,该图形项将保持不活动状态,而与场景的激活状态无关。
57、void setBoundingRegionGranularity(qreal granularity)
设置边界区域boundingRegion()的粒度。介于0到1之间(包括0和1)的值。默认值为0(即最低的粒度,其中边界区域对应于图形项的边界矩形)。boundingRegion()使用粒度来计算图形项的边界区域的精细程度。
58、void setCacheMode(QGraphicsItem::CacheMode mode, const QSize &logicalCacheSize = QSize())
设置图形项缓存模式。参数2仅由ItemCoordinateCache模式使用,它描述了高速缓存缓冲区的分辨率。例如为QSize(100,100),则图形项将使自身适合图形内存中的100x100像素,而不管图形项本身的逻辑大小如何。默认情况下,使用的是boundingRect()的大小。
如果图形项要花费大量时间重新绘制自身,则缓存可以加快渲染速度。在某些情况下,缓存还会降低渲染速度,特别是当图形项花费的重绘时间少于从缓存中重绘的时间时。
启用缓存后,图形项的paint()函数通常会绘制到屏幕外的像素图缓存中。对于任何后续的重绘请求,图形视图框架将从缓存中重绘。
可能需要更改QPixmapCache的缓存限制以获得最佳性能。
启用缓存并不意味着仅在响应显式update()调用时才调用该图形项的paint()函数。例如,在内存压力下,Qt可能决定删除某些缓存信息;在这种情况下,即使没有update()调用(即就像没有启用缓存一样),也会调用图形项的paint()函数。
59、void setEnabled(bool enabled)
设置是否启用。禁用的图形项是可见的,但不会收到任何事件,并且无法获得焦点或被选中。
如果禁用父项,则其所有子项也将被禁用。如果启用父项,则所有子项都将被启用,除非已明确禁用它们(如果设置子项禁用,则在禁用其父项后再次启用父项该子项将不会重新启用)。
如果安装了事件过滤器,则仍然可以在将事件传递到图形项之前对其进行拦截。此机制将忽略图形项的启用状态。
60、void setFiltersChildEvents(bool enabled)
如果enabled为true,则将图形项设置为过滤其所有子项的所有事件(即,将针对其任何子项的所有事件发送给图形项)。如果enabled为false,则图形项将仅处理其自身的事件。 默认值为false。
61、void setFocus(Qt::FocusReason focusReason = Qt::OtherFocusReason)
将键盘输入焦点赋该图形项。focusReason参数将传递到此函数生成的任何焦点事件中。 它用于说明引起图形项聚焦的原因。
只有设置了启用ItemIsFocusable标志的图形项才能接受键盘焦点。
如果图形项不可见,未处于活动状态或与场景无关,则不会立即获得输入焦点。
调用此函数的结果:当前图形项将获得焦点。 如果另一个图形项已经具有焦点,则该图形项将首先收到一个focusOutEvent事件,指示失去输入焦点。
焦点更改原因Qt::FocusReason:
- Qt::MouseFocusReason:鼠标动作。
- Qt::TabFocusReason:tab键按下。
- Qt::BacktabFocusReason:回退制表符,可能按下了Ctrl+tab或shift+tab。
- Qt::ActiveWindowFocusReason:窗口系统切换了窗口的活动状态。
- Qt::PopupFocusReason:应用程序打开/关闭一个弹出窗口,该弹出窗口获得/释放了键盘焦点。
- Qt::ShortcutFocusReason:按下了快捷键。
- Qt::MenuBarFocusReason:菜单栏获得焦点。
- Qt::OtherFocusReason:其他原因。
62、void setFocusProxy(QGraphicsItem *item)
将参数中图形项的焦点代理设置为当前图形项。
如果图形项A具有焦点代理图形项B,则当该A获得输入焦点时,B将接收输入焦点。A本身仍将具有焦点(即hasFocus()将返回true),但只有B将接收键盘输入。
焦点代理本身可以具有焦点代理,依此类推。 在这种情况下,键盘输入将由最外层的焦点代理处理。
焦点代理图形项必须与当前图形项属于同一场景。
63、void setGraphicsEffect(QGraphicsEffect *effect)
设置图形特效。见:Qt图形特效
64、void setGroup(QGraphicsItemGroup *group)
将图形项添加到图形项组。如果group为nullptr,则当前图形项将从当前所在的组中删除。
65、void setOpacity(qreal opacity)
设置不透明度,介于0.0(透明)和1.0(不透明)之间。当前图形项的不透明度与父级和祖先级不透明度合并为有效的不透明度(起最终作用)。
默认情况下,不透明度从父级传播到子级,因此,如果父级的不透明度为0.5,而子级也为0.5,则子级的有效不透明度将为0.25。
opacity属性决定传递给paint()函数的painter的状态(注意paint()的参数:paint(QPainter *painter, ...),QPainter对象是传进来的,不是创建的)。如果设置了图形项缓存,则有效属性将在呈现时应用于图形项的缓存。
有两个图形项标志会影响图形项的不透明度与父项的组合方式:ItemIgnoresParentOpacity和ItemDoesntPropagateOpacityToChildren。
注意:将图形项的不透明度设置为0不会使该图形项不可见(isVisible()返回来说true),但是该图形项将被视为不可见的图形项(不会接收到事件、不会包含在QGraphicsView::items()、QGraphicsScene::items返回的项中、可以保留焦点)。
66、void setParentItem(QGraphicsItem *newParent)
设置父项。如果newParent为nullptr,则t图形项将成为顶级图形项。此函数会将图形项隐式添加到父级场景中。
在作为newParent祖先的项上调用此函数时的行为是未定义的。
67、void setPos(const QPointF &pos) / void setX(qreal x) / void setY(qreal y)
将图形项的位置设置为pos(在父坐标中)。对于没有父项的图形项则设置其在场景中的位置。/ 设置位置的 x / y坐标。
68、void setRotation(qreal angle)
设置绕Z轴的顺时针旋转角度(以度为单位)。负值则逆时针旋转。 通常,旋转角度在(-360,360)范围内,但是也可以在此范围之外设置值(例如370度的旋转与10度的旋转相同)。图形项绕其变换原点旋转,默认情况下为左上角(0,0)。可以通过调用setTransformOriginPoint()来选择其他转换原点。
69、void setScale(qreal factor)
设置缩放比例因子。比例因子0.0将使该图形项折叠到单个点。 如果是负比例因子,则该图形项将被翻转和镜像(即旋转180度)。图形项绕其变换原点缩放,默认情况下为左上角(0,0)。 。 可以通过调用setTransformOriginPoint()来选择其他转换原点。
70、void setSelected(bool selected)
如果selected为true且图形项是可选的,则选中图形项。否则,图形项是未选中的。
如果selected为true,但图形项为不可见,禁用或无法选中,则此功能不执行任何操作。
如果图形项在组中,则此功能将切换整个组的选择状态。 如果选择了该组,则还将选择该组中的所有图形项,如果未选择该组,则不会选择该组中的任何图形项。
默认无法选中图形项。要启用选择,请设置ItemIsSelectable标志。
提供此功能是为了方便,允许单独切换图形项的所选状态。 但是,选择图形项的更常见方法是调用QGraphicsScene::setSelectionArea(),它将为场景中指定区域内的所有可见,启用和可选择的图形项调用此函数。
71、void setToolTip(const QString &toolTip)
设置工具提示文本。
72、void setTransform(const QTransform &matrix, bool combine = false)
设置变换矩阵。如果Combine为true,则将矩阵与当前矩阵合并。否则,矩阵将替换当前矩阵。(关于矩阵合并可查看QPainter详解中的第46个函数)
为了简化使用转换视图与图形项的交互,图形项提供了mapTo ...和mapFrom ...函数(见下面第4大点),可以在图形项坐标和场景坐标之间转换。
转换矩阵与图形项的rotation(),scale()和transformations()组合成一个组合的转换(都起作用),该转换将图形项的坐标系映射到其父项。
73、void setTransformOriginPoint(const QPointF &origin)
在图形项坐标中设置转换的原点。
74、void setVisible(bool visible)
设置图形项是否可见。默认情况下,图形项是可见的。
不可见的图形项不会被绘制,也不会收到任何事件。特别是,鼠标事件会直接穿过不可见的图形项,并传递到可能在后面的任何图形项。
不可见的图形项也是不可选择的,它们无法获得输入焦点。
如果某个图形项在抓取鼠标时(例如,正在接收鼠标事件时)变得不可见,它将自动丢失鼠标抓取,并且通过使该图形项再次可见也不会重新获得抓取;它必须重新按下鼠标才能重新获得鼠标抓取。
不可见的图形项也不会具有焦点,因此,如果该图形项在变得不可见时具有焦点,它将失去焦点,并且仅通过使该图形项再次可见并不会重新获得焦点。
如果隐藏父项,则其所有子项也将被隐藏。如果显示父项,则将显示所有子项,除非已将它们显式隐藏。
75、void setZValue(qreal z)
设置Z值。Z值决定同级(相邻)图形项的堆叠顺序。Z值较高的同级项将始终被绘制在Z值较低的另一同级项的顶部。
76、QPainterPath shape()
以局部坐标形式返回图形项的形状。该形状有多种用途,包括碰撞检测、QGraphicsScene::items()函数等。默认实现调用boundingRect()返回简单的矩形形状,但是子类可以重新实现此函数以为非矩形图形项返回更准确的形状。例如,圆形图形项可以选择返回椭圆形以更好地进行碰撞检测。例如:
QPainterPath RoundItem::shape() const
QPainterPath path;
path.addEllipse(boundingRect());
return path;
77、void stackBefore(const QGraphicsItem *sibling)
在当前图形项前面堆叠参数中的图形项(要求两个图形项必须共享相同的父项,或者都必须是顶级图形项)。当前图形项必须与参数中的图形项有相同的Z值,否则调用此函数将无效。默认情况下,所有同级图形项都按插入顺序堆叠(即添加的第一个图形项在添加的下一个图形项之前绘制)。如果两个图形项的Z值不同,则会在顶部绘制Z值最高的图形项。当Z值相同时,插入顺序将决定堆叠顺序。
item = new QGraphicsRectItem(30,30,40,40);
item->setFlags(QGraphicsItem::ItemIsMovable|QGraphicsItem::ItemIsSelectable);
gphs->addItem(item);
item->setBrush(Qt::red);
item->setPos(100,100);
item2 = new QGraphicsRectItem(30,30,40,40);
item2->setFlags(QGraphicsItem::ItemIsMovable|QGraphicsItem::ItemIsSelectable);
gphs->addItem(item2);
item2->setPos(120,120);
item2->setBrush(Qt::blue);
item2->stackBefore(item);
78、QGraphicsObject *toGraphicsObject() (实用)
如果该类实际上是QGraphicsObject,则将图形项转成QGraphicsObject。
79、QGraphicsItem *topLevelItem()
返回图形项的顶级图形项。顶级图形项是其父项为nullptr的图形项项的最高级祖先项。如果某项没有父项,则返回其自身的指针(即顶级项是其自身的顶级项)。
80、QGraphicsWidget *topLevelWidget
()
返回图形项的顶级窗口小部件的指针(即,其祖先的父级为nullptr或其父级不是窗口小部件的指针),如果图形项没有顶层窗口小部件,则返回nullptr。如果图形项是顶级窗口小部件,则此函数返回指向图形项本身的指针。
81、int type()
以int形式返回图形项的类型。所有标准的图形项类都与一个唯一值相关联。qgraphicsitem_cast()使用此类型信息来区分类型。默认实现返回UserType(65536)。
自定义项要使用qgraphicsitem_cast()需要重新实现此函数,并声明一个Type枚举值,该值等于自定义项的类型。自定义项必须返回一个大于或等于UserType(65536)的值。例:
class CustomItem : public QGraphicsItem
public:
enum { Type = UserType + 1 };
int type() const override
return Type;
82、void update(const QRectF &rect = QRectF())
重绘图形项中rect覆盖的区域。每当需要重绘图形项时(例如更改外观或大小),都可以调用此函数。如果该项不可见(即isVisible()返回false),则此函数不执行任何操作。
83、QGraphicsWidget *window()
返回图形项的窗口,如果图形项没有窗口,则返回nullptr。 如果图形项是一个窗口,它将返回自身。否则,它将返回最接近的祖先窗口。
三、事件成员函数
1、void contextMenuEvent(QGraphicsSceneContextMenuEvent *event)
上下文菜单事件。默认实现是忽略该事件。如果忽略事件(即通过调用QEvent::ignore()),事件将传播到图形项下的任何图形项。 如果没有图形项接受该事件,则该事件将被场景忽略并传播到视图。打开QMenu以响应接收到上下文菜单事件是很常见的。例:
void CustomItem::contextMenuEvent(QGraphicsSceneContextMenuEvent *event)
QMenu menu;
QAction *removeAction = menu.addAction("Remove");
QAction *markAction = menu.addAction("Mark");
QAction *selectedAction = menu.exec(event->screenPos());
// ...
2、void dragEnterEvent(QGraphicsSceneDragDropEvent *event)
拖拽进入事件。拖拽时光标进入图形项区域时,将生成拖拽进入事件。通过接受事件(即通过调用QEvent::accept()),图形项除了接受拖拽移动和拖拽离开之外,还将接受放置事件。默认情况下,图形项不接收拖放事件,要启用此功能,请调用setAcceptDrops(true)。例:
CustomItem::CustomItem()
setAcceptDrops(true);
void CustomItem::dragEnterEvent(QGraphicsSceneDragDropEvent *event)
event->setAccepted(event->mimeData()->hasFormat("text/plain"));
3、void dragLeaveEvent(QGraphicsSceneDragDropEvent *event)
拖拽离开事件。拖拽光标离开图形项区域时,将生成拖动离开事件。在事件上调用QEvent::ignore()或QEvent::accept()无效。
4、void dragMoveEvent(QGraphicsSceneDragDropEvent *event)
拖拽移动事件。拖拽光标在图形项区域内四处移动时,将生成拖拽移动事件。在事件上调用QEvent::ignore()或QEvent::accept()可以切换图形项是否接受事件发生位置的拖拽放下。
5、void dropEvent(QGraphicsSceneDragDropEvent *event)
拖拽放下事件。在事件中调用QEvent::ignore()或QEvent::accept()无效。
图形项关于拖拽的处理流程和方式和QWidget是一致的,见:Qt拖放
6、void focusInEvent(QFocusEvent *event)
获取焦点事件。
7、void focusOutEvent(QFocusEvent *event)
失去焦点事件。
8、void hoverEnterEvent(QGraphicsSceneHoverEvent *event)
鼠标悬停进入事件。默认实现调用是update()。在此事件中调用QEvent::ignore()或QEvent::accept()无效。必须设置setAcceptHoverEvents(true)。
9、void hoverLeaveEvent(QGraphicsSceneHoverEvent *event)
鼠标悬停离开事件。默认实现调用是update()。
10、void hoverMoveEvent(QGraphicsSceneHoverEvent *event)
鼠标悬停移动事件。默认实现不执行任何操作。在此事件中调用QEvent::ignore()或QEvent::accept()无效。
11、void inputMethodEvent(QInputMethodEvent *event)
输入法事件。拉丁语直接是输入字母的,输入法事件是针对非拉丁语使用输入法输入内容的事件。默认实现是忽略该事件。
12、void keyPressEvent(QKeyEvent *event)
按键按下事件。默认实现忽略该事件。如果重新实现此处理程序,则默认情况下将接受该事件。注意,只有设置了ItemIsFocusable标志并且具有键盘输入焦点的图形项才会收到该事件。
13、void keyReleaseEvent(QKeyEvent *event)
按键松开事件。默认实现忽略该事件。如果重新实现此处理程序,则默认情况下将接受该事件。注意,只有设置了ItemIsFocusable标志并且具有键盘输入焦点的图形项才会收到该事件。
14、void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event)
鼠标双击事件。双击某个图形项时,该图形项将首先收到鼠标按下事件,然后是释放事件(即单击),然后是双击事件,最后是释放事件。
在此事件中调用QEvent::ignore()或QEvent::accept()无效。
默认实现调用mousePressEvent()。
如果一个图形项既不可选择又不可移动,则它将不会收到双击事件(在这种情况下,单次鼠标单击将被忽略,这将停止双击事件的生成)。
15、void mouseMoveEvent(QGraphicsSceneMouseEvent *event)
鼠标按下之后的移动事件。如果确实收到此事件,在此事件中调用QEvent::ignore()或QEvent::accept()无效。默认实现处理基本的图形项交互,例如选择和移动。
16、void mousePressEvent(QGraphicsSceneMouseEvent *event)
鼠标按下事件。鼠标按下事件仅传递给接受按下鼠标按钮的图形项。默认情况下,图形项接受所有鼠标按钮,但是可以通过调用setAcceptedMouseButtons()来更改它。
如果不重新实现此功能,则按下事件将传播到该图形项下面的任何最顶层图形项,并且其他鼠标事件都不会传递到该图形项。
如果确实重新实现此功能,则默认情况下将接受事件(QEvent::accept()),然后该图形项将成为鼠标捕获器。这使该图形项可以接收将来的移动,释放和双击事件。
如果在事件上调用QEvent::ignore(),则该图形项将失去鼠标抓取,并且事件将传播到下面的顶层图形项。
默认实现处理基本的图形项交互,例如选择和移动。
对于既不可移动又不可选择的图形项,事件为QEvent::ignore()。
17、void mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
鼠标释放事件。在此事件中调用QEvent::ignore()或QEvent::accept()无效。默认实现处理基本的图形项交互,例如选择和移动。
18、bool sceneEvent(QEvent *event)
接收图形项的事件。重新实现此函数以在将事件分派到专用事件处理函数(上面的各种事件)之前对其进行拦截。如果事件已被正确识别(识别出是哪种类型的事件)并在此函数处理了,则返回true;否则,返回false。
19、void wheelEvent(QGraphicsSceneWheelEvent *event)
鼠标滚轮事件。如果重新实现此功能,则默认情况下将接受事件。如果忽略该事件(即通过调用QEvent::ignore()),它将传播到图形项下面的任何图形项。如果没有图形项接受该事件,则该事件将被场景忽略,并传播到视图(例如,视图的垂直滚动条)。默认实现忽略该事件。
四、坐标映射成员函数
4.1、mapFromItem
1、QPointF mapFromItem(const QGraphicsItem *item, const QPointF &point)
将参数中图形项的坐标系中的点映射到当前图形项的坐标系,并返回映射的坐标。例:
QGraphicsRectItem * item = new QGraphicsRectItem(30,30,40,40);
item->setFlags(QGraphicsItem::ItemIsMovable|QGraphicsItem::ItemIsSelectable);
gphs->addItem(item);
item->setPos(100,100);
QGraphicsRectItem * item2 = new QGraphicsRectItem(30,30,40,40);
item2->setFlags(QGraphicsItem::ItemIsMovable|QGraphicsItem::ItemIsSelectable);
gphs->addItem(item2);
item2->setPos(120,120);
qDebug()<<item->mapFromItem(item2,QPointF(10,10));
获取B中的点在A中的映射位置。
2、QPolygonF mapFromItem(const QGraphicsItem *item, const QRectF &rect)
将参数中图形项的坐标系中的矩形映射到当前图形项的坐标系。并以多边形的形式返回映射的矩形。例:
qDebug()<<item->mapFromItem(item2,QRect(10,10,10,10));
获取B中的矩形在A中的映射位置。
3、QPolygonF mapFromItem(const QGraphicsItem *item, const QPolygonF &polygon)
与2类似,映射多边形。
4、QPainterPath mapFromItem(const QGraphicsItem *item, const QPainterPath &path)
与2类似,映射路径。
4.2、mapFromParent
1、QPointF mapFromParent(const QPointF &point)
当前图形项的父项中的参数中的点映射到在当前图形项中的位置。
item = new QGraphicsRectItem(30,30,40,40);
item->setFlags(QGraphicsItem::ItemIsMovable|QGraphicsItem::ItemIsSelectable);
gphs->addItem(item);
item->setPos(100,100);
item2 = new QGraphicsRectItem(30,30,40,40);
item2->setFlags(QGraphicsItem::ItemIsMovable|QGraphicsItem::ItemIsSelectable);
gphs->addItem(item2);
item2->setPos(120,120);
item2->setParentItem(item);
qDebug()<<item2->mapFromParent(QPointF(10,10));
2、QPolygonF mapFromParent(const QRectF &rect)
与1类似,映射矩形。返回值与4.1中的2类似。
3、QPolygonF mapFromParent(const QPolygonF &polygon)
与1类型,映射多边形。
4、QPainterPath mapFromParent(const QPainterPath &path)
与1类型,映射路径。
4.3、mapFromScene
1、QPointF mapFromScene(const QPointF &point)
参数是场景中的点,将此点映射为当前图形项坐标系中的点。
2、QPolygonF mapFromScene(const QRectF &rect)
与1类似,映射矩形。返回值与4.1中的2类似。
3、QPolygonF mapFromScene(const QPolygonF &polygon)
与1类似,映射多边形。
4、QPainterPath mapFromScene(const QPainterPath &path)
与1类型,映射路径。
4.4、mapRectFromItem
1、QRectF mapRectFromItem(const QGraphicsItem *item, const QRectF &rect)
将参数中图形项的坐标系中的矩形映射到当前图形项的坐标系。并以矩形的形式返回映射的矩形。映射方式和4.1中的2(mapFromItem)相同的,就是返回值类型不同而已,一个返回多边形一个返回矩形(从函数名就可以看出来,多了个Rect)。比较:
qDebug()<<item->mapRectFromItem(item2,QRect(10,10,10,10));
qDebug()<<item->mapFromItem(item2,QRect(10,10,10,10));
可见返回的区域是相同的。
4.5、mapRectFromParent
1、QRectF mapRectFromParent(const QRectF &rect)
将位于当前图形项的父项坐标系中的矩形映射至当前图形项的的坐标系,并以矩形的形式返回映射的矩形。映射方式和4.2中的2(mapFromParent)相同的,就是返回值类型不同而已,一个返回多边形一个返回矩形(从函数名就可以看出来,多了个Rect)。比较:
qDebug()<<item->mapFromParent(QRect(10,10,10,10));
qDebug()<<item->mapRectFromParent(QRect(10,10,10,10));
可见返回的区域是相同的。
4.6、mapRectFromScene
1、QRectF mapRectFromScene(const QRectF &rect)
将场景坐标中的矩形映射到当前图形项的坐标系,并以矩形的形式返回映射的矩形。映射方式和4.3中的2(mapFromScene)相同的,就是返回值类型不同而已,一个返回多边形一个返回矩形(从函数名就可以看出来,多了个Rect)。
4.7、mapRectToItem
1、QRectF mapRectToItem(const QGraphicsItem *item, const QRectF &rect)
和mapRectFromItem()(4.4)相反。
- mapRectFromItem():矩形在B中求它映射到A中的位置。
- mapRectToItem():矩形在A中求它在B中的位置。
item = new QGraphicsRectItem(30,30,40,40);
item->setFlags(QGraphicsItem::ItemIsMovable|QGraphicsItem::ItemIsSelectable);
gphs->addItem(item);
item->setPos(100,100);
item2 = new QGraphicsRectItem(30,30,40,40);
item2->setFlags(QGraphicsItem::ItemIsMovable|QGraphicsItem::ItemIsSelectable);
gphs->addItem(item2);
item2->setPos(120,120);
qDebug()<<"mapRectFromItem "<<item->mapRectFromItem(item2,QRect(10,10,10,10));
qDebug()<<"mapRectToItem "<<item->mapRectToItem(item2,QRect(10,10,10,10));
4.8、mapRectToParent
1、QRectF mapRectToParent(const QRectF &rect)
与mapRectFromParent()(4.5)相反。
- mapRectFromParent():将父项中的矩形映射到当前图形项中。
- mapRectToParent():将当前图形项的矩形映射到父项中。
4.9、mapRectToScene
1、QRectF mapRectToScene(const QRectF &rect)
与mapRectFromScene()(4.6)相反。
- mapRectFromScene():将场景中的矩形映射为当前图形项坐标中的矩形。
- mapRectToScene():将当前图形项坐标中的矩形映射为场景中的矩形。
4.10、mapToItem
以下4个函数和4.1(mapFromItem)4个函数对应相反的(从名字可以看出来)。
1、QPointF mapToItem(const QGraphicsItem *item, const QPointF &point)
- mapFromItem():点在B中求它映射到A中的位置。
- mapToItem():点在A中求它映射到B中的位置。
2、QPolygonF mapToItem(const QGraphicsItem *item, const QRectF &rect)
与1类似,映射矩形。
3、QPolygonF mapToItem(const QGraphicsItem *item, const QPolygonF &polygon)
与1类型,映射多边形。
4、QPainterPath mapToItem(const QGraphicsItem *item, const QPainterPath &path)
与1类型,映射路径。
4.11、mapToParent
以下4个函数和4.2(mapFromParent)4个函数对应相反的(从名字可以看出来)。
1、QPointF mapToParent(const QPointF &point)
- mapFromParent():父项中的点映射到子项的坐标系。
- mapToParent():子项中的点映射到父项的坐标系。
2、QPolygonF mapToParent(const QRectF &rect)
与1类似,映射矩形。
3、QPolygonF mapToParent(const QPolygonF &polygon)
与1类似,映射多边形。
4、QPainterPath mapToParent(const QPainterPath &path)
与1类似,映射路径。
4.12、mapToScene
以下4个函数和4.3(mapFromScene)4个函数对应相反的(从名字可以看出来)。
1、QPointF mapToScene(const QPointF &point)
- mapFromScene():将场景中的点映射为坐标系的点。
- mapToScene():将坐标系的点映射为场景中的点。
2、QPolygonF mapToScene(const QRectF &rect)
与1类似,映射矩形。
3、QPolygonF mapToScene(const QPolygonF &polygon)
与1类似,映射多边形。
4、QPainterPath mapToScene(const QPainterPath &path)
与1类似,映射路径。
五、类型转换
1、T qgraphicsitem_cast(QGraphicsItem *item)
如果图形项为T类型,则返回给定的类型T类型的图形项;否则返回nullptr。自定义图形项要正常使用此函数必须重新实现type()函数。
QGraphicsItem是用于场景QGraphicsScene中在所有图形项的基类,它是一个纯虚类,不能直接使用。子类化QGraphicsItem后,需要重新实现图形项的几何形状、碰撞检测、绘画实现、事件处理。
常用图形项:
本文将针对微前端框架 qiankun 的源码进行深入解析,在源码讲解之前,我们先来了解一下什么是 微前端。
微前端 是一种类似于微服务的架构,它将微服务的理念应用于浏览器端,即将单页面前端应用由单一的单体应用转变为多个小型前端应用聚合为一的应用。各个前端应用还可以独立开发、独立部署。同时,它们也可以在共享组件的同时进行并行开发——这些组件可以通过 NPM 或者 Git Tag、Git Submodule 来管理。
qiankun(乾坤) 就是一款由蚂蚁金服推出的比较成熟的微前端框架,基于 single-spa 进行二次开发,用于将 Web 应用由单一的单体应用转变为多个小型前端应用聚合为一的应
Qt 通过重写QGraphicItem实现绘制、拖动、缩放、旋转矩形
本例程通过重写了一个类,继承自QGraphicItem,来实现了在qgraphicsScene上绘制、拖动、缩放、旋转矩形。
效果如下:
其实要实现绘制、拖动、缩放矩形都不难,难的是在旋转之后还要支持缩放。
我的思路是:
1.实现绘制矩形:只要定义一个全局变量QRectF m_oldRect,在外面矩形大小传进来,然后在paint函数里面绘制这个矩形就行
2.实现拖动矩形:重写mousePressEvent,mouseMoveEvent
通过以上GIF可以看出两款橡皮擦都具有位置拖动和大小拖动的功能,但是方法一的红色矩形框在一些特殊情况下的位置时,会出现无效的问题,但是方法二不存在这个问题。方法二:继承QGraphicsRectItem实现的橡皮擦功能。(gif中蓝色矩形框)方法一:继承QGraphicsItem实现橡皮擦功能。(gif中红色矩形框)
Header: #include < QGraphicsItem >
qmake: QT += widgets
Inherited By: QAbstractGraphicsShapeItem, QGraphicsItemGroup, QGraphicsLineItem, QGraphicsObject, and QGraphicsPixmapItem;
//此枚举描述QGraphicsItem的缓存模式。缓存通过分配和渲染到屏幕外像素缓冲区来加速渲.
由于工作需要,要求实现一个类似画图软件的项目,于是开始研究Qt图元相关的操作,现在有空记录一下过程,写一个系列文章提示以下是本篇文章正文内容,下面案例可供参考图元添加和移动的功能很简单,下一节,将介绍如何使用鼠标拖动绘制图像https。...............
Graphics View提供了一个界面,它既可以管理大数量的定制2D graphical items,又可与它们交互,有一个view widget可以把这些项绘制出来,并支持旋转与缩放。这个柜架也包含一个事件传播结构,对于在scene中的这些items,它具有双精度的交互能力。Items能处理键盘事件,鼠标的按,移动、释放、双击事件,也可以跟踪鼠标移动。Graphics View使用BSP树来提...
文章目录详述变换绘制排序事件自定义数据公共类型enum CacheModeenum GraphicsItemChangeenum GraphicsItemFlagenum PanelModalityenum anonymous公共函数构造析构类型相关交互特殊边界相关层次关系焦点碰撞光标数据变换特效视图事件标志键鼠组可视激活坐标变换位置受保护的函数相关的函数
QGraphicsItem 类
QGraphicsItem类是QGraphicsScene中所有图形项的基类。
在工业自动化领域中,上位机程序是一种常见的控制软件,用于监视和控制各种自动化设备和生产线。上位机程序通常需要实时显示大量数据和图形化界面,以便用户能够实时掌握设备状态并进行操作。Qt是一种广泛使用的跨平台GUI应用程序开发框架,它提供了丰富的GUI组件和工具,以便开发人员快速构建功能丰富的用户界面。在本文中,我们将介绍如何使用Qt的基础类,包括QGraphicView、QTable、QModbus等来开发一个简单的上位机程序。
首先需要继承QGraphicsItem,必须重写 boundingRect() 和paint()函数,如果图形为非矩形的话,还需要再重写一下shape()函数boundingRect()返回要绘制图形项的矩形区域,所有绘画都必须限制在项目的边界内paint()用来绘制图形项shape()用来更精准的描述图形的区域,以便更好地进行碰撞检测。例如:创建一个c++项目,名为MyItemclass MyItem: public QGraphicsItem //继承QGraphicsItem。
文章目录1. 平移2. 改变尺寸3. 旋转
我们在使用QGraphicsView框架的时候,经常需要自定义QGraphicsItem,并且需要实现Item的平移、改变大小和旋转的效果。接下来介绍他们的一种实现方式
1. 平移
平移效果如下图所示:
实现方式有两种方法:
使用QGraphicsItem本身的移动标志实现。
this->setFlag(QGraphicsItem::Ite...
图形视图框架提供了一个基于图形项的模型视图编程方法,主要由场景、视图和图形项三部分组成,这三部分分别由QGraphicsScene、QGraphicsView和QGraphicsItem这三个类来表示。