日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

Qt之阴影边框(转)

發布時間:2024/9/5 综合教程 85 生活家
生活随笔 收集整理的這篇文章主要介紹了 Qt之阴影边框(转) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

原文地址:http://blog.sina.com.cn/s/blog_a6fb6cc90101eoc7.html

陰影邊框很常見,諸如360以及其他很多軟件都有類似效果,了解CSS3的同學們應該都知道box-shadow,它就是來設定陰影效果的,那么Qt呢?看過一些資料,說是QSS是基于CSS2的,既然如此,box-shadow是基于CSS3的!那么Qt定然就用不了!

搜了一些資料,每張圖片都做成陰影效果的固然不可能,直接舍棄(即使可以,也不采納)。如果實時的去畫圖,效率太低,最后選擇了拼圖的方式!

效果如下:

左上角、左下角、右上角、右下角、上、下、左、右,這幾個方向都繪制對應的圖即可!

#include "shadow_widget.h"

ShadowWidget::ShadowWidget(QWidget *parent)
: QDialog(parent)
{
setWindowFlags(Qt::FramelessWindowHint | Qt::Dialog);
setAttribute(Qt::WA_TranslucentBackground);
}

ShadowWidget::~ShadowWidget()
{

}

void ShadowWidget::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
this->drawShadow(painter);
painter.setPen(Qt::NoPen);
painter.setBrush(Qt::white);
painter.drawRect(QRect(SHADOW_WIDTH, SHADOW_WIDTH, this->width()-2*SHADOW_WIDTH, this->height()-2*SHADOW_WIDTH));
}

void ShadowWidget::drawShadow(QPainter &painter)
{
//繪制左上角、左下角、右上角、右下角、上、下、左、右邊框
QList pixmaps;
pixmaps.append(QPixmap(":/shadow/shadow_left"));
pixmaps.append(QPixmap(":/shadow/shadow_right"));
pixmaps.append(QPixmap(":/shadow/shadow_top"));
pixmaps.append(QPixmap(":/shadow/shadow_bottom"));
pixmaps.append(QPixmap(":/shadow/shadow_left_top"));
pixmaps.append(QPixmap(":/shadow/shadow_right_top"));
pixmaps.append(QPixmap(":/shadow/shadow_left_bottom"));
pixmaps.append(QPixmap(":/shadow/shadow_right_bottom"));

painter.drawPixmap(0, 0, SHADOW_WIDTH, SHADOW_WIDTH, pixmaps[4]);
painter.drawPixmap(this->width()-SHADOW_WIDTH, 0, SHADOW_WIDTH, SHADOW_WIDTH, pixmaps[5]);
painter.drawPixmap(0,this->height()-SHADOW_WIDTH, SHADOW_WIDTH, SHADOW_WIDTH, pixmaps[6]);
painter.drawPixmap(this->width()-SHADOW_WIDTH, this->height()-SHADOW_WIDTH, SHADOW_WIDTH, SHADOW_WIDTH, pixmaps[7]);
painter.drawPixmap(0, SHADOW_WIDTH, SHADOW_WIDTH, this->height()-2*SHADOW_WIDTH, pixmaps[0].scaled(SHADOW_WIDTH, this->height()-2*SHADOW_WIDTH));
painter.drawPixmap(this->width()-SHADOW_WIDTH, SHADOW_WIDTH, SHADOW_WIDTH, this->height()-2*SHADOW_WIDTH, pixmaps[1].scaled(SHADOW_WIDTH, this->height()- 2*SHADOW_WIDTH));
painter.drawPixmap(SHADOW_WIDTH, 0, this->width()-2*SHADOW_WIDTH, SHADOW_WIDTH, pixmaps[2].scaled(this->width()-2*SHADOW_WIDTH, SHADOW_WIDTH));
painter.drawPixmap(SHADOW_WIDTH, this->height()-SHADOW_WIDTH, this->width()-2*SHADOW_WIDTH, SHADOW_WIDTH, pixmaps[3].scaled(this->width()-2*SHADOW_WIDTH, SHADOW_WIDTH));
}

寫一個公共的類,如果窗口要實現陰影效果直接繼承就行了!SHADOW_WIDTH為陰影邊框的像素,可以根據自己的需求自由調節!
也可使用QGraphicsDropShadowEffect來實現。。。


更多參考:
Qt之再談陰影邊框.

前面就窗口陰影已經寫過一篇博客,使用九宮格的思路實現的,在我看來,凡是用程序能實現的盡量不要使用圖片代替(在保證效率的前提下),今天再次分享關于我的一些小見解!
先看效果:


窗口陰影任意調節,包括陰影像素、是否圓角等。
直接上代碼:


void DropShadowWidget::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);
}
}
記得加上這行代碼:setAttribute(Qt::WA_TranslucentBackground)。保證不被繪制上的部分透明,關于這行代碼在一些Qt版本中會有副作用,比如:最小化后窗體子組件失去焦點等問題。具體可以看Qt的這個Bug(Widget with Qt::FramelessWindowHint and Qt::WA_TranslucentBackground stops painting after minimize/restore)。
也許有人會遇到,因為我之前一直使用的是VS集成Qt5插件(非OpenGL版本),一直存在這個問題,尋找各方面資料無果(真的很久,搞不夸張的說大半年應該是有的)。最后改換OpenGL版本的居然好了。。。問題的解決方式太過于詭異,真讓人哭笑不得。在此記過,希望對后來人有幫助。


為子部件添加陰影比較簡單,使用如下方式:

QGraphicsDropShadowEffect *shadow_effect = new QGraphicsDropShadowEffect(this);
shadow_effect->setOffset(-5, 5);
shadow_effect->setColor(Qt::gray);
shadow_effect->setBlurRadius(8);
network_group_box->setGraphicsEffect(shadow_effect);

效果如下:

總結

以上是生活随笔為你收集整理的Qt之阴影边框(转)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。