QWidget|QFrame设置背景透明且可以带有边框颜色

之前在项目中有个需求:视频播放窗口电子放大功能,需要在播放视频的QWidget上绘制一个可以拖拽的矩形框,但是单独的drawRect并不能获得焦点去拖拽。于是乎就另外想到一个办法使用一个透明的

QWidget覆盖到该窗口上,将其背景设置为透明即可,但是设置透明之后,其底色的黑色无法消除,经多方CSDN博主的成果于一身,搞定了该需求。

其实就是这么几点:

设置背景透明

setWindowOpacity(1);
this->setAttribute(Qt::WA_TranslucentBackground, true);

在该窗口绘制一个矩形框,为画刷填充一个任意的颜色,重点:将其透明度降为不为0的数值即可。实现透明效果。

void AlargeShape::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    painter.setBrush(QColor(9,151,247,1));//painter区域全部的背景色
    painter.setPen(QPen(Qt::red,2,Qt::SolidLine,Qt::RoundCap,Qt::RoundJoin));
    painter.drawRect(2, 2, end_pos.x()-X-4,end_pos.y()-Y-4);
}

源码:

#include <QFrame>
class AlargeShape : public QFrame// QWidget
{
    Q_OBJECT
public:
    QWidget* widgetShape;
    explicit AlargeShape(QWidget *parent = nullptr);
    void paint(QPainter &painter);
    void setWidgetGeometry(QPoint point);
signals:
private:
    //设置鼠标拖动窗体时的状态
   bool m_move ;
    /*记录鼠标的世界坐标.*/
    QPoint m_startPoint ;
    /*记录窗体的世界坐标.*/
    QPoint m_windowPoint ;
private:
    //记录鼠标所在的位置
    QPoint start_pos;
    QPoint end_pos;
    int X,Y;
    //记录父窗体所在的位置
    QPoint parent_pos;
    int parent_width,parent_height;
    void mousePressEvent(QMouseEvent *event) override;
    void mouseMoveEvent(QMouseEvent *event)override;
    void mouseReleaseEvent(QMouseEvent *event)override;
    void paintEvent(QPaintEvent *)override;
public:
    void SetParentPos(QPoint pos,int w,int h)
    {
        parent_pos=pos;
        parent_width=w;
        parent_height=h;
    }
    void SetStartPos(const QPoint pos){start_pos=pos;}
    void SetEndPos(const QPoint pos){end_pos=pos;}
};
#include "alargeshape.h"
#include <QMouseEvent>
#include <QPainter>
#include <QDebug>
#include <qpalette>
AlargeShape::AlargeShape(QWidget *parent) //: QWidget(parent)
{        
    this->setWindowFlags(Qt::Tool| Qt::FramelessWindowHint|Qt::WindowSystemMenuHint | Qt::WindowStaysOnTopHint);
    setObjectName("frameAlarge");

    setWindowOpacity(1);
    this->setAttribute(Qt::WA_TranslucentBackground, true);
}
/************************************************************************
 *  @描述:改变当前窗口大小,在父窗体的paintEvent中调用
 *  @参数:
 *  @返回:
 *  @作者:zhontao
 *  @时间:2020-12-23 14:57:57
************************************************************************/
void AlargeShape::paint(QPainter &painter)
{
    this->show();
    this->resize(QSize(end_pos.x()-X,end_pos.y()-Y));
}

void AlargeShape::setWidgetGeometry(QPoint point)
{
    X=point.x();
    Y=point.y();
    this->setGeometry( point.x(), point.y(),0,0);
}

void AlargeShape::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    painter.setBrush(QColor(9,151,247,1));//painter区域全部的背景色
    painter.setPen(QPen(Qt::red,2,Qt::SolidLine,Qt::RoundCap,Qt::RoundJoin));
    painter.drawRect(2, 2, end_pos.x()-X-4,end_pos.y()-Y-4);
}

void AlargeShape::mousePressEvent(QMouseEvent *event)
{
    /*当鼠标左键点击时.*/
    if (event->button() == Qt::LeftButton)
    {
        m_move = true;
        /*记录鼠标的世界坐标.*/
        m_startPoint = event->globalPos();
        /*记录窗体的世界坐标.*/
        m_windowPoint = this->frameGeometry().topLeft();
    }
}

void AlargeShape::mouseMoveEvent(QMouseEvent *event)
{
    if (event->buttons() & Qt::LeftButton)
    {
        //计算父窗口的四个角点坐标
        QPoint p_left_top=parent_pos;
        QPoint p_left_bottom=QPoint(parent_pos.x(),parent_pos.y()+parent_height);
        QPoint p_right_top=QPoint(parent_pos.x()+parent_width,parent_pos.y());
        QPoint p_right_bottom=QPoint(parent_pos.x()+parent_width,parent_pos.y()+parent_height);

//          局限矩形仅限于当前窗口内
//        /*移动中的鼠标位置相对于初始位置的相对位置.*/
//        QPoint relativePos = event->globalPos() - m_startPoint;
        if(  ((event->globalPos().x()-p_left_top.x())-(m_startPoint.x()-m_windowPoint.x()) >=0 )&&
              ((event->globalPos().x()-p_right_top.x())-(m_startPoint.x()-(m_windowPoint.x()+this->width())) <=0 ) &&
              ((event->globalPos().y()-p_left_top.y())-(m_startPoint.y()-m_windowPoint.y()) >=0)&&
              ((event->globalPos().y()-p_left_bottom.y())-(m_startPoint.y()-(m_windowPoint.y()+this->height())) <=0)
          )
        {
            /*移动中的鼠标位置相对于初始位置的相对位置.*/
            QPoint relativePos = event->globalPos() - m_startPoint;
            /*然后移动窗体即可.*/
            this->move(m_windowPoint + relativePos );
        }
    }
}
void AlargeShape::mouseReleaseEvent(QMouseEvent *event)
{
    if (event->button() == Qt::LeftButton)
    {
        /*改变移动状态.*/
        m_move = false;
    }
}

效果图:

参考博客:https://blog.csdn.net/baidu_28572705/article/details/101520946

https://blog.csdn.net/bianchengjingling22/article/details/88810546

https://blog.csdn.net/Morilence/article/details/84942374

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值