你可以将 mouseMoveEvent
中的绘制直线的代码替换为绘制贝塞尔曲线的逻辑。以下是修改后的代码示例:
#include <QtWidgets>
class Whiteboard : public QWidget {
public:
Whiteboard(QWidget *parent = nullptr) : QWidget(parent), isDrawing(false) {
setAttribute(Qt::WA_StaticContents);
image = QImage(size(), QImage::Format_RGB32);
image.fill(Qt::white);
}
protected:
void paintEvent(QPaintEvent *event) override {
QPainter painter(this);
painter.drawImage(event->rect(), image, event->rect());
}
void mousePressEvent(QMouseEvent *event) override {
if (event->button() == Qt::LeftButton) {
path.moveTo(event->pos());
isDrawing = true;
}
}
void mouseMoveEvent(QMouseEvent *event) override {
if ((event->buttons() & Qt::LeftButton) && isDrawing) {
path.lineTo(event->pos());
update();
}
}
void mouseReleaseEvent(QMouseEvent *event) override {
if (event->button() == Qt::LeftButton && isDrawing) {
path.lineTo(event->pos());
QPainter painter(&image);
QPen pen(Qt::black);
pen.setWidth(2);
painter.setPen(pen);
painter.drawPath(path);
isDrawing = false;
}
}
private:
QImage image;
bool isDrawing;
QPainterPath path;
};
int main(int argc, char **argv)
{
QApplication app(argc, argv);
Whiteboard whiteboard;
whiteboard.show();
return app.exec();
}
这段代码将在鼠标移动期间记录点,并在释放鼠标按钮时绘制出贝塞尔曲线。鼠标按下后,曲线的起始点会根据鼠标位置进行更新,然后在每个 mouseMoveEvent
中将当前位置添加到路径中,并在 mouseReleaseEvent
中完成曲线的绘制。
请注意,在 paintEvent
中不再直接绘制图像,而是在 mouseReleaseEvent
中更新 image
图像并在此处绘制。这样可以确保画布上的内容得到正确的持久化。
希望这能帮助你实现所需的贝塞尔曲线绘制功能!如果有任何问题,请随时提问。
内容由零声教学AI助手提供,问题来源于学员提问