Qt进阶-鼠标拖动移动窗体
正常情况下,鼠标拖动标题栏才能移动窗体,如果想拖动窗体内部移动或者窗体为无边框,可通过鼠标事件移动窗体:
ui->widget->installEventFilter(this); //注册事件过滤器
//事件过滤器
bool Widget::eventFilter(QObject *watched, QEvent *event)
{
static bool isMousePressed = false; //鼠标是否按下
static QPoint mousePos; //鼠标按下位置在窗体中的坐标
QMouseEvent *ev = static_cast<QMouseEvent *>(event);
//鼠标左键按下
if (ev->type()==QEvent::MouseButtonPress)
{
if (ev->button()==Qt::LeftButton)
{
isMousePressed = true;
mousePos = ev->globalPos() - pos(); //鼠标全局坐标-窗体左上顶点坐标
}
else
{
exit(0);
}
}
else if (ev->type() == QEvent::MouseButtonRelease)
{
isMousePressed = false;
return true;
}
else if (ev->type() == QEvent::MouseMove)
{
if (isMousePressed && (ev->buttons() && Qt::LeftButton))
{
this->move(ev->globalPos() - mousePos);
return true;
}
}
return QWidget::eventFilter(watched, event);;
}