Qt實現無邊框窗體的移動
阿新 • • 發佈:2019-01-01
本文內容,基本參考自網際網路,所以定義為轉載。
我們知道360安全衛士的介面是沒有外邊框的,去除外邊框
setWindowFlags(Qt::FramelessWindowHint);
但是去除邊框之後,無法移動整個窗體,為了實現這個移動效果,需要重新實現三個函式
void mousePressEvent(QMouseEvent * e);
void mouseReleaseEvent(QMouseEvent * e);
void mouseMoveEvent(QMouseEvent * e);
對應的實現如下
void FramelessMoveWindow::mousePressEvent(QMouseEvent *e) { if (e->button() == Qt::LeftButton) { mMousePoint = e->globalPos() - this->pos(); e->accept(); mDragWindow = true; } } void FramelessMoveWindow::mouseReleaseEvent(QMouseEvent */*e*/) { mDragWindow = false; } void FramelessMoveWindow::mouseMoveEvent(QMouseEvent *e) { if (mDragWindow && (e->buttons() && Qt::LeftButton)) { this->move(e->globalPos() - mMousePoint); e->accept(); } }
有人可能覺得只實現下面兩個函式也是可以的
void mousePressEvent(QMouseEvent * e);
void mouseMoveEvent(QMouseEvent * e);
但是當你窗體上有別的控制元件接收了press事件的話,會出現窗體閃爍的情況
在建構函式裡新增程式碼
QPushButton *button = new QPushButton(this);
button->setText("Button");
當你點選這個button的話,會發現只實現press函式和move函式,是有問題的。
關於左鍵單擊的判斷和左鍵移動的判斷的條件處理
//左鍵單擊
if (e->button() == Qt::LeftButton) {
}
//左鍵移動
if (e->buttons() && Qt::LeftButton) {
}
為什麼兩次判斷左鍵的方式不一樣呢?
因為在
void mouseMoveEvent(QMouseEvent *e)
裡面e->button()返回的一直是QT::NoButton