在做项目的时候,为了美化界面,我们通常需要设置控件具有阴影效果,具体怎么做呢?
方法一:使用QGraphicsDropShadowEffect
QGraphicsDropShadowEffect *shadow_effect = new QGraphicsDropShadowEffect(this);
shadow_effect->setOffset(5, 5); //阴影的偏移量
shadow_effect->setColor(QColor(43, 43, 43)); //阴影的颜色
shadow_effect->setBlurRadius(8); // 阴影圆角的大小
QLabel* pLabel = new QLabel(this);
pLabel->setGraphicsEffect(shadow_effect); //给那个控件设置阴影,这里需要注意的是所有此控件的子控件,也都继承这个阴影。
阴影效果如图:
方法二:重写paintEvent 函数
void MainWindow::paintEvent(QPaintEvent *event)
{
QPainterPath path;
path.setFillRule(Qt::WindingFill);
path.addRect(10, 10, this->width()-20, this->height()-20);
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing, true);
painter.fillPath(path, QBrush(Qt::white));
QColor color(0, 0, 0, 50);
for(int i = 0; i < 10; i++)
{
QPainterPath path;
path.setFillRule(Qt::WindingFill);
path.addRect(10-i, 10-i, this->width()-(10-i)*2, this->height()-(10-i)*2);
color.setAlpha(150 - qSqrt(i)*50);
painter.setPen(color);
painter.drawPath(path);
}
}
bool TDMSummaryForm::eventFilter(QObject *watched, QEvent *event)
{
if (event->type() == QEvent::Paint && (watched == ui->titleFrame ||
watched == ui->groupDataFrame ||
watched == ui->trendFrame ||
watched == ui->tableFrame))
{
QWidget *wgt = static_cast<QWidget*> (watched);
QPainter painter(wgt);
QColor color(217, 229, 246, 55);
for (int i = 0; i<10; i++)
{
QPainterPath path;
path.setFillRule(Qt::WindingFill);
path.addRoundRect(10 - i, 10 - i,
wgt->width() - (10 - i) * 2,
wgt->height() - (10 - i) * 2,
4);
color.setAlpha(255 - qSqrt(i) * 70);
painter.setPen(color);
painter.drawPath(path);
}
}
return QObject::eventFilter(watched, event);
}
使用此方法,需要添加下面代码,保证不被绘制上的部分透明。
setAttribute(Qt::WA_TranslucentBackground)
方法三:使用带有阴影效果的图片。