[置顶] Qt绘制贝塞尔曲线

时间:2022-02-25 05:48:51

转载请标注出处,也算给我加加人气~~~虽然注册很久,就最近刚玩这个,先谢谢了。

同前面的文章,最近又开始接着搞那个画图的小项目。想绘制一个曲线,网上找了一堆,都是不知所云的,要么画定点的曲线、要么就copy一个画贝塞尔曲线的公式然后一堆XXXX的那些。

好像弄Qt搞的很少,网上都找不到这样的……汗~

下面是本人折腾的东西,一些代码片段,或许对以后学习这的人有一些帮助。



void XXXX::mousePressEvent(QMouseEvent *event)
{
if (m_BezierCount == 0)
{
graphic = new Bezier;
newGraphic = true;
// qDebug()<<"new Bezier:";
}
else
{
newGraphic = false;
}
switch (m_BezierCount)
{
case 0:
graphic->start = graphic->end = graphic->ctrlPoint = graphic->ctrlPoint1 = event->pos();
++m_BezierCount;
break;
case 1:
graphic->ctrlPoint = graphic->ctrlPoint1 = event->pos();
++m_BezierCount;
break;
case 2:
graphic->ctrlPoint1 = event->pos();
m_BezierCount = 0;
break;
}
}
void XXXXX::mouseMoveEvent(QMouseEvent *event)
{
   if (graphic->shapeType == Graphic::Bezier)
    {
        switch (m_BezierCount)
        {
        case 1:
            graphic->end = event->pos();
            break;
        case 2:
            graphic->ctrlPoint = graphic->ctrlPoint1 = event->pos();
            break;
        case 0:
            graphic->ctrlPoint1 = event->pos();
            break;
        }
}

//这里是painterEvent,本人用的QList保存每次绘制的图形,自定义一个onDraw(QPainter&)
void Bezier::onDraw(QPainter &painter)
{
    painter.setPen(pen);
    painter.setRenderHint(QPainter::Antialiasing,true);

    QPainterPath pathtmp;
    pathtmp.moveTo(start);
//    qDebug()<<"ctrlPoint:"<<ctrlPoint<<",ctrlPoint1:"<<ctrlPoint;
    pathtmp.cubicTo(ctrlPoint, ctrlPoint1, end);
    painter.drawPath(pathtmp);
}


写的比较乱,本人不教学,嘿嘿。不过大体的做法就这样。应该可以看得懂的。