Qt隐藏系统的窗口框架后如何移动窗口,如何改变其大小?

在Qt项目中,为了美观移除窗口框架后,遇到无法移动和调整大小的问题。本文介绍了利用九宫格原理,通过设置窗体区域并重载鼠标事件来解决这一问题,详细讲解了实现无边框窗口移动和大小调整的步骤。
摘要由CSDN通过智能技术生成

做项目时,为了界面美观些,把系统提供的窗口框架去掉后(无框架窗口),最令人恶心的是,无法改变无边框窗口的大小,也无法移动窗口。

1、首先要了解一下九宫格,什么是九宫格?
这里写图片描述

一个窗体可以被划分为上、下、左、右、左上、左下、右上、右下、中间。除了中间部分,其余都要写代码。

设外边框(如左部分)的宽度都为 Padding;

2、在头文件中我们加一个宏定义,及一个用于判断鼠标将要移动方向的枚举:

#define PADDING 1
enum Direction   //拖动方向
{
    UP=0,
    DOWN=1,
    LEFT,
    RIGHT,
    LEFTTOP,
    LEFTBOTTOM,
    RIGHTBOTTOM,
    RIGHTTOP,
    NONE
};

3、在头文件中声明:

public:
    void region(const QPoint &currentGlobalPoint);  //鼠标的位置,改变光标
protected:
    //鼠标按下移动及释放事件
    void mousePressEvent(QMouseEvent *event);  
    void mouseMoveEvent(QMouseEvent *event);
    void mouseReleaseEvent(QMouseEvent *event);

private:
    QPoint m_movePoint;  //鼠标的位置
    bool isLeftPressDown;  // 判断左键是否按下
    Direction dir;        // 窗口大小改变时,记录改变方向

4、在构造函数中做初始化:

    this->setMinimumHeight(100);
    this->setMinimumWidth(150);
    this->setWindowFlags(Qt::FramelessWindowHint); // 设置成无边框对话框

    this->isLeftPressDown = false;
    this->dir= NONE;

    this->setMouseTracking(true);   // 追踪鼠标(没有鼠标键被按下也可以追踪鼠标的位置)

5、定义一个方法 void region(const QPoint &currentGlobalPoint);
用于判断鼠标位置,并且改变光标形状。

void MusicWidget::region(const QPoint &currentGlobalPoint)
{
    // 获取窗体在屏幕上的位置区域,topLeft为坐上角点,rightButton为右下角点
    QRect rect = this->rect();

    QPoint topLeft = this->mapToGlobal(rect.topLeft()); //将左上角的(0,0)转化为全局坐标
    QPoint rightButton = this->mapToGlobal(rect.bottomRight());

    int x = currentGlobalPoint.x(); //当前鼠标的坐标
    int y = currentGlobalPoint.y();

    if(((topLeft.x() + PADDING >= x) && (topLeft.</
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值