Qt QGraphicsPathItem:以不同方式绘制元素

Qt QGraphicsPathItem:以不同方式绘制元素,qt,qt5,qgraphicsitem,Qt,Qt5,Qgraphicsitem,如何绘制一个QGraphicsPathItem,使其在结束n个元素后褪色 每隔一秒钟,我就在路径的末尾添加一个QPointF,并希望以100%不透明度显示第n个元素。n-1为90%,n-2为80%,等等。因此路径仅显示最后10个(例如),并平滑淡出。但是我怎样才能用qt5做到这一点呢 我想知道如何更改整个路径的颜色,但如何在子项级别更改它。。。这里是指路径元素吗?它是关于重新实现QGraphicsPathItem::paint()方法(如Kuba所述),并使用QBrush和QLinearGrad

如何绘制一个
QGraphicsPathItem
,使其在结束n个元素后褪色

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


我想知道如何更改整个路径的颜色,但如何在子项级别更改它。。。这里是指路径元素吗?

它是关于重新实现
QGraphicsPathItem::paint()
方法(如Kuba所述),并使用
QBrush
QLinearGradient
逐段绘制路径


如果需要,我可以更具体。

这是关于重新实现
QGraphicsPathItem::paint()
方法(如Kuba所述),并使用
QBrush
QLinearGradient
逐段绘制路径


如果需要,我可以更具体。

我会为每个片段使用单独的
QGraphicsLineItem
,并独立调整其不透明度:

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)));
}
类对象:公共QObject{
Q_对象
公众:
对象();
无效添加点(QPointF点);
私人:
qgraphicscenem_场景;
QList m_项目;
QPointF m_上一个点;
专用插槽:
无效超时();
};
对象::对象(){
QGraphicsView*视图=新的QGraphicsView();
视图->SetRenderInt(QPaint::抗锯齿);
查看->设置场景(&m_场景);
视图->比例(10,10);
查看->调整大小(400200);
查看->显示();
QTimer*定时器=新的QTimer(此);
定时器->启动(30);
连接(计时器和QTimer::timeout、this和Object::timeout);
}
void对象::添加点(QPointF点){
const int MAX_段=100;
QGraphicsLineItem*新行=
m_scene.addLine(QLineF(m_previous_point,point));
QPen笔;
笔。设置化妆品(真);
笔设置宽度(3);
新建_行->设置笔(笔);
m_items.append(新_行);
while(m_items.count()>MAX_段){
删除m_项[0];
m_items.removeFirst();
}
对于(int i=0;isetOpacity(
1.0-1.0/MAX_段*(m_items.count()-1-i));
}
m_上一个_点=点;
}
void对象::超时(){
双x=m_上一个_点.x()+0.1;
加上_点(QPointF(x,qSin(x));
}

我会为每个片段使用单独的
QGraphicsLineItem
,并独立调整其不透明度:

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)));
}
类对象:公共QObject{
Q_对象
公众:
对象();
无效添加点(QPointF点);
私人:
qgraphicscenem_场景;
QList m_项目;
QPointF m_上一个点;
专用插槽:
无效超时();
};
对象::对象(){
QGraphicsView*视图=新的QGraphicsView();
视图->SetRenderInt(QPaint::抗锯齿);
查看->设置场景(&m_场景);
视图->比例(10,10);
查看->调整大小(400200);
查看->显示();
QTimer*定时器=新的QTimer(此);
定时器->启动(30);
连接(计时器和QTimer::timeout、this和Object::timeout);
}
void对象::添加点(QPointF点){
const int MAX_段=100;
QGraphicsLineItem*新行=
m_scene.addLine(QLineF(m_previous_point,point));
QPen笔;
笔。设置化妆品(真);
笔设置宽度(3);
新建_行->设置笔(笔);
m_items.append(新_行);
while(m_items.count()>MAX_段){
删除m_项[0];
m_items.removeFirst();
}
对于(int i=0;isetOpacity(
1.0-1.0/MAX_段*(m_items.count()-1-i));
}
m_上一个_点=点;
}
void对象::超时(){
双x=m_上一个_点.x()+0.1;
加上_点(QPointF(x,qSin(x));
}

您必须重新实现绘制它的方法。如果您知道这一点,那么也许您应该改写问题,询问如何以这种方式绘制
QPainterPath
:)您必须重新实现绘制它的方法。如果您知道这一点,那么也许您应该改写问题,询问如何以这种方式绘制
QPainterPath
:)如果您可以更具体一些,那就太好了。我正在尝试做同样的事情(不同的颜色路径段),我认为QlineArgent会给我更喜欢的精致外观。如果你能更具体一点,那就太好了。我正在尝试做同样的事情(不同的颜色路径段),我认为QlineArgent会给我更喜欢的精致外观。我假设此方法也可以用于更改应用于行项目的笔的颜色?我假设此方法也可以用于更改应用于行项目的笔的颜色?