之前用QT Widgets写界面,在UI设计的效果上总要打个8折,主要就是卡在透明和阴影这两个效果上,而这两个效果对于界面的高级感又有很大的影响。
一度想要换Qt Quick,然而经过不断的探索,现在终于解决了这个难题。顺便记录一下其它几个效果的实现方法。
运行环境
硬件环境:树莓派CM4
软件环境:Qt 5.11.3
圆角无锯齿+透明+阴影子界面
以一个提示弹窗为例,主要代码实现:
message_box.h
1 | ... |
message_box.cpp
1 |
|
先要设置无窗体和背景透明,此时设置background-image
、border-image
就不会生效了,使用paintEvent
绘制背景,最后给整体添加阴影效果。
如果想要使用UI给的非纯色图片作为背景,则可以使用painter.drawPixmap(0, 0, this->width(), this->height(), QPixmap(":/resources/images/message_box_bg.png"));
来绘制背景图片,在图片素材中画出圆角边,甚至是带上阴影效果都是可以的。
阴影效果也可以添加给QPushButton、QLabel等控件。
图片圆形显示
一般用于头像图片的圆形显示,使用background-radius
或者setMask
等方法会有锯齿问题。
实现代码:
1 | // 此方法返回一个width*height的圆形图片 |
按钮多选一
QPushButton也可以像QCheckBox一样做互斥选项和多选一的效果。这样做的方便之处在于不用管QCheckBox的indicator。
实现代码:
1 | QPushButton *btn1 = new QWidget(this); |
以上代码也可以直接在设计界面设置,勾选相应的勾选项,添加相应的样式即可。
Button渐变背景
如果UI的按钮只是简单的做了一个渐变效果,而你又不想因为这个添加一个素材,就可以直接用代码生成一个渐变背景的效果。
对于控件的background样式,除了常见的Qt::SolidPattern(实心模式),还有Qt::RadialGradientPattern(径向渐变)、Qt::LinearGradientPattern(线性渐变)、Qt::ConicalGradientPattern(锥形渐变)。
样式代码:
1 | /* linear gradient from white to green */ |
HMAC-SHA1
为什么要记一下这个算法呢,因为网上最多链接的那个算法是错的,google了好几页才找到这个算法。
实现代码:
1 | QString hmac_sha1(const QString &key, const QString &secret) |