QGraphicsView:Snake-Line和Line动画

时间:2011-09-13 18:41:04

标签: c++ qt qgraphicsview

我对 QGraphicsView Framework 有两个问题。

第一个问题是关于一个特殊的界限:我想询问是否可以绘制 Snake-或Wave-Line (如链接图像中)?我会感激任何解决方案,因为我不知道如何获得窦形线。

Image: a snake line

我的第二个问题是QGraphicsItemAnimation - 我想为QGraphicsLineItem制作动画。现在我正在使用QGraphicsItemAnimation中的方法setPosAt()。问题是,孔线移动了。我的目标是仅使用QGraphicsLineItem移动QGraphicsItemAnimation开始或结束点。所以我想问一下这是否可行,或者是否有其他办法可以做这样的事情?

提前致谢!

亲切的问候 - PhiGamma

2 个答案:

答案 0 :(得分:1)

尝试使用以下算法显示正弦波:

const double PI = 3.14159267;
unsigned int i;
for (unsigned int i = 0; i < 400; ++i)
{
    double radians = static_cast<double>(i) / 100.0;
    double y = sin(radians);
    set_point(radians, y);
}

通过向“y”值添加偏移量,您可以向上或向下移动正弦波。 向“弧度”(或X纵坐标)添加常量将向左或向右移动正弦波。

答案 1 :(得分:1)

对于问题的第一部分:可能有两种方式:

一个。使用QPainterPathcubicTo()方法创建“路径”,然后将QGraphicsPath与您创建的路径一起使用。为此,您需要使用贝塞尔曲线逼近正弦波。有关here的一些信息,以及QPainterPath文档为here

湾子类QGraphicsItem()并覆盖paint()事件以使用QPainter绘制路径。

Sinewave::Sinewave( QGraphicsItem* pParent ) : QGraphicsObject( pParent)
{
    m_bounds = QRectF(0,0,150,100);
}

QRectF Sinewave::boundingRect() const
{
    return m_bounds;
}

void Sinewave::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    unsigned int i;
    QPointF last(0,50);
    const int numberOfCycles = 4.0;
    painter->setRenderHint(QPainter::Antialiasing);

    for (int i = 0; i < boundingRect().width(); i++)
    {
        double radians = numberOfCycles * 2.0 * PI * static_cast<double>(i) / boundingRect().width();
        double y = sin(radians);
        QPointF next(i, 50 + y*50);
        painter->drawLine(last, next);
        last = next;
    }
}

您使用哪一个取决于您希望对象做什么(例如,您是否需要在运行时更改它的形状?)。

关于动画的问题 - 否,您只能使用QGraphcisItemAnimation应用变换。我会通过使用QTimer在你的超时()插槽中的项目中驱动你想要的更改。