首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QGraphicsPathItem:不同的绘制元素

QGraphicsPathItem:不同的绘制元素
EN

Stack Overflow用户
提问于 2016-06-15 15:12:23
回答 2查看 789关注 0票数 0

如何绘制QGraphicsPathItem,使其在n个元素结束后逐渐消失?

每隔一秒,我就在路径的末尾添加一个QPointF,并希望以100%的不透明度显示n个元素。n-1,90%,n-2,80%等,所以路径只显示最后的10 (例如),并且平滑地消失。但是我怎样才能用qt5做到这一点呢?

我想过如何改变整个路径的颜色,但是如何在子项级别上更改它.意思是路径元素?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-16 13:20:02

我会对每个片段使用单独的QGraphicsLineItem,并独立地调整它们的不透明度:

代码语言:javascript
复制
class Object : public QObject {
  Q_OBJECT
public:
  Object();
  void add_point(QPointF point);
private:
  QGraphicsScene m_scene;
  QList<QGraphicsLineItem*> m_items;
  QPointF m_previous_point;
private slots:
  void timeout();
};

Object::Object() {
  QGraphicsView* view = new QGraphicsView();
  view->setRenderHint(QPainter::Antialiasing);
  view->setScene(&m_scene);
  view->scale(10, 10);
  view->resize(400, 200);
  view->show();
  QTimer* timer = new QTimer(this);
  timer->start(30);
  connect(timer, &QTimer::timeout, this, &Object::timeout);
}

void Object::add_point(QPointF point) {
  const int MAX_SEGMENTS = 100;
  QGraphicsLineItem* new_line = 
      m_scene.addLine(QLineF(m_previous_point, point));
  QPen pen;
  pen.setCosmetic(true);
  pen.setWidth(3);
  new_line->setPen(pen);
  m_items.append(new_line);
  while(m_items.count() > MAX_SEGMENTS) {
    delete m_items[0];
    m_items.removeFirst();
  }
  for(int i = 0; i < m_items.count(); i++) {
    m_items[i]->setOpacity(
        1.0 - 1.0 / MAX_SEGMENTS * (m_items.count() - 1 - i));
  }
  m_previous_point = point;
}

void Object::timeout() {
  double x = m_previous_point.x() + 0.1;
  add_point(QPointF(x, qSin(x)));
}
票数 2
EN

Stack Overflow用户

发布于 2016-06-15 19:40:24

它是关于重新实现QGraphicsPathItem::paint()方法(就像Kuba提到的那样),并使用QBrushQLinearGradient逐段绘制路径。

如果需要的话我可以说得更具体些。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37839348

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档