Qt 自定义动画按钮

2024-04-11

我正在尝试创建自定义动画按钮 我找到了这个页面:按钮示例 https://tympanus.net/Development/ButtonHoverStyles/

我喜欢这个网站上的 3 和 19。我试过做3个,但不一样。有人能帮我吗?

我的网站上第三个按钮的代码:

 # -*- coding: utf-8 -*-
import sys, os, time, math
from PySide6 import QtCore, QtWidgets, QtGui
from PySide6.QtWidgets import *
from PySide6.QtCore import *
from PySide6.QtGui import *


class EButton3(QPushButton):
    AnimateEnabled = True
    Radius = 10

    _m_Text = ""
    def __init__(self, parent=None):
        super(EButton3, self).__init__(None)
        self.enterEvent = self.Custom_enterEvent
        self.leaveEvent = self.Custom_leaveEvent
        self.setText("Button")
    def getText(self):
        return self._m_Text
    def setText(self, Text):
        self._m_Text = Text
        self.update()

    _m_hover=False
    def isHover(self):
        return self._m_hover

    def paintEvent(self, event: QPaintEvent):
        ret = None #QPushButton.paintEvent(self, event)
        painter = QPainter(self)
        painter.setRenderHint(QPainter.Antialiasing)
        path, path2 = QPainterPath(), QPainterPath()
        BaseBackground, BaseBackgroundHover = QColor(Qt.black), QColor(22,2,22)
        BaseForeground, BaseForegroundHover = QColor(Qt.white), QColor(Qt.black)
        painter.setBrush(QBrush(BaseBackground if not self.isHover() else BaseBackgroundHover))
        painter.setPen(Qt.NoPen)

        rect = QRectF(0, 0, self.width(), self.height())
        path.addRoundedRect(rect, self.Radius, self.Radius)
        painter.drawPath(path)
        painter.setPen(BaseForeground if not self.isHover() else BaseForegroundHover)


        if self.AnimateEnabled:
            painter.setBrush(QBrush(QColor(231, 231, 231)))
            anval = self.AnimateVal / 100
            polygon = QPolygonF([
                QPoint(self.width() * anval, 0),
                QPoint(0, 0),
                QPoint(0, self.height()),
                QPoint((self.width() + 10) * math.sin(anval / 100 * 180), self.height())
            ])
            painter.setClipPath(path)
            path2.addPolygon(polygon)

            painter.drawPath(path2)

        painter.drawText(self.rect(), Qt.AlignCenter, self.getText())
        return ret

    _animateVal = 0
    def setAnimateVal(self, val):
        self._animateVal = val
    def getAnimateVal(self):
        return self._animateVal

    AnimateVal = QtCore.Property(int, getAnimateVal, setAnimateVal)
    temps = []

    def Custom_enterEvent(self, event) -> None:
        self._m_hover = True
        step2_ani = QPropertyAnimation(self, b'AnimateVal')
        step2_ani.setStartValue(self.getAnimateVal())
        step2_ani.setEndValue(100)
        step2_ani.setEasingCurve(QEasingCurve.InQuad)
        step2_ani.setDuration(500)
        self.temps.append(step2_ani)

        def valChanged():
            self.update()

        def finished():
            self.AnimateVal = 100

        step2_ani.valueChanged.connect(valChanged)
        step2_ani.finished.connect(finished)
        step2_ani.start()
        return QPushButton.enterEvent(self, event)

    def Custom_leaveEvent(self, event) -> None:
        self._m_hover = False
        step2_ani = QPropertyAnimation(self, b'AnimateVal')
        self.temps.append(step2_ani) # we need to store it or self.step_ani2 = ... else it will not start
        step2_ani.setStartValue(self.getAnimateVal())
        step2_ani.setEndValue(0)
        step2_ani.setEasingCurve(QEasingCurve.OutCubic)
        step2_ani.setDuration(500)

        def valChanged():
            self.update()

        def finished():
            self.AnimateVal = 0

        step2_ani.valueChanged.connect(valChanged)
        step2_ani.finished.connect(finished)
        step2_ani.start()
        return QPushButton.leaveEvent(self, event)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    wind = QMainWindow()
    wind.setStyleSheet("QMainWindow{background-color:rgb(247,247,250)}")
    wind.resize(150, 80)
    wid = QWidget()
    lay = QHBoxLayout(wid)
    lay.setAlignment(Qt.AlignCenter)

    mycustombutton = EButton3()
    mycustombutton.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
    lay.addWidget(mycustombutton)
    wind.setCentralWidget(wid)
    wind.show()
    sys.exit(app.exec())

