QT 實現無邊框拖動

在開發應用時有時彈窗需要居中顯示,但是窗口彈出後一般不是,而取消了標題欄,無法拖動,所以應使用如下方法使得窗口能夠拖動
轉載請註明出處。 https://blog.csdn.net/lwwl12/article/details/76448770

(C #)WinForm無邊框窗體實現雙擊縮放及拖動
在設計中經常需要移除默認邊框,並自定義軟件邊框,但是移除原始邊框後拖動又是一個問題。以下以代碼形式介紹如何實現QT窗口無邊框拖動。
先上個圖
自定義邊框及拖動功能
上圖移除了默認的邊框,添加了border並設置了顏色,同時實現了全窗口的點擊拖動。
下面開始介紹如何實現:

一. 移除默認邊框/標題欄 在QWidget的構造函數中調用setWindowFlags隱藏標題欄

setWindowFlags(Qt::FramelessWindowHint | windowFlags());
  • 1

二. 設置窗口拖動
通過重寫mouseReleaseEvent、mousePressEvent、mouseMoveEvent三個函數來實現拖動,具體代碼如下:

//testWidget.h頭文件聲明三個函數,並聲明兩個屬性

    //聲明三個鼠標事件函數
    void mouseReleaseEvent(QMouseEvent *event);
    void mousePressEvent(QMouseEvent *event);
    void mouseMoveEvent(QMouseEvent *event);

    //鼠標是否按下屬性
    bool m_bPressed=false;

    //按下後當前鼠標位置屬性
    QPoint m_point;

//testWidget.cpp中重寫三個函數實現拖動

    void testWidget::mousePressEvent(QMouseEvent *event)
    {
        if (event->button() == Qt::LeftButton)//判斷左鍵是否按下
        {
            m_bPressed = true;
            m_point = event->pos();
        }
    }

    void testWidget::mouseReleaseEvent(QMouseEvent *event)
    {
        Q_UNUSED(event);
        m_bPressed = false;
    }

    void testWidget::mouseMoveEvent(QMouseEvent *event)
    {
        if (m_bPressed)
            move(event->pos() - m_point + pos());//移動當前窗口
    }

全部代碼:

//testWidget.h

#pragma once

#include <QWidget>
#include <QMouseEvent>

class testWidget: public QWidget 
{
    Q_OBJECT

public:
    testWidget(QWidget *parent = 0);

    bool m_bPressed = true;
    QPoint m_point;

    void mouseReleaseEvent(QMouseEvent *event);
    void mousePressEvent(QMouseEvent *event);
    void mouseMoveEvent(QMouseEvent *event);
};
//testWidget.cpp


#include "testWidget.h"

testWidget::testWidget(QWidget *parent) : QWidget(parent)
{
    setWindowFlags(Qt::FramelessWindowHint | windowFlags());
    setFixedSize(100, 100);        //設置窗口大小
}

void testWidget::mouseMoveEvent(QMouseEvent *event)
{
    if (m_bPressed)
        move(event->pos() - m_point + pos());
}

void testWidget::mouseReleaseEvent(QMouseEvent *event)
{
    Q_UNUSED(event);
    m_bPressed = false;
}

void testWidget::mousePressEvent(QMouseEvent *event)
{
    if (event->button() == Qt::LeftButton)
    {
        m_bPressed = true;
        m_point = event->pos();
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章