使用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);
}