qt qwidget qlabel qbutton 组件 背景图 加 半透颜色 半透效果

使用qt版本 qt5.11.0

类似上面的效果。在底图上涂上一层半透的颜色。

方案:先用setstylesheet 的border-image绘制背景图,然后再组件的paintevent(QPaintEvent*)中绘制半透颜色。

代码如下。

class MyLabel:public QLabel
{
public:
    MyLabel(QWidget* parent);
    virtual void paintEvent(QPaintEvent*e) override;
};

MyLabel::MyLabel(QWidget*parent):QLabel(parent)
{
    setStyleSheet("QLabel{border-style: solid;border-color:red;border-width:2px;border-image:url(E:/temp1/wb.png);border-radius:20px;}");
}

void MyLabel::paintEvent(QPaintEvent*e)
{
    QPainter p(this);
    drawFrame(&p);
    p.fillRect(contentsRect()&e->rect(),QColor(255,0,0,25));
    QLabel::paintEvent(e);
}

经过测试,通过设置qpalette 也能达到这个效果。

对于QWidget 

需要设置如下代码,使没有任何背景,使可以绘制在paintevent(QPaintEvent*event) 中指定的半透画面或颜色

setAttribute(Qt::WA_TranslucentBackground,true);
setWindowFlag(Qt::FramelessWindowHint,true);

需设置如下代码来达到图片上的添加半透颜色的效果:

setAttribute(Qt::WA_TranslucentBackground,true);
setAttribute(Qt::WA_NoSystemBackground,false);

需要设置如下代码来达到半透图片加加半透颜色的透明的效果

setAttribute(Qt::WA_TranslucentBackground,true);
setAttribute(Qt::WA_NoSystemBackground,false);
setWindowFlag(Qt::FramelessWindowHint,true);

mywidget.h
#include <QWidget>

class MyWidget : public QWidget
{
    Q_OBJECT
public:
    explicit MyWidget(QWidget *parent = nullptr);
    virtual void paintEvent(QPaintEvent* event) override;


signals:

public slots:
    void onSliderChanged(int val);

private:
    QColor m_color;
};

mywidget.cpp


#include "mywidget.h"
#include <QPainter>
#include <QSlider>

MyWidget::MyWidget(QWidget *parent) : QWidget(parent)
{

    setAttribute(Qt::WA_TranslucentBackground,true);
    setAttribute(Qt::WA_NoSystemBackground,false);
    //setWindowFlag(Qt::FramelessWindowHint,true);
    setAutoFillBackground(true);
    QPalette palette2;
    QPixmap pix(100,100);
    QPainter painter(&pix);
    painter.fillRect(pix.rect(),QColor(0,255,0,100));
    palette2.setBrush(backgroundRole(),QBrush(pix));
    //palette2.setColor(QPalette::Background,QColor(255,0,0,100));
    setPalette(palette2);

    resize(600,500);
    m_color = QColor(0,0,255,80);
    QSlider *slider = new QSlider(Qt::Horizontal,this);
    slider->setMaximum(255);
    connect(slider,SIGNAL(valueChanged(int)),this,SLOT(onSliderChanged(int)));
}

void MyWidget::onSliderChanged(int val)
{
    m_color = QColor(0,0,255,val);
    update();
}

void MyWidget::paintEvent(QPaintEvent* event)
{

    QPainter painter1(this);
    painter1.fillRect(this->rect(), m_color);
    QWidget::paintEvent(event);
}
 

猜你喜欢

转载自blog.csdn.net/qiushangren/article/details/82428137
今日推荐