QGraphicsView放大时,paint有时不被调用,导致图像绘制不出来(2)

此前(1)解决的是在QGraphicsItem::boundingRect不变的情况下造成不绘制。这次解决的是QGraphicsItem::boundingRect随时都发生变化导致的不绘制。
这问题是我在不继承QGraphicsLineItem(调用setLine),而是继承QGraphicsItem时,绘制曲线导致的。通过调试,发现boundingRect并不是每次绘制都会调用,所以当我们改变了QGraphicsItem::boundingRect时,需要场景(scene)调用该item的boundingRect来获取到新的区域,以便判断该QGraphicsItem是不是在QGraphicsView的可视范围内,从而觉得需不需要调用QGraphicsItem::paint来绘制。

解决方式:在item改变boundingRect的地方调用prepareGeometryChange()。

由于我绘制的曲线item是根据两个QGraphicsItem的坐标去绘制的,所以我在重新计算曲线item有效范围(改变boundingRect)的函数末尾加了prepareGeometryChange()。

下图就是没加prepareGeometryChange的情况。当QGraphicsView放大时,部分曲线消失了,甚至一块有一块没。缩放回去又出现了。
正常情况:
在这里插入图片描述
放大部分曲线消失:
在这里插入图片描述
放大调整视图时,曲线不完整:
在这里插入图片描述

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要在 QGraphicsView绘制轨迹,可以通过以下步骤来实现: 1. 创建 QGraphicsScene 对象并将其设置为 QGraphicsView 的场景。 2. 创建一个自定义的 QGraphicsItem(例如,QGraphicsPathItem),用于绘制轨迹。 3. 将自定义的 QGraphicsItem 添加到 QGraphicsScene 中。 4. 在自定义的 QGraphicsItem 中实现 paint() 函数,用 QPainter 绘制轨迹。 5. 在需要绘制轨迹的地方,调用自定义的 QGraphicsItem 的相关函数,以更新轨迹的位置和形状。 以下是一个简单的示例代码,演示了如何在 QGraphicsView绘制轨迹: ```cpp #include <QGraphicsView> #include <QGraphicsScene> #include <QGraphicsPathItem> #include <QMouseEvent> class PathItem : public QGraphicsPathItem { public: PathItem(QGraphicsItem *parent = nullptr) : QGraphicsPathItem(parent) {} void addPoint(const QPointF &point) { m_path.lineTo(point); setPath(m_path); } private: QPainterPath m_path; }; class MyView : public QGraphicsView { public: MyView(QWidget *parent = nullptr) : QGraphicsView(parent) { setScene(new QGraphicsScene(this)); } protected: void mousePressEvent(QMouseEvent *event) override { if (event->button() == Qt::LeftButton) { m_pathItem = new PathItem; m_pathItem->setPen(QPen(Qt::red, 2)); scene()->addItem(m_pathItem); m_pathItem->addPoint(mapToScene(event->pos())); } } void mouseMoveEvent(QMouseEvent *event) override { if (m_pathItem) { m_pathItem->addPoint(mapToScene(event->pos())); } } void mouseReleaseEvent(QMouseEvent *event) override { Q_UNUSED(event); m_pathItem = nullptr; } private: PathItem *m_pathItem = nullptr; }; ``` 在这个例子中,我们通过继承 QGraphicsPathItem 来创建自定义的 QGraphicsItem,用于绘制轨迹。在 MyView 中,我们通过重载鼠标事件处理函数来捕获鼠标事件,并在场景中添加和更新自定义的 QGraphicsItem。当鼠标左键按下,我们创建一个新的自定义的 QGraphicsItem,并将其添加到场景中。在鼠标移动,我们将鼠标位置转换为场景坐标,并添加到自定义的 QGraphicsItem 中。当鼠标释放,我们将自定义的 QGraphicsItem 指针设置为 nullptr,以停止绘制轨迹。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值