本功能是为实现鼠标点击窗口的特定位置时,能够拖动窗体。具体实现代码如下
头文件重,需添加QPoint对象。
//Widget.h
QPoint diff_pos; // 鼠标和窗口的相对位移
QPoint window_pos;
QPoint mouse_pos;
在源文件中,重写mousePressEvent与mouseMoveEvent函数。
//Widget.cpp
void Widget::mousePressEvent(QMouseEvent* event)
{
QPoint y = event->globalPos();
QPoint x1 = this->geometry().topLeft();
int w=y.rx()-x1.rx();
int h=y.ry()-x1.ry();
if(w<=800&&h<=30)//其中800对应长度,30对应高度,可根据自己的需求进行更改
{
mouse_pos = event->globalPos();
window_pos = this->pos();
diff_pos = mouse_pos - window_pos;
}
else
{
diff_pos.rx() = 0;
diff_pos.ry() = 0;
}
}
void Widget::mouseMoveEvent(QMouseEvent* event)
{
if(FillSN::GetInstance(this)->cbb_CountryTime->underMouse() && event->buttons() & Qt::LeftButton)
return;
if(cbb_ComId->underMouse() && event->buttons() & Qt::LeftButton)
return;
if(diff_pos.rx() == 0 && diff_pos.ry() == 0)
return;
QPoint pos = event->globalPos();
this->move(pos - diff_pos);
}
其中由于下拉框控件QComboBox不能正确处理鼠标点击和移动事件,导致鼠标点击下拉框时,会进入mouseMoveEvent函数,但不会进入mousePressEvent函数,这将会导致鼠标点击下拉框时会造成窗体的瞬移,这个解决方法就是手动为点击下拉框事件进行处理,即在mouseMoveEvent函数中,通过过滤鼠标左键点击下拉框,从而避免函数中的pos被改变。