在Qt中實現鼠標拖動窗口可以分爲三個步驟來做:
- 鼠標在窗口按下左鍵時,獲取到當前鼠標的位置,並且計算offset,即鼠標當前位置減去窗口左上角座標;
- 鼠標移動時,因爲是單擊鼠標,所以會一直執行第一步,獲取到offset,這裏就調用move函數移動窗口;
- 最後鼠標釋放時,將標誌位置爲false;
void MainWindow::eventFilter(QObject *obj, QEvent *event)
{
if (this == obj->parent())
{
switch (event->type()){
case QEvent::MouseButtonPress:
{
auto e = static_cast<QMouseEvent*>(event);
if (e->button() == Qt::LeftButton)
{
//m_isDrag寫做成員變量,初始值置false
m_isDrag = true;
//用e->globalPos()代替e->pos()爲了防止窗口抖動
m_offsetPoint = e->globalPos() - this->frameGeometry().topLeft();
}
event->accept();
}
case QEvent::MouseMove:
{
auto e = static_cast<QMouseEvent*>(event);
if (m_isDrag)
{
this->move(e->globalPos() - m_offsetPoint);
}
event->accept();
}
case QEvent::MouseButtonRelease:
{
auto e = static_cast<QMouseEvent*>(event);
if (e->button() == Qt:LeftButton)
{
m_isDrag = false;
}
}
}
}
}