当前位置:   article > 正文

QWidget|QFrame设置背景透明且可以带有边框颜色_qt中qframe给边框加颜色

qt中qframe给边框加颜色


Chapter1 《Qt》part 6 QSS Qt样式表——界面美化1($$$)

原文链接:https://blog.csdn.net/sinat_24206709/article/details/55805254

样式表给你无聊的Qt GUI增添了重味道。

很长一段时间,Qt已经允许你使用CSS’ish样式表来装饰你的GUI。 受网络启发,样式表是一个伟大的方式来风格化你的Qt GUI,但似乎很少有人使用它们。 在本教程中,我们将使用Designer和样式表在Qt中创建一个示例对话框。 本教程假设您可以在Qt Designer中解决,并且您了解一些关于Qt布局。

第一种方法:

ui->widget->setAutoFillBackground(true);
QPalette palette;
palette.setColor(QPalette::Background, QColor(0,0,0,150)); // 最后一项为透明度
//palette.setBrush(QPalette::Background, QBrush(QPixmap(":/background.png")));
ui->widget->setPalette(palette);
  • 1
  • 2
  • 3
  • 4
  • 5

第二种方法(推荐):

this->setWindowFlags(Qt::FramelessWindowHint);//无标题栏   
this->setAttribute(Qt::WA_TranslucentBackground,true); //设置背景透明
  • 1
  • 2

记住在主widget上多加一个widget打底。

在这里插入图片描述
在这里插入图片描述

Chapter2 【QT】QSS美化——基础知识

原文链接

在这里插入图片描述

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

原文链接:https://blog.csdn.net/Stone_OverLooking/article/details/111590068

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

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

其实就是这么几点:

设置背景透明

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

在该窗口绘制一个矩形框,为画刷填充一个任意的颜色,重点:将其透明度降为不为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);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

源码:

#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;}
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
#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;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88

效果图:
在这里插入图片描述

参考链接

Qt实现两个窗口重叠,下层播放视频,上次透明显示方框

QtWidget 设置背景透明方法汇总【转】

Qt关于实现自定义标题栏/窗口时遇到的背景透明化无效问题

Chapter4 Qt 中设置窗体(QWidget)透明度的几种方法

原文链接:https://blog.csdn.net/m0_60259116/article/details/127887533

1. 设置窗体的背景色

在构造函数里添加代码,需要添加头文件qpalette或qgui

QPalette pal = palette(); 
pal.setColor(QPalette::Background, QColor(0x00,0xff,0x00,0x00)); 
setPalette(pal);
  • 1
  • 2
  • 3

通过设置窗体的背景色来实现,将背景色设置为全透。

效果: 窗口整体透明,但窗口控件不透明,QLabel控件只是字显示,控件背景色透明; 窗体客户区完全透明。

2. 使用函数

setWindowFlags(Qt::Dialog | Qt::FramelessWindowHint);//去掉标题栏
setAttribute(Qt::WA_TranslucentBackground, true);//设置窗口背景透明
  • 1
  • 2

同样在构造函数中,效果和第一种方法相同。

Chapter5 Qt之QSS基础($$$)

原文链接:https://blog.csdn.net/u011832219/article/details/128183316

Chapter6 QSS入门——简单登录界面制作

原文链接:https://blog.csdn.net/qq_39347787/article/details/130102515

Chapter7 [QT编程系列-39]:用户界面UI - 样式表QSS与样式文件快速入门($$$)

原文链接:https://blog.csdn.net/HiWangWenBing/article/details/131750858

Qt提供了一种称为Qt样式表(Qt Style Sheets)的机制,可以用于自定义和美化Qt应用程序的用户界面(UI)。

使用Qt样式表,你可以通过类似CSS的语法来定义UI元素的外观和布局,包括颜色、字体、边框、背景等。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/652908
推荐阅读
相关标签
  

闽ICP备14008679号