WhiteBoard::WhiteBoard(QWidget *parent) : QWidget(parent), ui(new Ui::WhiteBoard) { ui->setupUi(this); setMouseTracking(true); currentPathIndex = -1; } voi...-QT开发中文网" />

QT开发中文网

#include "whiteboard.h" #include "ui_whiteboard.h" #include WhiteBoard::WhiteBoard(QWidget *parent) : QWidget(parent), ui(new Ui::WhiteBoard) { ui->setupUi(this); setMouseTracking(true); currentPathIndex = -1; } voi...

根据你提供的代码,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助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处: WhiteBoard::WhiteBoard(QWidget *parent) : QWidget(parent), ui(new Ui::WhiteBoard) { ui->setupUi(this); setMouseTracking(true); currentPathIndex = -1; } voi...">https://qt.0voice.com/?id=11856

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?