做项目时,为了界面美观些,把系统提供的窗口框架去掉后(无框架窗口),最令人恶心的是,无法改变无边框窗口的大小,也无法移动窗口。
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 ¤tGlobalPoint); //鼠标的位置,改变光标
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 ¤tGlobalPoint);
用于判断鼠标位置,并且改变光标形状。
void MusicWidget::region(const QPoint ¤tGlobalPoint)
{
// 获取窗体在屏幕上的位置区域,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.</