Qt 实现部件或者窗口(QWidget)透明效果和其他特殊效果
1、实现部件透明效果
只须在设置部件背景色时指定alpha值(rgba的第四个参数)即可,取值为0~255,取值为0时完全透明,取值为255时完全不透明。
// 实现红色按钮的半透明效果
ui->pushButton->setStyleSheet(R"(background-color:rgba(255,0,0,100);)");
2、实现窗口(QWidget)透明效果
作为顶级部件(没有父窗口)的窗口无法使用实现部件透明的方式实现透明效果,因此要使用下面的方式来实现。
// 设置窗口的不透明度为 0.5,取值范围0.0~1.0,取值为0.0时完全透明
this->setWindowOpacity(0.5);
运行程序后可以看到整个应用程序都是半透明的,但是其中的部件也被影响变为半透明的了。此时,我们就要采用下面的方式实现部件不被影响的效果。(记得注释掉setWindowOpacity)
this->setAttribute(Qt::WA_TranslucentBackground);
this->setWindowFlags(Qt::FramelessWindowHint);
这样实现的效果是背景完全透明,窗口的标题栏也没有了,要想实现半透明效果,可以使用重绘事件,如下所示(记得加上setAttribute和setWindowFlags):
void Widget::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
painter.fillRect(this->rect(),QColor(255,255,255,100));// 获取窗口的内部矩形并设置为半透明
}
现在运行程序可以看到,窗口已经变成了半透明状态,并且没有影响到部件,但是没有了标题栏和边框,故此时需要自定义添加一个标题栏,这里不再赘述。
3、实现部件特殊效果(模糊、阴影和染色),以阴影和透明效果为例
添加头文件:
#include <QGraphicsDropShadowEffect>// 阴影效果
#include <QGraphicsOpacityEffect>// 透明效果
/**
* @brief 创建透明效果
*/
QGraphicsOpacityEffect *opacityEffect = new QGraphicsOpacityEffect;
// 设置透明度
opacityEffect->setOpacity(0.5);
// 使用透明效果
ui->pushButton->setGraphicsEffect(opacityEffect);
/**
* @brief 创建阴影效果
*/
QGraphicsDropShadowEffect *shadowEffect = new QGraphicsDropShadowEffect;
// 设置阴影颜色
shadowEffect->setColor(QColor(100,100,100,50));
// 设置阴影模糊半径
shadowEffect->setBlurRadius(2);
// 设置阴影偏移值
shadowEffect->setOffset(10);
// 使用阴影效果
ui->pushButton->setGraphicsEffect(shadowEffect);
值得注意的是一定要先使用透明效果再使用阴影效果,否则阴影效果显示失败。