QT实现窗口可拖动
QT实现窗口可拖动需要在窗口类中重写以下三个函数:
virtual void mousePressEvent(QMouseEvent* event);
virtual void mouseMoveEvent(QMouseEvent* event);
virtual void mouseReleaseEvent(QMouseEvent* event);
同时定义以下三个类属性用于窗口拖动判断和位置偏移计算:
bool m_bDragging; // 是否正在拖动
QPoint m_poStartPosition; // 拖动开始前的鼠标位置
QPoint m_poFramePosition; // 窗体的原始位置
在构造函数内初始化变量m_bDradding = false
重写上面的三个函数:
//窗口可拖动
void SecurityUI::mousePressEvent(QMouseEvent* event)
{
if (event->button() == Qt::LeftButton)
{
QRect rect = ui.widget->rect(); //rect是鼠标实现可拖动的区域
rect.setBottom(rect.top() + 220);
if (rect.contains(event->pos()))
{
m_bDragging = true;
m_poStartPosition = event->globalPos();
m_poFramePosition = frameGeometry().topLeft();
}
}
QWidget::mousePressEvent(event);
}
void SecurityUI::mouseMoveEvent(QMouseEvent* event)
{
if (event->buttons() & Qt::LeftButton) //只响应鼠标所见
{
if (m_bDragging)
{
// delta 相对偏移量,
QPoint delta = event->globalPos() - m_poStartPosition;
// 新位置:窗体原始位置 + 偏移量
move(m_poFramePosition + delta);
}
}
QWidget::mouseMoveEvent(event);
}
void SecurityUI::mouseReleaseEvent(QMouseEvent* event)
{
m_bDragging = false;
QWidget::mouseReleaseEvent(event);
}