要在WhiteBoard类中添加贝塞尔曲线算法来画线,可以按照以下步骤进行修改:
- 添加新的私有成员变量到WhiteBoard类中,用于存储贝塞尔曲线的控制点和路径:
QVector<QPointF> controlPoints; // 存储贝塞尔曲线的控制点
QPainterPath bezierPath; // 存储贝塞尔曲线路径
- 在构造函数中初始化这些变量:
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();
}
- 修改mousePressEvent()函数,在左键点击时设置起始控制点,并清空之前的贝塞尔路径:
void WhiteBoard::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton) {
controlPoints.clear(); // 清空之前的控制点
QPointF startPoint = event->pos(); // 设置起始控制点为鼠标点击位置
controlPoints.append(startPoint);
bezierPath.moveTo(startPoint); // 移动到起始点
update();
}
}
- 修改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();
}
}
- 修改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助手提供,问题来源于学员提问