赞
踩
往期回顾:
【QT入门】 QScrollArea实际运用之导航栏设计-CSDN博客
主要是用到Qt里的两个函数,分别是mousePressEvent鼠标按下事件和mouseMoveEvent鼠标移动事件,通过这两个函数的结合使用来实现,同时其中要用到好几个坐标位置,需要区分理解好。
先熟悉几个主要的知识点:
this->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowMinMaxButtonsHint);
设置为了无边框窗口和实现点击图标最大最小化。
- private:
- QPoint diff_pos; //鼠标和窗口的相对位移
- QPoint window_pos; //窗口的绝对位置
- QPoint mouse_pos; //鼠标的绝对位置
这里一定要搞清楚这几个位置点,否则很容易被绕晕。
窗口位置
this->pos()窗口左, 上角相对于桌面左,上角
鼠标位置
event->pos()是鼠标相对于应用程序的位置
event->globalPos()相对于桌面原点的位置,绝对位置
void mousePressEvent(QMouseEvent* event) override;
- void MainWidget::mousePressEvent(QMouseEvent* event)
- {
- mouse_pos = event->globalPos();
- window_pos = this->pos();
- diff_pos = mouse_pos - window_pos;
-
- }
当鼠标按下时,会触发该函数。通过 QMouseEvent 对象获取当前鼠标的全局位置 mouse_pos 和窗口的当前位置 window_pos。计算鼠标按下时的位置与窗口位置的差异,存储在diff_pos中,以便在移动鼠标时使用。
因为鼠标按下时这个窗口和鼠标的相对位置之差是一个固定值,之后只需要保持这个固定值不变,就可以实现窗口随鼠标移动而移动。
void mouseMoveEvent(QMouseEvent* event) override;
- void MainWidget::mouseMoveEvent(QMouseEvent * event)
- {
- QPoint pos = event->globalPos();
-
- this->move(pos - diff_pos);
- }
void move(const QPoint &);可以用来移动窗口、控件
当鼠标移动时,会触发该函数。通过 QMouseEvent 对象获取当前鼠标的全局位置 pos。
diff_pos 存储了鼠标按下时的位置与窗口位置的差异。通过 this->move(pos - diff_pos),将窗口移动到新的位置,即鼠标当前位置减去差异值。
由于在mousePressEvent 函数中记录了鼠标按下时的位置和窗口位置的差异,这样在鼠标移动时就可以根据这个差异来调整窗口的位置,实现拖动效果。
而在 mouseMoveEvent 函数中,通过计算当前鼠标位置与初始鼠标位置的差值,实时更新窗口的位置,从而实现窗口跟随鼠标移动的效果。
最后综合就实现了鼠标按下可以进行无边框窗口的拖动。
- #pragma once
-
- #include <QtWidgets/QWidget>
-
-
- class MainWidget : public QWidget
- {
- Q_OBJECT
-
- public:
- MainWidget(QWidget *parent = Q_NULLPTR);
-
- private:
- void mousePressEvent(QMouseEvent* event) override;
- void mouseMoveEvent(QMouseEvent* event) override;
-
- private:
- QPoint diff_pos; // 鼠标和窗口的相对位移
- QPoint window_pos;
- QPoint mouse_pos;
- };

- #include "MainWidget.h"
- #include <QMouseEvent>
-
- MainWidget::MainWidget(QWidget *parent)
- : QWidget(parent)
- {
- this->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowMinMaxButtonsHint);
- }
-
- void MainWidget::mousePressEvent(QMouseEvent* event)
- {
- mouse_pos = event->globalPos();
- window_pos = this->pos();
- diff_pos = mouse_pos - window_pos;
- }
-
- void MainWidget::mouseMoveEvent(QMouseEvent* event)
- {
- QPoint pos = event->globalPos();
- //this->move(pos);
- this->move(pos - diff_pos);
- }

都看到这里了,点个赞再走呗朋友~
加油吧,预祝大家变得更强!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。