QT中的比如QWidget,QLabel,QPushbutton,QCheckBox都可以设置阴影效果,就像这样:
以QWidget为例,开始尝试使用样式表的形式添加阴影,但没有效果,写法如下:
QWidget#widget1::shadow{color: rgba(220, 220, 220,1);radius:10px;offset: 5px;
}
后来查阅资料,说是要先设置背景阴影才能生效,于是样式表改为:
QWidget#widget1{
//背景色background-color: rgba(255, 255, 255,1);//边线border: 1px solid rgba(220, 220, 220,1);//边线倒圆角border-radius:10px;
}
QWidget#widget1::shadow{color: rgba(220, 220, 220,1);radius:10px;offset: 5px;
}
依然无法生效,判断是样式表的形式是不行的,改为使用代码形式设置。
代码设置阴影,一般选用“QGraphicsDropShadowEffect”类来实现。
先添加该类头文件;
再创建一个阴影样式,并设置部件的阴影;
//设置阴影特效//创建特效对象QGraphicsDropShadowEffect *shadow_effect = new QGraphicsDropShadowEffect(this);//设置偏移量,x轴,y轴shadow_effect->setOffset(2, 2);//设置阴影颜色和透明度shadow_effect->setColor(QColor(125, 125, 125, 200));//设置阴影外射的尺寸shadow_effect->setBlurRadius(8);//给部件设置阴影ui->widget1->setGraphicsEffect(shadow_effect);
这样就可以让QWidget有一个阴影效果;
同样的,对QPushbutton按钮设置一个阴影效果:
QGraphicsDropShadowEffect* shadowEffect = new QGraphicsDropShadowEffect(this);shadowEffect->setBlurRadius(15.0);shadowEffect->setColor(Qt::black);shadowEffect->setOffset(5.0, 5.0);ui->btn2->setGraphicsEffect(shadow_effect);
再对QCheckBox设置一个阴影效果
QGraphicsDropShadowEffect *shadowEffect = new QGraphicsDropShadowEffect(this);shadowEffect->setBlurRadius(5);shadowEffect->setXOffset(2);shadowEffect->setYOffset(2);ui->checkBox->setGraphicsEffect(shadowEffect);
嵌入式设备,拍照来的,两个按钮,上面的有阴影,下面的没有。
注意,有时候你代码设置了阴影效果,但可能会出现不生效的问题。
这时候注意检查:
1.一个阴影效果“QGraphicsDropShadowEffect ”的对象只能作用在一个部件上,就是说,你new了一个“QGraphicsDropShadowEffect ”的阴影效果对象shadowEffect,只能作用再Label1上做阴影,Label2想用的话,再new一个阴影效果对象去用。好看的帽子,人人都想带的话,只能人人都去买一个;
2.有没有给该部件设置一个背景色,想要阴影效果,需要部件本身有一个可见的背景色的;
3.检查是不是运行程序所处的环境,是不是Qt的库不支持图形效果;
4.检查控件的QWidget::setWindowFlags方法可能被调用,设置了不支持阴影的窗口标记;
5.检查控件是不是可能被嵌入到不支持图形效果的容器中,这个我就遇到过,在同样的一个嵌入式设备中,开始产品主程序设置了阴影效果不生效,以为是缺少了什么渲染的库,后来做个简单demo去测试,阴影效果正常,最后发现产品主程序要设置阴影的部件,嵌入到另一个部件中,层层嵌入和一堆的父窗口设置导致不生效;
最后:阴影效果的渲染如果过多,对于一些配置较低的嵌入式设备,可能回引起卡顿。