QT学习笔记--无边框窗体基本实现和鼠标拖动窗体

一:无边框窗体基本实现代码

this->setWindowFlags(Qt::FramelessWindowHint|Qt::WindowMinMaxButtonsHint);

二:实现鼠标拖动窗体移动

如图所示,要将窗体移动由A移动到B点,需要用知道移动后窗体的位置(窗体左上角相对桌面的位置)。而移动后鼠标的位置是可以知道的。那么只要求得点击鼠标时(移动前)鼠标相对窗体左上角的偏移diff_pos,再与鼠标移动后的位置相加就可以得到窗体移动后的位置了。

具体代码如下:

//widget.h
#ifndef WIDGET_H
#define WIDGET_H

#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:
    Ui::Widget *ui;
private:
    void mousePressEvent(QMouseEvent *event) override;
    void mouseMoveEvent(QMouseEvent *event) override;
private:
    QPoint diff_pos;     //鼠标点击时相对窗体左上角的位移
    QPoint mouse_pos;    //鼠标点击时的位置
    QPoint window_pos;   //窗体左上角的位置
};
#endif // WIDGET_H


//widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QMouseEvent>


Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    this->setWindowFlags(Qt::FramelessWindowHint|Qt::WindowMinMaxButtonsHint);
}

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

void Widget::mousePressEvent(QMouseEvent *event)
{
    mouse_pos=event->globalPos(); //获取鼠标点击时的绝对位置
    window_pos = this->pos();     //获取窗体的位置
    diff_pos=mouse_pos-window_pos;//计算相对位移
}

void Widget::mouseMoveEvent(QMouseEvent *event)
{
    QPoint pos = event->globalPos(); //获取鼠标移动后的绝对位置
    this->move(pos-diff_pos);        //设置窗体移动到的位置
}


版权声明:本文为Bizulu001原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。