根据你提供的代码,undo()
和redo()
函数没有实现正确的逻辑。以下是修正后的代码示例:
#include "whiteboard.h"
#include "ui_whiteboard.h"
#include <QPainter>
WhiteBoard::WhiteBoard(QWidget *parent) :
QWidget(parent),
ui(new Ui::WhiteBoard)
{
ui->setupUi(this);
setMouseTracking(true);
currentPathIndex = -1;
}
void WhiteBoard::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton) {
QPainterPath newPath;
newPath.moveTo(event->pos());
paths.append(newPath); // 将新路径添加到容器中
currentPathIndex = paths.size() - 1; // 更新当前路径索引
update();
}
}
void WhiteBoard::mouseMoveEvent(QMouseEvent *event)
{
if (event->buttons() & Qt::LeftButton) {
if (currentPathIndex >= 0 && currentPathIndex < paths.size()) {
QPainterPath& currentPath = paths[currentPathIndex]; // 获取当前路径
currentPath.lineTo(event->pos());
update();
}
}
}
void WhiteBoard::undo()
{
if (currentPathIndex > 0) { // 当前路径索引大于0才能执行撤销操作
--currentPathIndex;
update();
}
}
void WhiteBoard::redo()
{
if (currentPathIndex < paths.size() - 1) { // 当前路径索引小于最大索引才能执行重做操作
++currentPathIndex;
update();
}
}
void WhiteBoard::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
// 绘制历史路径
for (int i = 0; i <= currentPathIndex; ++i) {
const QPainterPath& path = paths[i];
painter.drawPath(path);
}
}
void WhiteBoard::keyPressEvent(QKeyEvent *event)
{
if (event->modifiers() == Qt::ControlModifier) {
if (event->key() == Qt::Key_Z) {
undo();
}
else if (event->key() == Qt::Key_Y) {
redo();
}
}
QWidget::keyPressEvent(event);
}
WhiteBoard::~WhiteBoard()
{
delete ui;
}
这个修正的代码实现了撤销(undo)和重做(redo)功能。在绘制过程中,按住鼠标左键进行绘制,使用Ctrl+Z执行撤销操作,使用Ctrl+Y执行重做操作。每次绘制操作都会将路径添加到paths
容器中,并更新当前路径索引currentPathIndex
来指示最后一条绘制的路径。
希望这次能够解决你的问题。如有其他疑问,请随时提问。
内容由零声教学AI助手提供,问题来源于学员提问