显示效果:
原理
在C++中使用Qt框架时,若您希望将一个QLabel(或任意QWidget)的透明度设置为80%,这通常涉及到调整窗口部件的不透明度属性,而非直接修改其背景色的透明度(尽管两者效果相似)。Qt提供了一个便捷的方法setWindowOpacity来全局性地调整一个窗口部件及其所有子部件的不透明度。
然而,需要注意的是,setWindowOpacity会影响整个窗口部件及其所有子部件的透明度,而不仅仅是背景。如果您只想改变背景而不影响文本或其他子部件,那么您需要像之前那样自定义绘制背景。所以在本实例重重写了paintEvent方法,重画背景。
通过setStyleSheet重置了显示字体的颜色。
代码
#ifndef TRANSPARENTLABEL_H
#define TRANSPARENTLABEL_H
#include <QLabel>
#include <QObject>
#include <QWidget>
class TransparentLabel : public QLabel
{
Q_OBJECT
public:
TransparentLabel(QWidget *parent = nullptr);
// QWidget interface
protected:
virtual void paintEvent(QPaintEvent *event) override;
};
#endif // TRANSPARENTLABEL_H
#include "transparentlabel.h"
#include <QPainter>
TransparentLabel::TransparentLabel(QWidget *parent):QLabel(parent)
{
setAttribute(Qt::WA_TranslucentBackground);
this->setWindowOpacity(0.7);
//设置字体颜色为白色
this->setStyleSheet("color: white;");
}
void TransparentLabel::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
// 填充背景色
QColor backgroundColor(128, 128, 128, 80); // 灰色,透明度为204(80%的255)
painter.fillRect(rect(), backgroundColor);
// 调用父类的paintEvent以绘制文本或其他内容
QLabel::paintEvent(event);
}
main.cpp
#include <QApplication>
#include "transparentlabel.h"
int main(int argc, char *argv[]) {
QApplication a(argc, argv);
TransparentLabel w;
w.setText("hello world");
w.show();
return a.exec();
}