在Qt中实现给控件添加阴影一般有三种方法:
1、使用带有阴影图片作为空间的背景图片,这种方法开发起来比较简单,但前期需要准备图片;
2、重新绘图函数painterEvent(),代码实现效率比第一种高,但还是有些麻烦,需要自身的方向感比较强,不然就会让你晕头转向,呵呵;
3、使用Qt自带的QGraphicsDropShadowEffect类,这种方法最简单,但有一个恶心的地方就是,如果对父类使用了该类,那么子类也会继承。。。,这个对于只需要对父类添加阴影的页面简直就是噩梦。接下来,本文将介绍一种只对父类控件添加阴影,而子类不受影响的方法。
首先,假设有一个QWidget的控件被实例化为widget,设置其属性可以参考如下:
#widget
{
background-color: rgb(243, 243, 243); //随便设置一种底色,也可以不去设置
border-radius:20px 20px; //指定圆角的半径
}
上面的属性只会对widget这个控件有效。
接下来,在界面的cpp文件的构造函数中添加阴影的代码,如下:
//设置窗口无边框
setWindowFlags(Qt::Dialog | Qt::FramelessWindowHint);
//设置窗体透明,防止边距显示不同的颜色
this->setAttribute(Qt::WA_TranslucentBackground, true);
//实例阴影shadow
QGraphicsDropShadowEffect *shadow = new QGraphicsDropShadowEffect(this);
shadow->setOffset(0, 0);
shadow->setColor(Qt::gray);
shadow->setBlurRadius(30);
ui->widget->setGraphicsEffect(shadow);
ui->horizontalLayout->setMargin(10); //重要,设置阴影的距离
至此就可以运行自己的程序了,我做的效果如下:
最后,总结一下,就是需要在设置父类属性时带上自己实力化的对象,设置的属性不能影响到子类就可以。