Qt 中boundingRect的作用是什么?

Oskar_Sun 2015-01-07 08:57:14
1.之前的理解是如果使用paint函数在自定义图形项中画图则只能在boundingRect返回的矩形范围中画图,但实际上paint函数中的图形可以比boundingRect返回的图形大,编译也可以通过,那么boundingRect的意义是什么?为什么要恰好包住我所要画的图形?
2.boundingRect的返回值大小如何在程序运行中随着我的矩形Item大小变化而变化?
...全文
3264 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Oskar_Sun 2015-01-08
  • 打赏
  • 举报
回复
引用 7 楼 openXMPP 的回复:
boundingRect我觉得你可以这么理解 这个就是你的widget和Qt框架之间的约定 也就是说你的这个widget在这个Rect内发生了update或变化 会触发Qt对这部分进行绘制 像Qt这样的 都是按需重绘区域的
嗯,略微理解了,感谢回答。
dbzhang800 2015-01-07
  • 打赏
  • 举报
回复
引用 4 楼 qq_16982701 的回复:
试过的,重载了了MouseMoveEvent函数,item就没法拖动了,应该是鼠标移动时候自动调用了event函数,item就没法动了
这说明你 override 的mouseMoveEvent() 中写的代码有问题。 注意:override 不叫重载(overload)
乔巴好萌 2015-01-07
  • 打赏
  • 举报
回复
boundingRect我觉得你可以这么理解 这个就是你的widget和Qt框架之间的约定 也就是说你的这个widget在这个Rect内发生了update或变化 会触发Qt对这部分进行绘制 像Qt这样的 都是按需重绘区域的
Oskar_Sun 2015-01-07
  • 打赏
  • 举报
回复
引用 3 楼 foruok 的回复:
[quote=引用 2 楼 qq_16982701 的回复:] [quote=引用 1 楼 foruok 的回复:] boundingRect说君子协定,你告诉 QGraphicsScene 你的 Item 这么大。scene会根据它来检测 item 之间的碰撞、重叠等。所谓君子协定,并没有强制你必须在这个 boundingRect 内绘制,你画在外面, scene 也不管你啊,除非指定了特殊标记。 要在绘制过程中动态改变 boundingRect ,自己计算大小,在 boundingRect 方法中返回即可。 博客之星,投foruok一票
了解了,多谢。 还有个问题,图形视图框架中的QMouseMoveEvent是不是跟setItemMoveable会有冲突?[/quote] 我不记得有冲突啊,你可以试试。[/quote] 试过的,重载了了MouseMoveEvent函数,item就没法拖动了,应该是鼠标移动时候自动调用了event函数,item就没法动了
foruok 2015-01-07
  • 打赏
  • 举报
回复 1
引用 2 楼 qq_16982701 的回复:
[quote=引用 1 楼 foruok 的回复:] boundingRect说君子协定,你告诉 QGraphicsScene 你的 Item 这么大。scene会根据它来检测 item 之间的碰撞、重叠等。所谓君子协定,并没有强制你必须在这个 boundingRect 内绘制,你画在外面, scene 也不管你啊,除非指定了特殊标记。 要在绘制过程中动态改变 boundingRect ,自己计算大小,在 boundingRect 方法中返回即可。 博客之星,投foruok一票
了解了,多谢。 还有个问题,图形视图框架中的QMouseMoveEvent是不是跟setItemMoveable会有冲突?[/quote] 我不记得有冲突啊,你可以试试。
Oskar_Sun 2015-01-07
  • 打赏
  • 举报
回复
引用 1 楼 foruok 的回复:
boundingRect说君子协定,你告诉 QGraphicsScene 你的 Item 这么大。scene会根据它来检测 item 之间的碰撞、重叠等。所谓君子协定,并没有强制你必须在这个 boundingRect 内绘制,你画在外面, scene 也不管你啊,除非指定了特殊标记。 要在绘制过程中动态改变 boundingRect ,自己计算大小,在 boundingRect 方法中返回即可。 博客之星,投foruok一票
了解了,多谢。 还有个问题,图形视图框架中的QMouseMoveEvent是不是跟setItemMoveable会有冲突?
foruok 2015-01-07
  • 打赏
  • 举报
回复
boundingRect说君子协定,你告诉 QGraphicsScene 你的 Item 这么大。scene会根据它来检测 item 之间的碰撞、重叠等。所谓君子协定,并没有强制你必须在这个 boundingRect 内绘制,你画在外面, scene 也不管你啊,除非指定了特殊标记。

要在绘制过程中动态改变 boundingRect ,自己计算大小,在 boundingRect 方法中返回即可。

博客之星,投foruok一票
Oskar_Sun 2015-01-07
  • 打赏
  • 举报
回复
引用 5 楼 dbzhang800 的回复:
[quote=引用 4 楼 qq_16982701 的回复:] 试过的,重载了了MouseMoveEvent函数,item就没法拖动了,应该是鼠标移动时候自动调用了event函数,item就没法动了
这说明你 override 的mouseMoveEvent() 中写的代码有问题。 注意:override 不叫重载(overload)[/quote] 哦,重新实现对吧? 我mouseMoveEvent里面是空函数。没有mouseMoveEvent直接设置ItemIsMoveable就可以拖动item,添加了函数就不能拖动了。
Qt 场景、视图、项应用实例,Qt整套源码,喜欢请下载: Link: #include class Node; class Link : public QGraphicsLineItem { public: Link(Node *formN, Node *toN); ~Link(); inline Node *formNode()const { return myFormNode; } inline Node *toNode() const { return myToNode; } void setColor(const QColor &c); QColor color()const; void trackNodes(); private: Node *myFormNode; Node *myToNode; }; Node: #ifndef NODE_H #define NODE_H #include #include class Link; class Node : public QGraphicsItem { public: Node(); ~Node(); inline void setText(const QString &text;); inline QString text()const {return myText;} inline void setTextColor(const QColor &c) { myTextColor = c; update();} inline QColor textColor()const{return myTextColor;} inline void setBackgroundColor(const QColor &c) { myBackgroundColor = c; update();} inline QColor backgroundColor()const{return myBackgroundColor;} inline void setOutLineColor(const QColor &c) { myOutLineColor = c; update();} inline QColor outLineColor()const{return myOutLineColor;} void addLink(Link *l); void removeLink(Link *l); QRectF boundingRect()const Q_DECL_OVERRIDE; QPainterPath shape() const Q_DECL_OVERRIDE; void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = Q_NULLPTR) Q_DECL_OVERRIDE; protected: void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) Q_DECL_OVERRIDE; QVariant itemChange(GraphicsItemChange change, const QVariant &value;) Q_DECL_OVERRIDE; private: QRectF outlineRect()const; int roundness(double size)const;//计算圆角 QSet<Link *> myLinks; QString myText; QColor myTextColor; QColor myBackgroundColor; QColor myOutLineColor; }; #endif // NODE_H View: #ifndef GRAPHICSVIEW_H #define GRAPHICSVIEW_H #include #include #include class GraphicsView : public QGraphicsView { Q_OBJECT public: explicit GraphicsView(QGraphicsScene *scene, QWidget *parent = 0); protected: void wheelEvent(QWheelEvent *e); }; #endif // GRAPHICSVIEW_H

16,229

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