最近遇到一个linux项目,系统中只能支持qt4.8.6。使用阴影的时候遇到一些问题,处理解决后留个笔记。
Qt中实现的阴影方式有:
- QGraphicsDropShadowEffect
- paintEvent绘制
- 使用带阴影效果的图片
Qt4.8.6中不支持QGraphicsDropShadowEffect效果,使用paintEvent方式繁琐自己画的效果也不好。所以我采用了带应用效果的图片编辑了一个阴影类。效果如下图:
使用方式:
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
resize(400,400);
//设备背景颜色
setObjectName("widget_main");
setStyleSheet("QWidget#widget_main{background:#FFFFFF;}");
//创建一个窗口控件
QWidget *test1=new QWidget(this);
test1->setObjectName("test1");
test1->setStyleSheet("QWidget#test1{background:#FFFF00;border-radius:10px;}");
test1->setFixedSize(100,100);
test1->move(50,50);
//创建一个窗口控件
QWidget *test2=new QWidget(this);
test2->setObjectName("test2");
test2->setStyleSheet("QWidget#test2{background:#FFFF00;border-radius:10px;}");
test2->setFixedSize(100,100);
test2->move(200,50);
//创建一个窗口控件
QWidget *test3=new QWidget(this);
test3->setObjectName("test3");
test3->setStyleSheet("QWidget#test3{background:#FFFF00;border-radius:10px;}");
test3->setFixedSize(100,100);
test3->move(50,200);
//添加阴影
CShadowWidget *shadow=new CShadowWidget(test2,2);
shadow->setOffset(10,10,40,40);
new CShadowWidget(test3,1);
new CShadowWidget(test1,0);
}
cshadowwidget.h内容:
#ifndef CSHADOWWIDGET_H
#define CSHADOWWIDGET_H
#include <QWidget>
#include <QTimer>
class CShadowWidget : public QWidget
{
Q_OBJECT
public:
explicit CShadowWidget(QWidget *parent = 0);
CShadowWidget(QWidget *parent,int model);
void setDecorate(QWidget*); //设置修饰的目标
void setShowModel(int); //设置显示模式
void setShadowWidth(int); //设置阴影的宽度
void paintEvent(QPaintEvent *event); //重绘函数
void setOffset(int l,int t,int r,int d); //设置偏移
private:
void initMsg(); //数据初始化
void initUI(); //界面初始化
private:
QWidget* m_widget; //需要修饰的目标
QWidget* m_shadow; //显示背景图片的控件
int m_shadowwidth; //阴影宽度
int m_model; //显示模式 0:所有 1:下右 2:存在偏移
int m_lwidth;
int m_rwidth;
int m_twidth;
int m_dwidth;
};
#endif // CSHADOWWIDGET_H
cshadowwidget.cpp内容:
#include "cshadowwidget.h"
#include <QDebug>
#include <QHBoxLayout>
CShadowWidget::CShadowWidget(QWidget *parent) :
QWidget(parent)
{
initMsg();
initUI();
}
CShadowWidget::CShadowWidget(QWidget *parent,int model):
QWidget(parent->parentWidget())
{
initMsg();
initUI();
setShowModel(model);
setDecorate(parent);
}
void CShadowWidget::initMsg()
{
m_model=0;
m_shadowwidth=40;
m_lwidth=0;
m_twidth=0;
m_rwidth=0;
m_dwidth=0;
m_shadow=NULL;
m_widget=NULL;
}
void CShadowWidget::initUI()
{
setFixedSize(100,100);
m_shadow=new QWidget(this);
m_shadow->setObjectName("shadow");
m_shadow->setStyleSheet("QWidget#shadow{border-image:url(\":/images/icon_shadow3.png\");}");
m_shadow->show();
QHBoxLayout* layout=new QHBoxLayout();
layout->setContentsMargins(0,0,0,0);
layout->setSpacing(0);
layout->addWidget(m_shadow);
this->setLayout(layout);
}
void CShadowWidget::setDecorate(QWidget* p)
{
m_widget=p;
//将图像移动到该目标的背后
stackUnder(p);
}
void CShadowWidget::setShowModel(int m)
{
m_model=m;
if(m==1)
{
m_shadow->setStyleSheet("QWidget#shadow{border-image:url(\":/images/icon_shadow3.png\");}");
}
else
{
m_shadow->setStyleSheet("QWidget#shadow{border-image:url(\":/images/icon_shadow2.png\");}");
}
}
void CShadowWidget::setOffset(int l,int t,int r,int d)
{
m_lwidth=l;
m_twidth=t;
m_rwidth=r;
m_dwidth=d;
m_model=2;
setShowModel(2);
update();
}
void CShadowWidget::setShadowWidth(int w)
{
m_shadowwidth=w;
update();
}
void CShadowWidget::paintEvent(QPaintEvent *event)
{
if(m_widget==NULL)
return;
int w=m_widget->width();
int h=m_widget->height();
if(m_model==1)
{
//下、右有阴影
setFixedSize(w+m_shadowwidth,h+m_shadowwidth);
move(m_widget->pos().x(),m_widget->pos().y());
}
else if(m_model==2)
{
//四边距离调整
setFixedSize(w+m_lwidth+m_rwidth,h+m_twidth+m_dwidth);
move(m_widget->pos().x()-m_lwidth,m_widget->pos().y()-m_twidth);
}
else
{
//四边都有阴影
setFixedSize(w+m_shadowwidth*2,h+m_shadowwidth*2);
move(m_widget->pos().x()-m_shadowwidth,m_widget->pos().y()-m_shadowwidth);
}
}
个人使用的透明阴影图片资源:
纯记录,不喜勿喷!