书接上文,在QT制作软件—去除系统自带的Dialog边框这篇博客中,我们提到了,如果移除系统自带的Dialog窗口会出现当前创建的窗口,无法拖动的情况。即如下图所示:
图1 |
---|
解决方法:(原理)
- 要拖动窗口,首先需要鼠标选中,然后进行拖动。
- 窗口左上角是有一个位置坐标的,记为a,鼠标点击的位置也是有坐标的,通过globalPos()函数可以得出,我们记录下鼠标第一次点击的坐标,可以求出两者的差值m_pt。
- 在移动的过程中虽然鼠标的位置每次都会移动,但是只要保证差值m_pt不变,我们就可以计算出,窗口左上角应该往哪个位置去移动。
解决方法:(代码)
- 在.h文件中加入两个自定义的函数,和一个用于存储差值的私有成员m_pt
protected:
void mouseMoveEvent(QMouseEvent *event); //鼠标移动
void mousePressEvent(QMouseEvent *ev); //鼠标单击
private:
QPoint m_pt; //m_pt=差值=鼠标当前位置-窗口左上角点
图2 |
---|
- 函数实现代码如下所示:(注意: 这里在.c文件要引入#include < QMouseEvent > 头文件)
void login::mouseMoveEvent(QMouseEvent *event)
{
//只允许左键拖动 持续的动作
if(event->buttons()&Qt::LeftButton) //buttons处理的是长事件,button处理的是短暂的事件
{
//窗口跟随鼠标移动
//窗口的新位置=鼠标当前位置-差值
move(event->globalPos()-m_pt);
}
}
void login::mousePressEvent(QMouseEvent *ev)
{
// 如果鼠标左键按下 单击
if(ev->button()&Qt::LeftButton)
{
//求差值=鼠标当前位置-窗口左上角点
m_pt=ev->globalPos()-this->geometry().topLeft(); //geometry()是矩形窗口,topLeft()是左上角的信息。
}
}
图3 |
---|
- 到此,我们在重新编译运行,就会发现窗口可以随意拖动了。
图4 |
---|
最后,觉得本文内容对你有所帮助的话,希望能点赞收藏,你的鼓励是对我最大的支持!