QT开发中文网

WhiteBoard::WhiteBoard(QWidget *parent, QColor Color, QColor PenColor, int PenWith) : QWidget(parent), ui(new Ui::WhiteBoard) { ui->setupUi(this); setMouseTracking(true); currentPathIndex = -1; m_Color = Color; m_PenCo...

要在WhiteBoard类中添加贝塞尔曲线算法来画线,可以按照以下步骤进行修改:

  1. 添加新的私有成员变量到WhiteBoard类中,用于存储贝塞尔曲线的控制点和路径:
QVector<QPointF> controlPoints;  // 存储贝塞尔曲线的控制点
QPainterPath bezierPath;  // 存储贝塞尔曲线路径
  1. 在构造函数中初始化这些变量:
WhiteBoard::WhiteBoard(QWidget *parent, QColor Color, QColor PenColor, int PenWith) :
    QWidget(parent),
    ui(new Ui::WhiteBoard)
{
    ui->setupUi(this);
    setMouseTracking(true);
    currentPathIndex = -1;
    m_Color = Color;
    m_PenColor = PenColor;
    m_PenWith = PenWith;
    setBackgroundColor(m_Color);
    m_pen.setColor(PenColor);
    m_pen.setWidth(PenWith);

    controlPoints.clear();
}
  1. 修改mousePressEvent()函数,在左键点击时设置起始控制点,并清空之前的贝塞尔路径:
void WhiteBoard::mousePressEvent(QMouseEvent *event)
{
    if (event->button() == Qt::LeftButton) {
        controlPoints.clear();  // 清空之前的控制点

        QPointF startPoint = event->pos();  // 设置起始控制点为鼠标点击位置
        controlPoints.append(startPoint);

        bezierPath.moveTo(startPoint);  // 移动到起始点

        update();
    }
}
  1. 修改mouseMoveEvent()函数,根据鼠标移动位置更新贝塞尔路径:
void WhiteBoard::mouseMoveEvent(QMouseEvent *event)
{
    if (event->buttons() & Qt::LeftButton) {
        QPointF currentPoint = event->pos();  // 获取当前鼠标位置

        controlPoints.append(currentPoint);  // 添加控制点到容器中

        bezierPath = QPainterPath();  // 清空之前的贝塞尔路径
        bezierPath.moveTo(controlPoints[0]);  // 移动到起始点
        int n = controlPoints.size();

        if (n >= 4) {
            for (int i = 1; i + 2 < n; i += 3) {
                bezierPath.cubicTo(controlPoints[i], controlPoints[i+1], controlPoints[i+2]);  // 绘制三次贝塞尔曲线段
            }
        }

        update();
    }
}
  1. 修改paintEvent()函数,将贝塞尔路径绘制出来:
void WhiteBoard::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    
    // 绘制之前的直线路径(按照原有逻辑)
    for (int i = redoPaths.size()-1; i >=0 ; --i) {
        painter.setPen(redoPens[i]);
        painter.drawPath(redoPaths[i]);
    }

    for (int i = paths.size()-1; i > currentPathIndex; --i) {
        painter.setPen(pathPens[i]);
        painter.drawPath(paths[i]);
    }

    // 绘制当前正在画的贝塞尔曲线
    painter.setPen(m_pen);
    painter.drawPath(bezierPath);

    QWidget::paintEvent(event);
}

这样,当你在WhiteBoard上用鼠标左键拖动时,会根据贝塞尔曲线算法生成平滑的路径。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://qt.0voice.com/?id=11976

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?