Qt 鼠标点击自定义标题栏可拖动

  • Post author:
  • Post category:其他




Qt 鼠标点击自定义标题栏可拖动

在实际应用中,常常会隐藏掉Qt自带的标题栏,导致窗口无法拖动,需要自己添加鼠标事件,达到窗口拖动效果,但又不想鼠标点击整个窗口的任意位置都可拖动,所以只需要设计鼠标点击自定义的标题栏时可拖动即可。



具体步骤:



1.定义一个用来接收鼠标位置的坐标
//.h
static QPoint last;
//.cpp
//类外初始化
QPoint Tip::last(0,0);


2.自定义标题栏高度
#define WIN_TITLE_HEIGHT 30


3.实现鼠标事件
//鼠标按下
void mousePressEvent(QMouseEvent* event);
//鼠标移动
void mouseMoveEvent(QMouseEvent* event);
//鼠标释放
void mouseReleaseEvent(QMouseEvent* event);


通过鼠标点击事件,判断鼠标是否在标题栏,如果是,则获取当前位置;鼠标移动事件实时改变窗口位置

void Tip::mousePressEvent(QMouseEvent *event)//判断鼠标点击时是否小于标题栏高度
{
    if(event->y()<TITLE_HEIGHT)
    {
        last = event->globalPos();//获取坐标
    }
}

void Tip::mouseMoveEvent(QMouseEvent *event)//鼠标移动,实时修改窗口的坐标
{
    if(event->y()<TITLE_HEIGHT)
    {
        int dx = event->globalX() - last.x();
        int dy = event->globalY() - last.y();
        last = event->globalPos();
        this->move(this->x()+dx,this->y()+dy);
    }
}

void Tip::mouseReleaseEvent(QMouseEvent *event)//鼠标释放
{
    if(event->y()<TITLE_HEIGHT)
    {
        int dx = event->globalX() - last.x();
        int dy = event->globalY() - last.y();
        this->move(this->x()+dx,this->y()+dy);
    }
}



完整代码



tip.h
public:
    static QPoint last;
    //鼠标按下
    void mousePressEvent(QMouseEvent* event);
    //鼠标移动
    void mouseMoveEvent(QMouseEvent* event);
    //鼠标释放
    void mouseReleaseEvent(QMouseEvent* event);


tip.cpp
#include "tip.h"
#include "ui_tip.h"
#include <QMouseEvent>

#define WIN_TITLE_HEIGHT 30

QPoint Tip::last(0,0);

Tip::Tip(QWidget *parent) :
    QDialog (parent),
    ui(new Ui::Tip)
{
    ui->setupUi(this);
}

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

void Tip::on_toolButton_clicked()
{
    close();
}


void Tip::mousePressEvent(QMouseEvent *event)//判断鼠标点击时是否小于标题栏高度
{
    if(event->y()<TITLE_HEIGHT)
    {
        last = event->globalPos();//获取坐标
    }
}

void Tip::mouseMoveEvent(QMouseEvent *event)//鼠标移动,实时修改窗口的坐标
{
    if(event->y()<TITLE_HEIGHT)
    {
        int dx = event->globalX() - last.x();
        int dy = event->globalY() - last.y();
        last = event->globalPos();
        this->move(this->x()+dx,this->y()+dy);
    }
}

void Tip::mouseReleaseEvent(QMouseEvent *event)//鼠标释放
{
    if(event->y()<TITLE_HEIGHT)
    {
        int dx = event->globalX() - last.x();
        int dy = event->globalY() - last.y();
        this->move(this->x()+dx,this->y()+dy);
    }
}



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