今天学习了几个好玩的小玩意,分别是窗体设置透明、部件设置透明、部件设置阴影效果与设置不规则窗体效果。
窗体透明
一、窗体透明,取值0~1
setWindowOpacity(数值);
0 - 1 :0透明,1无透明效果。
// 窗口透明属性,取值0~1
setWindowOpacity(0.7);
运行效果:
二、部件不透明,窗体背景完全透明
setWindowFlags(Qt::FramelessWindowHint); // 设置窗体无边框风格
setAttribute(Qt::WA_TranslucentBackground); // 设置窗体完全透明
此方式不会对窗体标题进行透明设置,所以得先将窗体标题隐藏。
运行效果:
三、重写绘图事件
需包含头文件:#include <QPainter>
protected:
void paintEvent(QPaintEvent *event);
void testStyleSheet::paintEvent(QPaintEvent *event) {
QPainter painter(this);
// 重写绘制窗体矩形
painter.fillRect(rect(), QColor(255, 255, 255, 50));
}
利用color第四个参数透明属性,取值范围0 - 255
此种方式在博主这里无法实现,目前还没找到原因。
部件透明
需包含头文件:#include <QGraphicsOpacityEffect>
// 部件设置透明
QGraphicsOpacityEffect *opacityEffect = new QGraphicsOpacityEffect;
opacityEffect->setOpacity(0.5); // 设置透明度,取值 0 - 1
ui.label->setGraphicsEffect(opacityEffect); // 部件设置透明属性
这里以QLabel为例,为了更好的体现效果,博主提前在label中插入了张图片。
运行截图:
部件阴影
需包含头文件:#include <QGraphicsDropShadowEffect>
// 阴影效果
QGraphicsDropShadowEffect *shadowEffect = new QGraphicsDropShadowEffect;
// 阴影色,透明度
shadowEffect->setColor(QColor(100, 150, 200));
// 阴影模糊度
shadowEffect->setBlurRadius(30);
// 阴影偏移值
shadowEffect->setOffset(20);
// 将阴影设置控件
ui.label->setGraphicsEffect(shadowEffect);
还是以QLabel为例
运行结果:
不规则窗体
注意:图片得是透明背景图!
获取博主素材图百度网盘链接:链接:https://pan.baidu.com/s/1Q1mBhLWB9TlYX2v7R0HCQA
提取码:cppp
-
加载图片
QPixmap pixmap; // 加载图片 pixmap.load("E:\\QTproject\\testMask\\testMask\\flower.png");
-
ui文件中拖入一个QLabel控件,并删掉文本
-
标签与窗体都设置与图片相同大小
// 设置标签与图片大小一致 ui.label->resize(pixmap.size()); // 设置窗体与图片大小一致 this->resize(pixmap.size());
-
设置遮罩
// 设置遮罩 setMask(pixmap.mask());
-
重写绘图事件
protected: void paintEvent(QPaintEvent *event); // 重写画图事件 void testMask::paintEvent(QPaintEvent *event) { QPainter painter(this); // 图片绘制 painter.drawPixmap(0, 0, QPixmap("E:\\QTproject\\testMask\\testMask\\flower.png")); }
至此,步骤完毕,可以运行看到效果啦!
一朵大红花送给大家!
运行截图:
当然,这张素材像素比较大,所以显示运行窗体效果也就很大。
不过,是无法关闭,因为没有标题栏的“叉”按钮,为了可以退出程序,可以在代码中添加鼠标按下事件;当系统监测到鼠标左键按下时,进行关闭窗体。
代码如下:
protected:
void mousePressEvent(QMouseEvent *event);
// 重写鼠标按下事件
void testMask::mousePressEvent(QMouseEvent *event) {
// 鼠标按下为左键
if (event->button() == Qt::LeftButton) close();
}
总结:
这几个小玩意还是挺好玩的,如果有这方便项目需求的小伙伴,希望此篇博客可以帮助到你!