您的位置:首页 > 编程语言 > Qt开发

Qt学习笔记:无边框窗体的移动

2017-07-12 18:44 288 查看
类似360安全卫士界面,



鼠标只能够在绿色的位置进行点击和移动,这就是采用Qt实现的无边框窗体的移动。

其实实现无边框窗体的移动主要是靠以下三个函数:

void mousePressEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);
void mouseReleaseEvent(QMouseEvent *event);


首先 在mainwindows.cpp中,添加

setWindowFlags(Qt::FramelessWindowHint);//隐藏标题栏
m_MousePressed = false;


//鼠标按下事件,确定相对位置
void csxfwidget::mousePressEvent(QMouseEvent *event)
{
QRect *rc = new QRect(5,5,900,150);//创建一个矩形区域

if(rc->contains(this>mapFromGlobal(QCursor::pos()))==true)//确定是这个矩形区域按下
{
if(event->button()==Qt::LeftButton)
{
m_WindowPos = this->pos();
m_MousePos = event->globalPos();
this->m_MousePressed = true;
}
}
}


//鼠标移动事件
void csxfwidget::mouseMoveEvent(QMouseEvent *event)
{
if(m_MousePressed)
{
this->move(m_WindowPos+(event->globalPos()-m_MousePos));
}
}


//鼠标释放按钮事件
void csxfwidget::mouseReleaseEvent(QMouseEvent *event)
{
if(event->button()==Qt::LeftButton)
{
this->m_MousePressed = false;
}
}


mainwindows.h文件中,添加以下代码:

protected:
void mousePressEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);
void mouseReleaseEvent(QMouseEvent *event);

bool m_MousePressed;
QPoint m_MousePos;
QPoint m_WindowPos;


真正移动窗体的函数是move()函数。其他的只是为了获取相对的位置,

因此需要理解以下几个概念:

QMouseEvent中保存了两个坐标,一个是全局坐标,当然另外一个是局部坐标。

全局坐标(globalPos())即是相对于屏幕的坐标。

局部坐标(pos()),即是相对当前active widget的坐标,左上角坐标为(0, 0)。

其中:

this->mapFromGlobal(this->cursor().pos()) = event.pos()

event.pos()返回的是局部坐标,该值等于 mapFromGlobal( event.globalPos() );

因此:

if(rc->contains(this>mapFromGlobal(QCursor::pos()))==true)

可以理解为当前坐标是不是包含在所确定的Rect(矩形)中。

接下来需要理解几个点的坐标:

this->pos();

界面左上角的坐标,界面窗体固定了,其值也就固定了,和鼠标点击那个点无关。

event->pos();

鼠标事件中,相对于界面窗体左上角(0,0)的坐标。

event->globalPos();

鼠标事件中,相对于屏幕左上角(0,0)的坐标

m_WindowPos+(event->globalPos()-m_MousePos)

表示,界面上一次固定的坐标+(当前鼠标移动到最终点的相对屏幕的坐标-上次保存的相对屏幕的坐标)

即 上次固定的坐标+移动的相对坐标。

this->move(m_WindowPos+(event->globalPos()-m_MousePos));
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: