Qt学习笔记:无边框窗体的移动
2017-07-12 18:44
288 查看
类似360安全卫士界面,
![](https://oscdn.geek-share.com/Uploads/Images/Content/202007/20/f140c9eef1cbb037862a54593d63714b)
鼠标只能够在绿色的位置进行点击和移动,这就是采用Qt实现的无边框窗体的移动。
其实实现无边框窗体的移动主要是靠以下三个函数:
首先 在mainwindows.cpp中,添加
mainwindows.h文件中,添加以下代码:
真正移动窗体的函数是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));
鼠标只能够在绿色的位置进行点击和移动,这就是采用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));
相关文章推荐
- Qt学习二:移动无边框窗体
- Qt学习笔记:自定义窗体的移动+控件图标
- Qt 移动开发,学习笔记 【一】
- Qt移动无边框窗体
- Qt 无边框、透明、可移动、的个性窗体案例详解
- Qt 无边框、透明、可移动、的个性窗体案例详解
- Qt 无边框、透明、可移动、的个性窗体案例详解
- Qt 无边框、透明、可移动、的个性窗体案例详解
- Qt 无边框、透明、可移动、的个性窗体案例详解(转载)
- QT实现无边框的可移动窗体
- 用Qt实现窗体的无边框、可移动、透明不规则显示(需背景透明的图片)
- qt 移动无边框的窗体
- Qt 无边框、透明、可移动、的个性窗体案例详解
- Qt 无边框、透明、可移动、的个性窗体案例详解
- Qt 无边框、透明、可移动、的个性窗体案例详解
- Qt 无边框、透明、可移动的个性窗体
- Qt 无边框、透明、可移动、的个性窗体案例详解
- Qt—移动无边框窗体
- QT4窗体开发学习笔记。
- Qt - 移动无边框窗体