对比
this->pos() 表示当前窗口左上角相对于整个桌面屏幕的位置。
如下图所示
event->globalPos() 是当前鼠标点击的位置相对于桌面的位置。
想要做到鼠标界面跟随鼠标左键移动,就需要计算他们的相对位置。
最后让鼠标移动到新的位置的时候,使用event->globalPos()-offset 就可以得到移动之后程序的左上角(this->pos) 的坐标,让界面移动到那个位置就可以了。
代码如下。
代码如下:
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QMouseEvent>
#include <QWidget>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private:
QPoint mOffset;
protected:
void mouseMoveEvent(QMouseEvent *event) override;
void mousePressEvent(QMouseEvent *event) override;
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
}
Widget::~Widget()
{
delete ui;
}
void Widget::mouseMoveEvent(QMouseEvent *event)
{
this->move(event->globalPos()-mOffset);
}
void Widget::mousePressEvent(QMouseEvent *event)
{
if(event->button()==Qt::LeftButton){
mOffset=event->globalPos()-this->pos();
}
}
ui
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Widget</class>
<widget class="QWidget" name="Widget">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>479</width>
<height>707</height>
</rect>
</property>
<property name="windowTitle">
<string>Widget</string>
</property>
<property name="styleSheet">
<string notr="true">background-color: rgb(255, 155, 67);</string>
</property>
<widget class="QLabel" name="label">
<property name="geometry">
<rect>
<x>140</x>
<y>200</y>
<width>72</width>
<height>15</height>
</rect>
</property>
<property name="text">
<string>测试</string>
</property>
</widget>
</widget>
<resources/>
<connections/>
</ui>
剩下的就是默认生成的代码。