QT 设置窗口可移动及边缘背景

本文介绍了如何创建一个可移动且具有透明边框的QDialog。通过重写鼠标事件和paintEvent,实现了窗口的拖动功能,并使用QPainter绘制了阴影效果,使窗口看起来更加美观。代码示例中详细展示了相关的C++实现。
摘要由CSDN通过智能技术生成
.h
#ifndef MOVABLE_BASE_DLG_H
#define MOVABLE_BASE_DLG_H
#include <QDialog>
class QPoint;
class QPaintEvent;
class OBSMovableDialog :public QDialog{
public:
    OBSMovableDialog(QWidget* parent);
    ~OBSMovableDialog(){};
protected:
    virtual void mouseReleaseEvent(QMouseEvent *event) override;
    virtual void mouseMoveEvent(QMouseEvent *event) override;
    virtual void mousePressEvent(QMouseEvent *event) override;

    virtual void paintEvent(QPaintEvent* event) override;
    virtual void setVisible(bool visible) override;
private:
    bool            m_Drag = false;
    QPoint          m_DragPosition;

};
#endif
.cpp
#include <QCloseEvent>
#include <QPoint>
#include <QPainter>
#include <QDebug>
#include <qmat
设置窗口不可拉拽顶部进行拖动,可以重载 QWidget 的 `mousePressEvent` 和 `mouseMoveEvent` 方法,然后在 `mousePressEvent` 中记录下鼠标点击时的坐标,然后在 `mouseMoveEvent` 中计算鼠标移动的距离,如果鼠标移动的距离在一定范围内,则不移动窗口,否则移动窗口。 具体实现如下: ``` void MyWidget::mousePressEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton && event->pos().y() < 30) { m_drag = true; m_startPos = event->globalPos() - frameGeometry().topLeft(); } QWidget::mousePressEvent(event); } void MyWidget::mouseMoveEvent(QMouseEvent *event) { if (m_drag) { QPoint pos = event->globalPos() - m_startPos; if (pos.y() < 0) { pos.setY(0); } move(pos); } QWidget::mouseMoveEvent(event); } void MyWidget::mouseReleaseEvent(QMouseEvent *event) { m_drag = false; QWidget::mouseReleaseEvent(event); } ``` 在上面的代码中,我们重载了 QWidget 的 `mousePressEvent`、`mouseMoveEvent` 和 `mouseReleaseEvent` 三个方法,其中 `m_drag` 表示当前是否在拖动窗口,`m_startPos` 表示鼠标点击时的坐标。 在 `mousePressEvent` 中,如果鼠标左键点击并且点击的位置在窗口的顶部,则设置 `m_drag` 为真,并记录下鼠标点击时的坐标。 在 `mouseMoveEvent` 中,如果 `m_drag` 为真,则计算鼠标移动的距离,并根据移动的距离来移动窗口。需要注意的是,我们在移动窗口时,需要判断窗口移动后的位置是否超出了屏幕范围,如果超出了,则需要将窗口移动到屏幕边缘。 在 `mouseReleaseEvent` 中,将 `m_drag` 设置为假。 这样,就可以实现设置窗口不可拉拽顶部进行拖动的效果了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值