为了在每次鼠标移动时记录当前位置,并在下次移动时基于该位置进行调整,可以引入一个新的成员变量来保存当前的偏移量。这样,每次鼠标事件处理后更新这个偏移量,就可以实现相应的效果。
下面是修改后的代码示例:
class yintuMusicDesign : public QMainWindow {
Q_OBJECT
public:
explicit yintuMusicDesign(QWidget *parent = nullptr);
protected:
void paintEvent(QPaintEvent *event) override;
void mousePressEvent(QMouseEvent *e) override;
void mouseMoveEvent(QMouseEvent *e) override;
void mouseReleaseEvent(QMouseEvent *e) override;
private:
QPixmap m_chann1_image; // 图片
int m_offset_y = 0; // 当前图片Y坐标偏移量
int m_last_y = 0; // 上一次鼠标位置Y坐标(用于计算移动增量)
};
yintuMusicDesign::yintuMusicDesign(QWidget *parent)
: QMainWindow{parent} {
m_chann1_image = QPixmap(":/images/11111.png"); // 加载一张图片
}
// 绘制事件
void yintuMusicDesign::paintEvent(QPaintEvent *event) {
if (m_chann1_image.isNull()) return; // 如果图片未加载则返回
QPainter painter(this);
painter.drawPixmap(0, m_offset_y, m_chann1_image); // 绘制背景图片
QMainWindow::paintEvent(event); // 调用父类的 paintEvent 方法
}
// 鼠标按下事件,记录初始Y坐标
void yintuMusicDesign::mousePressEvent(QMouseEvent *e) {
m_last_y = e->pos().y(); // 记录当前鼠标位置 Y 坐标
}
// 鼠标移动事件
void yintuMusicDesign::mouseMoveEvent(QMouseEvent *e) {
int deltaY = e->pos().y() - m_last_y; // 计算鼠标移动增量
// 更新偏移量并确保不超出边界限制
int newOffsetY = m_offset_y + deltaY;
int minOffsetY = this->height() - m_chann1_image.height(); // 最低端
int maxOffsetY = 0; // 最顶端
if (newOffsetY < maxOffsetY) { // 如果超过最顶端限制,保持在最顶端
newOffsetY = maxOffsetY;
} else if (newOffsetY > minOffsetY) { // 如果超过最低端限制,保持在最低端
newOffsetY = minOffsetY;
}
m_offset_y = newOffsetY; // 更新当前偏移量为新的有效值
update(); // 请求重新绘制窗口
m_last_y = e->pos().y(); // 更新上一次 Y 坐标为当前鼠标 Y 坐标
}
// 鼠标释放事件(可选)
void yintuMusicDesign::mouseReleaseEvent(QMouseEvent *e) { }
// 其他方法(省略)
改动说明:
- 新增成员变量
m_last_y
:用于存储上一次鼠标的位置,以便计算增量。 - 在
mousePressEvent
中初始化m_last_y
:当用户按下鼠标时,记录初始 Y 坐标。 - 在
mouseMoveEvent
中计算增量:通过比较当前和之前的 Y 坐标来得到一个增量 (deltaY
) ,并据此更新图片的位置。 - 检查边界条件并更新
m_offset_y
:确保新计算出来的偏移值不超出窗口允许的范围。
通过这种方式,每次鼠标拖动都会根据上一帧的位置进行累加,从而实现连续平滑的移动效果。如果有其他问题,请随时询问!
内容由零声教学AI助手提供,问题来源于学员提问