日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

Qt之阴影边框(转)

發(fā)布時(shí)間:2024/9/5 95 生活家
生活随笔 收集整理的這篇文章主要介紹了 Qt之阴影边框(转) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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

陰影邊框很常見(jiàn),諸如360以及其他很多軟件都有類似效果,了解CSS3的同學(xué)們應(yīng)該都知道box-shadow,它就是來(lái)設(shè)定陰影效果的,那么Qt呢?看過(guò)一些資料,說(shuō)是QSS是基于CSS2的,既然如此,box-shadow是基于CSS3的!那么Qt定然就用不了!

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

效果如下:

左上角、左下角、右上角、右下角、上、下、左、右,這幾個(gè)方向都繪制對(duì)應(yīng)的圖即可!

#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));
}

寫一個(gè)公共的類,如果窗口要實(shí)現(xiàn)陰影效果直接繼承就行了!SHADOW_WIDTH為陰影邊框的像素,可以根據(jù)自己的需求自由調(diào)節(jié)!
也可使用QGraphicsDropShadowEffect來(lái)實(shí)現(xiàn)。。。


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

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


窗口陰影任意調(diào)節(jié),包括陰影像素、是否圓角等。
直接上代碼:


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)。保證不被繪制上的部分透明,關(guān)于這行代碼在一些Qt版本中會(huì)有副作用,比如:最小化后窗體子組件失去焦點(diǎn)等問(wèn)題。具體可以看Qt的這個(gè)Bug(Widget with Qt::FramelessWindowHint and Qt::WA_TranslucentBackground stops painting after minimize/restore)。
也許有人會(huì)遇到,因?yàn)槲抑耙恢笔褂玫氖荲S集成Qt5插件(非OpenGL版本),一直存在這個(gè)問(wèn)題,尋找各方面資料無(wú)果(真的很久,搞不夸張的說(shuō)大半年應(yīng)該是有的)。最后改換OpenGL版本的居然好了。。。問(wèn)題的解決方式太過(guò)于詭異,真讓人哭笑不得。在此記過(guò),希望對(duì)后來(lái)人有幫助。


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

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);

效果如下:

總結(jié)

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

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。