Pyside2/PyQt 直线渐现动效的两种实现方法

近期在学习Qt的使用,为了便于学习吸收,便用模仿QQ界面为练手巩固项目。复刻QQ用户与密码输入框下划线渐变动效时,使用了两种方法来实现,记录下。

效果对比

效果对比

        界面的下划线效果全部使用重写paitEvent,Enter/Leave,focusIn/focusOut方法实现,未使用qss。

代码复现

工具

Qt Designer,Pycharm

PySide2  --5.15

注意点

重写方法时,注意要在方法中继承父类的方法,以免出现光标丢失等问题。

super(ClassNmae, self).focusInEvent(event)

代码

方法一:

        使用QPropertyAnimation,自定义属性动效实现;

方法二:

        使用QTimeLine,时间线实现。

        两种方法中,个人建议使用QTimeLine,如果有更好的建议或实现方法的,欢迎评论区交流学习,感谢!

QPropertyAnimation新建一个percent属性(属性名称自定)

self._percent = 0

self.animation = QPropertyAnimation(self, b'percent')
self.animation.setTargetObject(self)
self.animation.setDuration(300) 
self.animation.setStartValue(0)
self.animation.setEndValue(1)

# 自定义一个percent属性
@Property(float)
def percent(self):
    return self._percent

@percent.setter
def percent(self, percent):
    self._percent = percent
    self.update()

重写paitEvent

self.flag = False

def paitEvent(self, event):
    super().paitEvent(event)
    p = QPaiter(self)
    p.setPen(QPen(QColor(18, 183, 245), 2)
    if self.flag:  # 加一个条件判断,以实现焦点out时,直线消失
        p.drawLine(QPoint(x1, y1), QPoint(x2*self._percent, y2))

最后再将触发条件写入

def focusInEvent(self, event):
    super().focusInEvent(event) 
    self.flag = True
    self.animation.start()
    self.update()


def focusOutEvent(self, event):
    super().focusOutEvent(event)
    self.flag = False
    self._percent = 0

QTimeLine

# 创建一个时间线
self.timeline = QTimeLine(300, self) 
self.timeline.valueChanged.connect(self.draw_line)

def draw_line(self, val):
    self.end_point = self.line_f.pointAt(val)
    self.ani_line = QLineF(QPointF(x1, y1), self.end_point)
    self.update()

重写paitEvent

self.flag = False

def paitEvent(self, event):
    super().paitEvent(event)
    p = QPaiter(self)
    p.setPen(QPen(QColor(18, 183, 245), 2)
    self.line_f = QLineF(QPointF(x1, y1), QPointF(x2, y2)
    if self.ani_line and self.flag: p.drawLine(self.anima_line)

最后再将触发条件写入

def focusInEvent(self, event):
    super().focusInEvent(event) 
    self.flag = True
    self.timeline.setDirection(QTimeLine.Forward)
    self.timeline.start()


def focusOutEvent(self, event):
    super().focusOutEvent(event)
    self.flag = False
    # 也可以在失去焦点事件中加一个线条消失的动画(注意self.flag的状态)
    # self.timeline.setDirection(QTimeLine.BackWard)
    # self.timeline.start()
    

基于某些原因,该项目代码不开源,细节实现可以评论区学习讨论

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Pyside6和PyQt6都是Python编程语言用于创建GUI应用程序的工具包。它们都是基于Qt框架构建的,因此具有相似的功能和API。 以下是关于使用Pyside6/PyQt6进行快速开发和实战的一些提示: 1. 学习Qt框架:Qt框架是创建GUI应用程序的基础。学习Qt框架可以帮助你了解Pyside6和PyQt6的工作原理,以及如何使用它们创建GUI应用程序。 2. 学习Python编程语言:Pyside6和PyQt6都是Python编程语言的库。因此,熟悉Python编程语言可以帮助你更好地使用这些库。 3. 使用Qt Designer:Qt Designer是一个可视化工具,可以帮助你轻松创建GUI应用程序的UI。你可以使用Qt Designer创建UI,并将其导入到Pyside6/PyQt6项目。 4. 学习信号和槽:信号和槽是Pyside6/PyQt6的重要概念。信号是一个事件,例如按钮单击或文本更改,而槽是响应这些事件的函数。学习如何使用信号和槽可以帮助你创建响应用户操作的GUI应用程序。 5. 阅读文档和示例代码:Pyside6和PyQt6都有详细的文档和示例代码。阅读这些文档和示例代码可以帮助你了解如何使用库的不同功能和API,并为你的项目提供灵感。 6. 加入社区:Pyside6和PyQt6有活跃的社区和论坛。加入这些社区可以帮助你与其他开发人员交流经验,并得到解决问题的帮助。 总之,使用Pyside6和PyQt6进行快速开发和实战需要学习Qt框架、Python编程语言、Qt Designer、信号和槽等知识,并阅读文档和示例代码。加入社区可以帮助你更好地了解和使用这些库。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值