Для первой части вашего вопроса: Вероятно, двумя способами:
а. Используйте QPainterPath
и метод cubicTo()
для создания «пути», затем используйте QGraphicsPath
с созданным вами путем. Чтобы сделать это, вам нужно аппроксимировать синусоидальные волны, используя кривые Безье. Некоторая информация об этом здесь , и документация QPainterPath здесь
б. Подкласс 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, чтобы внести необходимые изменения в ваши элементы в слот timeout ().