前言
在QT学习中,我们为了窗口设计美观,会将窗口自带的默认标题栏隐藏。但是这种做法不可避免会遇到一个问题,那就是隐藏默认标题栏后的窗口如何移动?本篇,作者将分享如何移动无标题栏窗口。
一、实现效果
- 在窗口的任意位置,按下鼠标左键的同时拖动鼠标,即可完成窗口移动,如下图所示。
二、基本知识
1.鼠标事件
在一个窗口中,按下鼠标按键、鼠标移动、松开鼠标按键都会产生鼠标事件QMouseEvent
(1)鼠标按下事件:void mousePressEvent(QMouseEvent *event);
- 在窗口类中重写鼠标按下事件,如下图所示
- 引用QDebug,在触发事件中打印字符"mousePressEvent"
- 运行程序,窗口中按下鼠标左键(或右键)打印字符,可以看到按下三次鼠标打印三次字符
(2)鼠标移动事件:void mouseMoveEvent(QMouseEvent *event);
- 在窗口类中重新鼠标移动事件,如下图所示
- 引用QDebug,在触发事件中打印字符"mouseMoveEvent"
- 运行程序,窗口中按下鼠标任意键并移动鼠标时,打印字符"mouseMoveEvent"
2.pos函数
- pos函数是Qt获取坐标函数,不同对象调用pos函数得到的坐标不同。
【例】窗口调用pos函数与鼠标事件调用pos函数,如下图所示。
三、核心代码
- 了解了鼠标事件和pos函数后,我们对其综合运用达到移动无标题栏窗口的作用,具体思路如下。
(1)在类中,重新定义鼠标按下事件和鼠标移动事件,并创建clickPos记录鼠标点击时的坐标
//鼠标按下事件
void mousePressEvent(QMouseEvent *event);
//鼠标移动事件
void mouseMoveEvent(QMouseEvent *event);
//创建点对象,记录鼠标点击时的坐标
QPoint clickPos;
(2)重新鼠标按下事件和鼠标移动事件内容
void regscreen::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton)
{
clickPos.setX(event->pos().x());
clickPos.setY(event->pos().y());
}
}
void regscreen::mouseMoveEvent(QMouseEvent *event)
{
if (event->buttons() == Qt::LeftButton)
{
this->move(this->pos()+event->pos()-this->clickPos);
}
}
(3)窗口移动新坐标为什么是this->pos()+event->pos()-this->clickPos
?
至此,我们就完成了无标题栏窗口的移动,学会的小伙伴赶紧动手操作试试效果吧!
总结
以上就是【QT学习】如何移动无标题栏窗口的所有内容,希望大家阅读后都能有所收获!原创不易,转载请标明出处,若文章出现有误之处,欢迎读者留言指正批评!