我的 19 号代码:按钮

# -*- coding: utf-8 -*-
import sys, os, time, math
from PySide6 import QtCore, QtWidgets, QtGui
from PySide6.QtWidgets import *
from PySide6.QtCore import *
from PySide6.QtGui import *


class EButton19(QPushButton):
    AnimateEnabled = True
    Radius = 10

    _m_Text = ""
    def __init__(self, parent=None):
        super(EButton19, self).__init__(None)
        self.enterEvent = self.Custom_enterEvent
        self.leaveEvent = self.Custom_leaveEvent
        self.setText("Button")
        self.propertyanimation = QPropertyAnimation(self, b'AnimateVal')
        self.propertyanimation.setDuration(350)

    def getText(self):
        return self._m_Text
    def setText(self, Text):
        self._m_Text = Text
        self.update()

    _m_hover=False
    def isHover(self):
        return self._m_hover

    def paintEvent(self, event: QPaintEvent):
        painter = QPainter(self)
        painter.setRenderHint(QPainter.Antialiasing)
        BaseBackground, BaseBackgroundHover = QColor(231,231,231), QColor(Qt.black)
        BaseForeground, BaseForegroundHover = QColor(Qt.black), QColor(Qt.white)
        path, path2 = QPainterPath(), QPainterPath()
        painter.setBrush(QBrush(BaseBackground if not self.isHover() else BaseBackgroundHover))
        painter.setPen(Qt.NoPen)

        rect = QRectF(0, 0, self.width(), self.height())
        anval = self.AnimateVal / 100
        padding = 10
        rect = rect.adjusted(-padding * anval, -padding * anval, padding * anval, padding * anval)
        path.addRoundedRect(rect.adjusted(padding / 2, padding, -padding / 2, -padding), self.Radius, self.Radius)

        painter.drawPath(path)


        if self.AnimateEnabled and self.isHover():
            painter.setBrush(QBrush(QColor(0, 0, 0)))

            painter.setClipPath(path)
            painter.setPen(Qt.black)
            radiusEffect = 75
            path2.addEllipse(self.rect().center(), radiusEffect * anval, radiusEffect * anval)

            painter.drawPath(path2)

        painter.setPen(BaseForeground if not self.isHover() else BaseForegroundHover)
        painter.drawText(self.rect(), Qt.AlignCenter, self.getText())

    _animateVal = 0
    def setAnimateVal(self, val):
        self._animateVal = val
    def getAnimateVal(self):
        return self._animateVal

    AnimateVal = QtCore.Property(int, getAnimateVal, setAnimateVal)

    def Custom_enterEvent(self, event):
        self._m_hover = True
        self.propertyanimation.stop()
        self.propertyanimation.setStartValue(self.getAnimateVal())
        self.propertyanimation.setEndValue(100)
        self.propertyanimation.setEasingCurve(QEasingCurve.InQuad)


        def valChanged():
            self.update()

        def finished():
            self.AnimateVal = 100

        self.propertyanimation.valueChanged.connect(valChanged)
        self.propertyanimation.finished.connect(finished)
        self.propertyanimation.start()
        return QPushButton.enterEvent(self, event)

    def Custom_leaveEvent(self, event) -> None:
        self._m_hover = False
        self.propertyanimation.stop()
        self.propertyanimation.setStartValue(self.getAnimateVal())
        self.propertyanimation.setEndValue(0)
        self.propertyanimation.setEasingCurve(QEasingCurve.OutCubic)

        def valChanged():
            self.update()

        def finished():
            self.AnimateVal = 0

        self.propertyanimation.valueChanged.connect(valChanged)
        self.propertyanimation.finished.connect(finished)
        self.propertyanimation.start()
        return QPushButton.leaveEvent(self, event)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    wind = QMainWindow()
    wind.setStyleSheet("QMainWindow{background-color:rgb(247,247,250)}")
    wind.resize(150, 80)
    wid = QWidget()
    lay = QHBoxLayout(wid)
    lay.setAlignment(Qt.AlignCenter)

    mycustombutton = EButton19()
    mycustombutton.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
    lay.addWidget(mycustombutton)
    wind.setCentralWidget(wid)
    wind.show()
    sys.exit(app.exec())

