我对 QGraphicsView Framework 有两个问题。
第一个问题是关于一个特殊的界限:我想询问是否可以绘制 Snake-或Wave-Line (如链接图像中)?我会感激任何解决方案,因为我不知道如何获得窦形线。
我的第二个问题是QGraphicsItemAnimation
- 我想为QGraphicsLineItem
制作动画。现在我正在使用QGraphicsItemAnimation中的方法setPosAt()
。问题是,孔线移动了。我的目标是仅使用QGraphicsLineItem
移动QGraphicsItemAnimation
的开始或结束点。所以我想问一下这是否可行,或者是否有其他办法可以做这样的事情?
提前致谢!
亲切的问候 - PhiGamma
答案 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)
对于问题的第一部分:可能有两种方式:
一个。使用QPainterPath
和cubicTo()
方法创建“路径”,然后将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在你的超时()插槽中的项目中驱动你想要的更改。