我尝试在QPushButton
边框上使用样式表和QLinearGradient
来动画计时器进度。
我是这么做的
#include <QApplication>
#include <QPushButton>
#include <QTimer>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QPushButton button("Animation Button");
float greenPosition = 0.99;
float whitePosition = 0.01;
QTimer timer;
enum Border {Top = 1, Left = 2, Bottom = 3, Right = 4};
int border = 1;
button.connect(&timer, &QTimer::timeout, [&button, &greenPosition, &whitePosition, &border]()
{
//Left or Bottom
if(border == 2 || border == 3)
{
if(whitePosition + 0.01 > 1)
{
whitePosition = 0;
border = border++ % 4 + 1;
}
whitePosition += 0.01;
}
else
{
if(greenPosition - 0.01 < 0.01)
{
greenPosition = 1;
border = border % 4 + 1;
}
greenPosition -= 0.01;
}
switch (border)
{
case Top:
button.setStyleSheet(QString("border: 2px solid white;"
//"border-radius: 5px;"
"border-top: 2px solid qlineargradient(x0:0, x2:1,"
"stop: 0 green,"
"stop: %1 green,"
"stop: %2 white,"
"stop: 1 white);").arg(greenPosition).arg(greenPosition + 0.01));
break;
case Left:
button.setStyleSheet(QString("border: 2px solid white;"
//"border-radius: 5px;"
"border-left: 2px solid qlineargradient(y0:0, y2:1,"
"stop: 0 white,"
"stop: %1 white,"
"stop: %2 green,"
"stop: 1 green);").arg(whitePosition).arg(whitePosition + 0.01));
break;
case Bottom:
button.setStyleSheet(QString("border: 2px solid white;"
//"border-radius: 5px;"
"border-bottom: 2px solid qlineargradient(x0:0, x2:1,"
"stop: 0 white,"
"stop: %1 white,"
"stop: %2 green,"
"stop: 1 green);").arg(whitePosition).arg(whitePosition + 0.01));
break;
case Right:
button.setStyleSheet(QString("border: 2px solid white;"
//"border-radius: 5px;"
"border-right: 2px solid qlineargradient(y0:0, y2:1,"
"stop: 0 green,"
"stop: %1 green,"
"stop: %2 white,"
"stop: 1 white);").arg(greenPosition).arg(greenPosition + 0.01));
break;
}
});
timer.start(50);
button.show();
return a.exec();
}
字符串
这是我想出的逻辑,来创建这个动画:greenPosition
和whitePosition
是控制QLinearGradient
中的绿色和白色范围的值,绿色是进度,白色是实际边框颜色。
基本的想法是,我让白色后退,绿色前进,反之亦然。
它们的值之间有一小部分是为了避免梯度效应,因此我添加了0.01
。如果greenPosition
或whitePosition
达到[1.00 - 0.00]范围的限制,它们将重置为默认值。border
是一个变量,它允许我在交换机的情况下遍历4
边界,只是一个简单的循环计数器。
所有这些循环都使用QTimer
。
结果如下:
x1c 0d1x的数据
我需要圆形边框,但当我使用它们时,它看起来像这样:
的
边框似乎自己形成了按钮的另一面,就像圆形边框一样,按钮现在有8个边。
这是因为圆形边框上的动画似乎与当前正在设置动画的边框同步,而不是在动画到达它们时才设置动画。这看起来也像是一种镜像效果。
**注:**这只是一个观察,以解释它看起来如何,而不是实际发生了什么。
下面是在使用圆形边框时应用不带QLinearGradient
的绿色颜色的效果:
的
如何以与非圆形边界相同的方式设置圆形边界的动画?
2条答案
按热度按时间flvtvl501#
由于使用样式表设置边框半径会产生不必要的效果,因此您可以在没有样式表的情况下将小部件边框设置为圆形,并使用
paintEvent
;方法如下:你可以画一个圆角矩形,颜色和小部件的父背景一样,这就好像它隐藏了那些尖角,让它们看起来是圆的。
这种方法的一个缺点是它限制了角的圆度,因为如果画家画了一个太圆的矩形,它会掩盖小部件本身或导致尖锐的边缘。
可以通过增加边框大小来稍微解决这个问题,以获得更多的空间,因此,在使用绘图器时可以增加边框半径,而不会破坏小部件边缘。
使用这种方法有一个好处,它可以防止窗口小部件的背景突出边框。
下面是一个从
QPushButton
派生的子类的例子,它带有一个自定义的paintEvent
:字符串
下面是结果,底部按钮是一个普通的
QPushButton
,没有边界半径,只是为了增加差异的可见性:x1c 0d1x的数据
gajydyqb2#
对于这些类型的功能,QML提供了一个非常灵活的工具集。
我已经实现了我认为你在QML中寻找的东西:
字符串
的数据
的