我的代码外观很糟糕(如果你运行它,你就会看到)。我需要帮助! (适用于第 3 个和第 19 个按钮)

Thanks!


您的代码的主要问题是您使用基于浮点的矩形进行剪切,但绘画仍然发生在概念上整数的坐标中,并且也忽略了画笔宽度。

您还使您的代码比应有的更加复杂,没有考虑使用不同命名的方法“覆盖”进入/离开事件,而不是正确覆盖基本实现。

我建议采用一种更干净的方法,最重要的是,考虑正确的剪切坐标,并且还使用single动画而不是不断创建新动画(这最终可能导致不必要的内存使用,因为这些动画在完成后不会被销毁。

重要的是setClipPath()使用IntersectClip参数,因此裁剪只会针对结果设置merged路径(仅使用其公共区域)。

最后,并不总是需要为 Qt 动画创建自定义属性:QVariantAnimation https://doc.qt.io/qt-5/qvariantanimation.html通常是足够的(并且有效,除非你过度使用它们),因为你只在需要时访问它,而不是调用Property setter.

在讨论建议的解决方案之前,还有一些其他注意事项:

  • 创建不会在(可能)非常频繁调用的函数中使用的变量是一个糟糕的主意;为悬停状态创建背景颜色有什么意义每次你绘制小部件时,即使小部件根本没有悬停?
  • 局部函数(类似于 lambda)仅应在有意义时使用;您要么拥有基于显式(而非持久)局部变量的局部函数,要么正确创建methods;
  • 除了非常特殊的情况外,如果您的动画几乎总是做同样的事情,那么您不应该在需要时创建新动画,特别是当您不确定是否删除它时;否则,您最终可能会得到成千上万个占用内存的持久动画对象不求回报.
class Button(QtWidgets.QPushButton):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.backgroundColors = (
            QtGui.QColor(QtCore.Qt.black), 
            QtGui.QColor(QtCore.Qt.lightGray)
        )
        self.foregroundColors = (
            QtGui.QColor(QtCore.Qt.white), 
            QtGui.QColor(QtCore.Qt.black)
        )

        font = self.font()
        font.setBold(True)
        self.setFont(font)

        self.hoverAnimation = QtCore.QVariantAnimation(self)
        # NOTE: both start and end values *must* be floats, otherwise the
        # animation will just "jump" from 0 to 1 and vice versa!
        self.hoverAnimation.setStartValue(0.)
        self.hoverAnimation.setEndValue(1.)
        self.hoverAnimation.setEasingCurve(QtCore.QEasingCurve.OutCubic)
        self.hoverAnimation.setDuration(400)
        self.hoverAnimation.valueChanged.connect(self.update)

    def enterEvent(self, event):
        super().enterEvent(event)
        self.hoverAnimation.setDirection(self.hoverAnimation.Forward)
        self.hoverAnimation.start()

    def leaveEvent(self, event):
        super().leaveEvent(event)
        self.hoverAnimation.setDirection(self.hoverAnimation.Backward)
        self.hoverAnimation.start()

    def paintEvent(self, event):
        qp = QtGui.QPainter(self)
        qp.setRenderHint(qp.Antialiasing)
        qp.save()

        radius = max(4, min(self.height(), self.width()) * .125)
        clipRect = QtCore.QRectF(self.rect().adjusted(0, 0, -1, -1))
        borderPath = QtGui.QPainterPath()
        borderPath.addRoundedRect(clipRect, radius, radius)
        qp.setClipPath(borderPath)

        qp.fillRect(self.rect(), self.backgroundColors[0])
        qp.setPen(self.foregroundColors[0])
        qp.drawText(self.rect(), 
            QtCore.Qt.AlignCenter|QtCore.Qt.TextShowMnemonic, self.text())

        aniValue = self.hoverAnimation.currentValue()
        if aniValue:
            # use an arbitrary "center" for the radius, based on the widget size
            extent = min(self.height(), self.width()) * 3
            angle = atan(extent / self.width())
            reference = cos(angle) * (extent + self.width())
            x = self.width() - reference
            ratio = 1 - aniValue

            hoverPath = QtGui.QPainterPath()
            hoverPath.moveTo(x, 0)
            hoverPath.lineTo(self.width() - reference * ratio, 0)
            hoverPath.lineTo(self.width(), extent)
            hoverPath.lineTo(x, extent)
            qp.setClipPath(hoverPath, QtCore.Qt.IntersectClip)

            qp.fillRect(self.rect(), self.backgroundColors[1])
            qp.setPen(self.foregroundColors[1])
            qp.drawText(self.rect(), QtCore.Qt.AlignCenter|QtCore.Qt.TextShowMnemonic, self.text())

        qp.restore()
        qp.translate(.5, .5)
        qp.drawRoundedRect(clipRect, radius, radius)

Note: the above implementation is not perfect yet (it has some issues with very wide and short buttons. I'll eventually update this answer as soon as possible, just consider the code as a conceptual reference.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt 自定义动画按钮 的相关文章

  • Qt 计算和比较密码哈希

    目前正在 Qt 中为测验程序构建面向 Web 的身份验证服务 据我了解 在数据库中存储用户密码时 必须对其进行隐藏 以防落入坏人之手 流行的方法似乎是添加的过程Salt https en wikipedia org wiki Salt cr
  • Qt 支持在 QIcon 中为 SVG 着色

    看来 Qt 不支持 SVG 中路径标签上的描边 填充选项
  • 如何像在浏览器中一样检索准确的 HTML

    我正在使用 Python 脚本来呈现网页并检索其 HTML 它适用于大多数页面 但对于其中一些页面 检索到的 HTML 不完整 我不太明白为什么 这是我用来废弃此页面的脚本 由于某种原因 每个产品的链接不在 HTML 中 Link http
  • 如何在 Qt-Embedded 中(正确)输出多语言文本?

    我的目标系统是 linux 3 3 7 Qt Embedded 开源版 4 8 Droid 字体 取自 fonts droid 20111207 git 1 all deb Debian 软件包并复制到 usr lib fonts目录 主要
  • Qt程序部署到多平台,如何?

    我是 Qt 编程新手 我想开发一个程序 我想在 Windows Linux ubuntu 和 Mac 上运行 听说Qt支持多平台应用程序开发 但我的问题是 在我部署或编译后 任何 Qt 库都需要在 Ubuntu 中运行这个应用程序吗 如果您
  • Qt/c++ 随机字符串生成[重复]

    这个问题在这里已经有答案了 我正在创建一个应用程序 需要生成多个随机字符串 几乎就像一个由一定长度的 ASCII 字符组成的唯一 ID 这些字符混合有大写 小写 数字字符 有没有 Qt 库可以实现这一点 如果没有 在纯 C 中生成多个随机字
  • 有没有办法在没有 QApplication::exec() 的情况下使用 Qt?

    有没有一种安全的方法可以在不调用 QApplication exec 的情况下使用 Qt 我有许多不同的对象正在对多个资源执行长期进程 至少其中一个正在与 Web 应用程序服务器进行通信 我正在制作一个 GUI 应用程序 提示用户在正确的时
  • 如何在按下托盘图标菜单操作时执行功能?

    int main int argc char argv QApplication oApp argc argv QAction action1 QMenu menu QSystemTrayIcon TrayIcon QIcon favico
  • 当我尝试构建 Qt 4.7.1 静态库时,“找不到 -ljscore”

    我尝试从最新的源构建静态 Qt 库 但出现以下错误 usr bin ld cannot find ljscore collect2 ld returned 1 exit status 如何解决这个问题呢 这是 Qt 构建系统中自 4 7 0
  • PyQt 和 unittest - 测试信号和槽

    我有一个 pyqt 应用程序 正在为其编写单元测试 它严重依赖信号和槽 为了正确测试它 我必须检查是否发送了正确的信号 做这个的最好方式是什么 我看到 Qt 库有一个 QSignalSpy 但我在 PyQt 中找不到任何对此的引用 我能想到
  • QT/QML Android App,点击通知栏时打开应用程序

    我为 Android 应用程序制作了一个 QT 当我单击平板电脑中上面看到的按钮通知栏时 但是 如果单击通知 我的应用程序将打开 聚焦 不知道 并显示黑色窗口 简单来说怎么做呢 我的代码是 package org ays operation
  • Qt中如何获取鼠标在屏幕上的位置?

    我想获取屏幕上的鼠标坐标 我怎样才能在 Qt 中做到这一点 在 Windows 上 使用 C 我正在做类似答案中建议的事情对于这个问题 https stackoverflow com q 11737665 1420197 正如文档所述 QC
  • Qt:将拖放委托给子级的最佳方式

    我在 QWidget 上使用拖放 我重新实现了 DragEnterEvent dragLeaveEvent dragMoveEvent 和 dropEvent 效果很好 在我的 QWidget 中 我有其他 QWidget 子级 我希望它们
  • QTextEdit.find() 在 Python 中不起作用

    演示问题的简单代码 usr bin env python import sys from PyQt4 QtCore import QObject SIGNAL from PyQt4 QtGui import QApplication QTe
  • 如何使用 Qtimer 添加 1 秒延迟

    我目前有一个方法如下 void SomeMethod int a Delay for one sec timer gt start 1000 After one sec SomeOtherFunction a 这个方法实际上是一个附加到信号
  • 从源安装PyQt5:无法导入PyQt5.sip

    我正在尝试从源代码构建 PyQt5 我正在运行 fedora 28 并且我通过安装了 Qt5dnf 安装 SIP 以下this http pyqt sourceforge net Docs sip4 installation html看起来
  • 如何在 Qt 中以编程方式制作一条水平线

    我想弄清楚如何在 Qt 中制作一条水平线 这很容易在设计器中创建 但我想以编程方式创建一个 我已经做了一些谷歌搜索并查看了 ui 文件中的 xml 但无法弄清楚任何内容 ui 文件中的 xml 如下所示
  • 如何在 QTabWidget Qt 中展开选项卡

    我有一个QTabWidget像这个 但我想展开选项卡以 填充 整个小部件宽度 如下所示 我怎样才能做到这一点 我在用Qt 5 3 2 and Qt 创建者 3 2 1 Update 我尝试使用setExpanding功能 ui gt myT
  • Qt:测量事件处理时间

    我想测量我的应用程序中的哪些事件在主线程中需要很长时间才能执行 阻塞 GUI 或者至少是否有任何事件花费的时间超过 比如说 10 毫秒 显然 我对需要很长时间的任务使用线程和并发 但有时很难在其他线程中放入的内容和可以保留在 GUI 中的内
  • QTimer 一点也不准确?

    运行在 Windows7 64 位机器上 具有非常强大的 CPU 8 核 16 线程 我使用 QTimer 以 50Hz 触发函数调用 但我最终得到了 30Hz 函数调用本身肯定需要不到 10 毫秒才能完成 整个过程发生在一个单独的线程中

随机推荐

  • 表达式树如何提供对局部变量的访问? [复制]

    这个问题在这里已经有答案了 这个问题与闭包如何工作无关 这个问题是关于 LINQ 如何决定将哪些内容引用到运行时可解析表达式中 以及评估哪些内容并将其放入该表达式中 这个问题试图理解 LINQ 的工作原理 用另一种语言实现类似的东西 考虑以
  • Unicode 编码错误“latin-1”编解码器无法编码字符“\u2019”

    我正在尝试从 MySQL RDB 创建数据 CSV 以将其移至 Amazon Redshift 但是 其中一个字段包含描述 其中一些描述包含 字符或右侧单引号 在我运行代码之前 它会给我 UnicodeEncodeError charmap
  • 查询MongoDB仅在特定时间搜索[重复]

    这个问题在这里已经有答案了 我有一个问题 我想按一天中的特定时间进行搜索 开始吧 我的数据模式如下所示 symbol Orange timestamp ISODate 2016 05 01T20 00 00 000Z price 10 我有
  • 谷歌地图(网络应用程序)如何通过手势/捏合在 iphone/ipad 上如此平滑地缩放?

    如果您在 iPhone 或 iPad 上使用过 Google 地图网络应用程序 您就会知道我在说什么 你在这个屏幕抓取中看不到我的手指 但这是中捏 如果你愿意的话 缩小的 详细区域是初始地图查看区域 外面的模糊部分是中间夹点时进入视野的额外
  • JavaScript 中的基本流程控制

    您能给我解释一下如何用 JavaScript 编写真正基本的流程控制吗 谢谢 flow function callback do something callback run next function function callback
  • 如何在 Java 中将 POJO 转换为 Map,反之亦然?

    我的用例是将任意 POJO 转换为 Map 然后从 Map 转换回 POJO 所以我最终使用了 POJO gt json gt org bson Document 策略 然后回到 org bson Document gt json gt P
  • 哪些因素影响 ggplot 图例的排序方式

    我正在 R 中创建一个散点图 用户可以在其中添加或删除显示固定参考值的水平线 这样做时 我注意到更改参考线的名称会对图例重新排序 因此有时水平线出现在散点图例元素之前 有时出现在之后 Compare to 下面是一个可重现的示例 YEAR
  • 从 URL 获取图像作为缓冲区

    我花了几个小时尝试获取图像数据作为缓冲区 搜索结果导致我使用 请求 模块 其他建议导致使用更高版本的节点中的其他模块 我无法使用它 因为我们依赖于节点 v 6 11迄今为止 这是我的试验 request imageURL pipe fs c
  • 如何在没有唯一索引或主键的情况下在 MySQL 中使用 ON DUPLICATE KEY UPDATE?

    MySQL 手册指出 如果指定 ON DUPLICATE KEY UPDATE 并且插入一行 会导致 UNIQUE 索引或 PRIMARY KEY 中出现重复值 如果您的表没有 UNIQUE 索引或 PRIMARY KEY 但您不想重复列的
  • 如何在php中将日期和时间转换为时间戳?

    我有个约会 07 23 2009 和一个时间 18 11 我想从中获取时间戳 这是我的例子 date default timezone set UTC d str replace 07 23 2009 t str replace 18 11
  • 使用 useReducer 时如何获取 useCallback 中的当前状态?

    将 React hooks 与 TypeScript 一起使用 这是我想要做的事情的最小表示 在屏幕上有一个按钮列表 当用户单击按钮时 我想将按钮的文本更改为 单击按钮 并且然后只重新渲染被单击的按钮 我使用 useCallback 来包装
  • 如何在Python中连接整数区间?

    我已经使用了模块间隔 http pyinterval readthedocs io en latest index html http pyinterval readthedocs io en latest index html 并从一组或
  • Ruby on Rails 源代码安全/混淆[重复]

    这个问题在这里已经有答案了 我刚刚开始 Ruby on Rails 开发 我有一个关于源代码 隐私 的问题 据我目前所知 我还没有做部署 只是在本地开发环境中使用了FoR 当部署 RoR 应用程序时 所有源代码在服务器上都是 可见 的 我如
  • 从其子序列的集合中构建最短的字符串

    给定字符串中的子序列的集合 例如 abc acd bcd 问题是 如何从这些序列中确定最短的字符串 对于上面的例子 最短的字符串是abcd Here 子序列表示字符串的一部分 但不一定是连续的 喜欢acd是字符串的子序列abcd Edit
  • 防止 PowerShell 将值类型包装在 PSObject 中

    我有一个使用大量委托的 NET API 我的 API 有几个类似于以下的方法 public static class MyClass public static void DoSomethingWithString Func myFunc
  • 默认 xml 命名空间在 XAML 中如何工作?

    xmlns http schemas microsoft com winfx 2006 xaml presentation 该 url 如何映射到 NET 命名空间 您能否举例说明如何对自定义 NET 类 命名空间执行相同的操作 它是一个必
  • 无法启动 uwsgi 进程

    无法通过 ini 标志启动 uwsgi 进程 uwsgi ini file ini 没有任何 uwsgi pid ps aux grep uwsgi root 31605 0 0 0 3 5732 768 pts 0 S 06 46 0 0
  • 如何计算cosmos DB中的不同值

    我在 Cosmos DB 中创建了一些文档 如下所示 class class01 student lastReport Name st01 score C Name st02 score B lastTime 2018 05 10 clas
  • Django 测试返回登录重定向 302,即使用户已登录

    我对如何测试需要登录的页面感到非常困惑 我在响应中不断收到 302 而不是 200 并且在检查 pdb 中的响应时 我肯定会重定向到登录页面 我正在使用登录中间件而不是装饰器 如果相关的话 class SimplePageLoadsTest
  • Qt 自定义动画按钮

    我正在尝试创建自定义动画按钮 我找到了这个页面 按钮示例 https tympanus net Development ButtonHoverStyles 我喜欢这个网站上的 3 和 19 我试过做3个 但不一样 有人能帮我吗 我的网站上第