在你提供的代码中,问题出现在mousePressEvent()
函数和mouseMoveEvent()
函数中对path
对象的处理上。
在每次鼠标左键按下时,你会创建一个新的路径(path.moveTo(event->pos())
),然后将该路径添加到历史记录中。而在鼠标移动事件中,你会将当前路径连接到鼠标移动的位置上(path.lineTo(event->pos())
)。
这就导致了当你释放鼠标左键并再次按下时,新创建的路径不包含之前已经绘制的线条部分。因此,当你移动鼠标时只能看到新路径与旧路径之间的连接线。
要解决这个问题,你需要修改如下:
- 将
QPainterPath path;
移动到类的私有成员变量中,并将其初始化代码移到构造函数里面。
class WhiteBoard : public QWidget
{
Q_OBJECT
public:
explicit WhiteBoard(QWidget *parent = nullptr);
// ...
private:
Ui::WhiteBoard *ui;
QPainterPath path; // 移动到类的私有成员变量
// ...
};
- 修改
mousePressEvent()
函数,在每次鼠标左键按下时,重新创建一个空白的路径。
void WhiteBoard::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton)
{
path = QPainterPath(); // 创建一个新的空白路径
path.moveTo(event->pos());
paths.erase(paths.begin() + currentPathIndex + 1, paths.end()); // 清除当前路径之后的历史记录
++currentPathIndex;
paths.append(path); // 将当前路径添加到历史记录中
update();
}
}
- 修改
mouseMoveEvent()
函数,在鼠标左键按下并移动时,连接当前路径。
void WhiteBoard::mouseMoveEvent(QMouseEvent *event)
{
if (event->buttons() & Qt::LeftButton)
{
path.lineTo(event->pos());
update();
}
}
通过以上修改,应该能够正常绘制线条,并保留已绘制的线条。请尝试运行代码并测试效果。
内容由零声教学AI助手提供,问题来源于学员提问