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();
    }
}

猜你喜欢

转载自blog.csdn.net/g200407331/article/details/89381589
今日推荐