Qt无边框窗口拖动算法
在使用Qt做桌面软件时,各个系统的窗口标题不统一,也不好看,所以就隐藏了自己写标题栏,但是隐藏系统标题栏后,就不能再拖动窗口了,所以得自己写:
// 重写这几个函数
void mousePressEvent(QMouseEvent* event);
void mouseMoveEvent(QMouseEvent* event);
void mouseReleaseEvent(QMouseEvent* event);
然后需要一个判断鼠标是否按住的变量,一个变量保存鼠标按下时的鼠标坐标减去窗口坐标差值
bool m_mousMove;
QPoint m_Difference;
然后写点代码
void DialogObj::mousePressEvent(QMouseEvent* event)
{
if (event->button() == Qt::LeftButton) {
DEBUG() << "this->m_mousMove = true;";
this->m_mousMove = true;
// 按下时保存差值
this->m_Difference = event->globalPos() - this->pos();
}
}
// 移动鼠标时随时改变窗口坐标
void DialogObj::mouseMoveEvent(QMouseEvent* event)
{
if (this->m_mousMove) {
this->move(event->globalPos() - this->m_Difference);
}
}
// 松开鼠标时重置标记,清空差值
void DialogObj::mouseReleaseEvent(QMouseEvent* event)
{
this->m_mousMove = false;
}
原理:
鼠标移动后绝对坐标 -(鼠标按下时绝对坐标 - 窗口按下时绝对坐标)= 鼠标移动后窗口绝对坐标