使用 Qt 实现无边框窗口的鼠标拖动移动效果,核心在于重写 mousePressEventmouseMoveEvent,记录按下时鼠标相对窗口的局部坐标,并在移动过程中根据全局坐标计算窗口新位置。

MainWindow 头文件

MainWindow 中声明两个成员变量 _x / _y 用于保存鼠标按下时的局部坐标,并重写鼠标按下与移动事件:

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();


	int _x;
	int _y;

	void mouseMoveEvent(QMouseEvent *e)
	{
		move(e->globalPos().x() -_x,e->globalPos().y() - _y);

	}
	void mousePressEvent(QMouseEvent *e)
	{
	/*不然会闪*/
		_x = e->localPos().x();
		_y = e->localPos().y();
	}
private:
    Ui::MainWindow *ui;
};

MainWindow 构造函数

在构造函数中通过 setWindowFlags(Qt::FramelessWindowHint) 去掉系统边框,并把关闭按钮的点击信号绑定到窗口的 close() 槽:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
	this->setWindowTitle("QT window");

	this->setWindowFlags(Qt::FramelessWindowHint);
	ui->pushButton->setText("Close");
	this->connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(close()));
}

MainWindow::~MainWindow()
{
    delete ui;
}