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();
    }
}
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值