QT开发中文网

实现鼠标移动图片, 当图片移动到最底端或者最顶端时禁止移动

为了实现鼠标移动图片的功能,并且在图片达到最底端或最顶端时禁止移动,可以通过以下步骤进行:

  1. 保存当前图片的位置
  2. 在鼠标按下时记录初始位置
  3. 在鼠标移动事件中更新图片位置,并根据条件限制其移动范围。

下面是修改后的代码示例,展示了如何实现这个功能:

#include "yintuMusicDesign.h"
#include <QPainter>
#include <QMouseEvent>

yintuMusicDesign::yintuMusicDesign(QWidget *parent)
    : QMainWindow(parent), m_y(0) // 初始化 y 轴坐标为 0
{
    setFixedSize(800, 600); // 设置窗口大小
    m_chann1_image.load(":/images/11111.png"); // 加载图像
}

void yintuMusicDesign::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event);
    
    if (m_chann1_image.isNull())
        return;

    QPainter painter(this);
    painter.drawPixmap(100, m_y, m_chann1_image); // 绘制图片,y 坐标使用 m_y
}

void yintuMusicDesign::mousePressEvent(QMouseEvent *event)
{
    if (event->button() == Qt::LeftButton) {
        lastMouseY = event->pos().y(); // 记录最后的 Y 坐标
        dragging = true; // 开启拖动状态
    }
}

void yintuMusicDesign::mouseMoveEvent(QMouseEvent *event)
{
    if (dragging) {
        int dy = event->pos().y() - lastMouseY; // 计算鼠标移动的距离

        // 更新 y 坐标并限制范围
        m_y += dy;
        
        // 限制在窗口内
        if (m_y < 0) {
            m_y = 0; // 最顶端禁止移动
        } else if (m_y > height() - m_chann1_image.height()) {
            m_y = height() - m_chann1_image.height(); // 最底端禁止移动
        }

        lastMouseY = event->pos().y(); // 更新最后的 Y 坐标
        
        update(); // 请求重绘窗口以更新显示的图像位置
    }
}

void yintuMusicDesign::mouseReleaseEvent(QMouseEvent *event)
{
    if (event->button() == Qt::LeftButton) {
        dragging = false; // 停止拖动状态
    }
}

修改点说明

  1. 成员变量:

    • int m_y: 用于存储图片的当前位置。
    • bool dragging: 表示当前是否正在拖动。
    • int lastMouseY: 保存上一次鼠标的位置,以便计算移动量。
  2. 鼠标事件处理:

    • mousePressEvent()中,当用户按下左键时,记录当前鼠标的 Y 坐标和设置 draggingtrue
    • mouseMoveEvent()中,如果处于拖动状态,则计算当前 Y 坐标与上次 Y 坐标之间的差值,然后更新图片位置(即m_y)。
      • 添加逻辑来限制图片的位置:确保它不会移出窗口边界(最顶端和最底端)。
    • mouseReleaseEvent()中,当释放左键时,将 dragging 状态设置为 false

注意事项

  • 确保所加载的图片能够适应您的窗口尺寸和逻辑需求。
  • 可以根据实际需求调整初始化参数,如窗口大小、初始位置等。

这样,您就可以通过鼠标拖动来移动图像,同时保持其在预设范围内。


内容由零声教学AI助手提供,问题来源于学员提问

目录导航
  • 修改点说明
  • 注意事项
  • 本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
    转载请注明出处:https://qt.0voice.com/?id=12647

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

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

    联系我们

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

    微信号:3007537140

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

    关注我们
    x

    注册

    已经有帐号?