QT窗口:透明与半透明、不规则异形窗口、控件透明与半透明、不规则异形按钮
目录
1、不规则异形窗口和控件的代码原理
2、主窗口全透明
3、主窗口半透明(以白里透红为例)
4、不规则异形窗口
5、不规则异形按钮
6、使用样式表实现透明与半透明
1、不规则异形窗口和控件的代码原理
步骤①:载入一个QPixmap图片,如果图片中某些位置带有全透明alpha通道,那么QPixmap::mask()就会根据全透明的位置生成掩码(注:生成的掩码类型为QBitmap),然后把掩码设置给QWidget控件,这时QWidget就会变成不规则的异形。
步骤②:这时的QWidget只是异形,背景还是原生的灰色,这时我们只需把前面用到的QPixmap作为背景图设置给QWidget即可。需要注意的是,显然我们应当保证背景图的大小和掩码的大小一致。
注意:一般我们使用的QPixmap图片与我们的窗体或控件,大小是不一致的,这时我们既可以让窗口或控件去适应图片的大小:QWidget.resize(pixmap.size()),也可以让图片去适应窗口或控件的大小:pixmap = pixmap.scaled(widget.size()),具体使用哪种,看你的需求。
设置背景图,推荐使用资源文件与样式表:border-image:url(:pic/a.png),在本文的应用场景中,同样是设置背景图,border-image 比 background-image 更合适,因为border-image会自动把图片拉伸充满控件,而background-image会把图片保持为原大小。
给不同控件设置背景图,QPushButton、QLabel等各有不同的方法,例如QPushbutton::setIcon()、QLabel::setPixmap(), QLabel::setPicture(),用起来不具备通用性,只有样式表是通用的。
如果背景图的显示效果,无法满足你的需求,请自行百度搜索:《QT实现背景图片多种填充方式:居中、平铺、缩放、拉伸》
2、主窗口全透明
直接在UI的主窗口中,拖出几个控件,下图我放置了一个QPushButton按钮、QCheckBox复选框、设置了蓝色背景的QWidget。
然后用代码设置主窗体的透明:
MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);setWindowFlags(windowFlags() | Qt::FramelessWindowHint);//无边框this->setAttribute(Qt::WA_TranslucentBackground, true);//窗体背景全透明
// setWindowOpacity(0.5);//这行代码会使主窗体及其所有的子控件整体半透明,见下图右
}MainWindow::~MainWindow()
{delete ui;
}
运行效果如下,左图所示。
可以看到,整个窗体背景实现了完全透明,只有控件是不透明的。如果我们设置了整体半透明(也即这行代码:setWindowOpacity(0.5)),那么控件窗口与控件都会呈现半透明,效果如上图右图所示。
总结:由上述示例代码可见,实现主窗体全透明,必须要同时做以下2项,缺一不可:①设置窗口无边框,②设置背景全透明
3、主窗口半透明(以白里透红为例)
本文由【暴躁的野生猿】发表于CSDN,非法转载请帮忙举报谢谢。
只需覆盖QWidget的paintEvent函数即可:
void MainWindow::paintEvent(QPaintEvent*event)
{QPainter p(this);//边框黑色不透明 (因为设置了窗体无边框,这行代码可能没有效果)p.setPen(QColor(0, 255, 0, 255));p.setBrush(QColor(255, 0, 0, 150));//填充红色半透明p.drawRect(this->rect());//绘制半透明矩形,覆盖整个窗体QWidget::paintEvent(event);
}
效果如下所示,代码原理就是,在主窗体背景全透的基础上,在主窗体上绘制了一个与之等大的半透明矩形。
总结:由上述示例代码可见,实现主窗体半透明,必须要同时做以下2项,缺一不可:①设置窗口无边框,②设置背景全透明,③覆盖QWidget的paintEvent函数并写半透明代码。
4、不规则异形窗口
准备一张带透明通道的PNG图片,(不会PS制作PNG的朋友可以用光影魔术手制作),下面我的示例中,我准备了2张PNG图片分别如下所示,其中第一张:局部全透明、整体半透明,第二张:局部全透明、其余位置不透明。
然后在设计师界面随意拖出两个控件。
#include "form.h"
#include "ui_form.h"
#include <QPixmap>
#include <QBitmap>
#include <QDebug>
#include <QPainter>Form::Form(QWidget *parent) :QWidget(parent),ui(new Ui::Form)
{ui->setupUi(this);this->setWindowFlags(Qt::FramelessWindowHint);//设置窗体无边框this->setAttribute(Qt::WA_TranslucentBackground);//设置窗体全透明pix.load(":/pic/qt2.png");//从资源文件载入图片pix = pix.scaled(size());//把载入的PNG图片缩放到与窗体一样大}void Form::paintEvent(QPaintEvent *e)
{Q_UNUSED(e)QPainter painter(this);//画笔以this窗体作为画布painter.drawPixmap(0, 0, pix);//从(0,0)开始在画布上绘制PNG图片
}
有上述代码可见,要实现不规则窗体,原理无非就是,先把窗口弄成全透明,然后在全透明的这个画布上绘制PNG图片。
可以看到,窗体整体呈现为不规则形状,而且透过上图的QT空心位置,可以点击到后面的文件,说明窗口真的是空心的。
5、不规则异形按钮
如下所示,随意拖出两个控件:一个QPushButton,一个QLabel。在本例中,给这2个控件设置异形,我将演示两种不同的方案:①让控件自适应图片的大小,②让图片自适应控件的大小.。这两种方案分别呈现的效果见下文图片。
素材为:,这种带透明通道的简易图形素材,用wps/word配合光影魔术手,很容易制作。
QPixmap arrowPix(":/pic/arrow.png");//从资源文件载入图片ui->pushButton->resize(arrowPix.size());//把按钮调整为和图片一样大ui->pushButton->setMask(arrowPix.mask());//根据alpha通道生成掩码,掩码让控件形成不规则形状(该行不会添加背景图) ui->pushButton->setStyleSheet("background-image或border-image: url(:/pic/arrow.png)");//给按钮设置背景图arrowPix = arrowPix.scaled(ui->label->size());//把图片调整为和控件一样大ui->label->setMask(arrowPix.mask());ui->label->setStyleSheet("border-image: url(:/pic/arrow.png);");
效果:
6、使用样式表实现透明与半透明
所谓顶级窗口,就是其parent是nullptr的QWidget或其子类。
如果控件不是顶级窗口,直接使用样式表,就能实现各种透明和半透明。
如果控件是顶级窗口,要想用样式表实现透明或半透明效果,则必须做以下4项工作,缺一不可:① 无边框, ②背景全透, ③设置qss ,④覆盖painterEvent
XXX::XXX(QWidget *parent) : //构造QWidget(parent)
{setWindowFlags(windowFlags() | Qt::FramelessWindowHint);//无边框this->setAttribute(Qt::WA_TranslucentBackground, true);//窗体背景全透明this->setStyleSheet("border:none; background-color: rgba(255,0,0,200);");//设置样式表
}/*继承了QWidget的控件,要使用qss,必须覆盖该函数*/
void XXX::paintEvent(QPaintEvent *event)
{Q_UNUSED(event)QStyleOption opt;opt.init(this);QPainter p(this);style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
}
样式表语法支持alpha通道:
任意一个QWidget,都可以直接设置:
background-color: rgba(10,20,30,40);
rgba的4个参数分别为Red Green Blue Alpha(0 =全透, 255=不透)
对于自己写的继承QWidget的子类,要使用样式表,必须要覆盖painterEvent,这是官方手册要求的,直接抄就行了:
QT窗口:透明与半透明、不规则异形窗口、控件透明与半透明、不规则异形按钮相关推荐
- Qt QWidget控件透明动画实现
QWidget控件透明动画实现 要做子控件透明需要用到QGraphicsOpacityEffect类 使用方法: QGraphicsOpacityEffect * m_pGraphicsOpacity ...
- QT控件系列一 | 半透明遮罩弹窗
QT控件系列一 | 半透明遮罩(弹窗) 文章目录 QT控件系列一 | 半透明遮罩(弹窗) 1.1 前言 1.2 原理(技术点) 1.3 使用 1.4 资源下载 1.1 前言 我们看Windows桌 ...
- PyQt5设置窗口和应用程序图标及设置控件提示信息
PyQt5设置窗口和应用程序图标及设置控件提示信息 设置窗口和应用程序图标 设置控件提示信息 设置窗口和应用程序图标 使用到的库from PyQt5.QtGui import QIcon 使用到的方法 ...
- QtUI设计:设置控件透明
QT设置按钮控件透明: 代码: //设置按钮 背景 前景this->ui->ShowCvRGB->setStyleSheet(QString("color:rgba(255 ...
- QT上设置背景图不影响子控件以及按钮控件的透明化
QT中设置背景图不影响子控件 QT中设置背景图的方法不少,我这里是直接使用stylesheet来设置背景图.如果直接在UI界面进行如下所示设置 border-image: url(:/resource ...
- html控件透明与背景透明
html控件透明与背景透明 如何实现一个控件的半透明效果? IE中关于半透明和透明控件的一些说明 .大家在有些时候希望自己做的控件是半透明或透明的,就像半透明的窗体一样,我经过一段时间的查询,发现这个 ...
- Qt 在designer 中给QToolBar 添加 action控件
Qt 在designer 中给QToolBar 添加 action控件 1.在action editor 添加控件 SendData不出现使用打钩时 2. 使用鼠标直接拖拽到Ui指定位置
- MFC学习之 对话框设置背景颜色及控件透明的方法
对话框设置背景色之后控件不透明的问题. 1.对话框设置背景色: 方法1:(用OnPaint()) 在Dlg.h中:声明 afx_msg void OnPaint(); HICON m_hIcon; 在 ...
- MFC/WTL 设置背景图和控件透明的方法
1.MFC 对话框设置背景图 方法一: 1>资源中导入一张bitmap图,如命名为 IDB_BITMAP1 2>对话框中添加一个 Picture Control,属性设置 Type 改为B ...
最新文章
- C++中的istringstream 的用法
- Flutter学习记录(二、Flutter项目学习Widget)
- 【Python基础】Python3十大经典错误及解决办法
- php-cgi 68%,php cgi 进程占用太多怎么办
- 『设计模式』电话接线员与中介者模式
- 卷积滤波 英文_图像处理必备英文词汇
- ISAServer***检测及配置
- linux日志.pdf,一种用于LINUX的AUDIT日志分析方法.pdf
- 11.string容器
- select设置高度的兼容问题
- 绕过密码关闭趋势防毒墙
- Python文字识别
- python 基础面试题(一)
- 初探巨杉分布式数据库
- AriaNG保存服务器信息,Aria2 AriaNg 安装配置教程
- 2021年度软件企业 100 强榜单(附全名单)有你么?
- 旅游评论情感分析(1)---爬虫(json篇)
- 浩辰3D软件入门教程:如何比较3D模型?
- 智能音箱 天猫精灵 X1 + Broadlink 打造智能家居摇控
- Java:如何选择一个好的Java外包合作伙伴?
热门文章
- 链接:MSDN UserNet等
- CCCF专题丨信息无障碍中的智能交互技术
- 解决Tmux提示的size x*x from a smaller client窗口缩放问题
- 【elasticsearch】问题解决:Remote responded with a chunk that was too large. Use a smaller batch size
- html自动刷新 idea,idea新建css idea怎么刷新导入的css
- 端粒效应《The Telemere Effect》程序员的养生指南(二)情绪、思维模式与健康
- Motivated Word(4)
- 牛客网刷题记录 || 结构体和类
- 91461452469259f108dee0593bece4cb
- python计算连续复利_复利的Python程序