如何在PyQt4中用动画画一条线

2023-12-28

我有一个要点清单。例如,points = [[160, 75], [115, 567]].

How to draw a line in PyQt4, so it would be something like this: Line

提前致谢。

EDIT: For the record, I'm trying to implement Bezier Curves, so it looked like this: Quartic Bézier curve

这是我现在的代码:

from PyQt4.QtGui import QWidget, QPolygonF, QPainter, QPen, QBrush, QColor, \
    QApplication, QIcon, QVBoxLayout, QSlider, QHBoxLayout, QPushButton, QLCDNumber
from PyQt4.QtCore import QObject, SIGNAL, SLOT, QPointF, Qt, QRectF, QPointF
import time, sys

#================================================================
# For the next block I used this post
# http://stackoverflow.com/a/3220819/736306, 
# but I wish to replace it with self.liniar_bez(),
# biliniar_bez(), self.cubic_bez() and self.fourG_bez()
# because I want to control 't' with self.slider

def avg(a, b):
  xa, ya = a
  xb, yb = b
  return (xa + xb) * 0.5, (ya + yb) * 0.5

def bez4split(p0, p1, p2, p3, p4):
    p01 = avg(p0, p1)
    p12 = avg(p1, p2)
    p23 = avg(p2, p3)
    p34 = avg(p3, p4)
    p012 = avg(p01, p12)
    p123 = avg(p12, p23)
    p234 = avg(p23, p34)
    p0123 = avg(p012, p123)
    p1234 = avg(p123, p234)
    p01234 = avg(p0123, p1234)
    return [(p0, p01, p012, p0123, p01234),
        (p01234, p1234, p234, p34, p4)]

def bez4(p0, p1, p2, p3, p4, levels=5):
    if levels <= 0:
        return [p0, p4]
    else:
        (a0, a1, a2, a3, a4), (b0, b1, b2, b3, b4) = bez4split(p0, p1, p2, p3, p4)
        return (bez4(a0, a1, a2, a3, a4, levels - 1) +
                bez4(b0, b1, b2, b3, b4, levels - 1)[1:])
#================================================================

points = [[160, 75], [115, 567], [292, 58], [685, 194], [734, 517]]
coords = bez4(*points)

class Bezier(QWidget):
    def __init__(self, parent=None):
        QWidget.__init__(self, parent)

        self.lcd = QLCDNumber(self)
        self.slider = QSlider(Qt.Horizontal, self)
        self.slider.setRange(0, 100)
        self.closeButton = QPushButton('Close')

        bottomLayout = QHBoxLayout()
        bottomLayout.addWidget(self.lcd)
        bottomLayout.addWidget(self.slider)
        bottomLayout.addWidget(self.closeButton)

        mainLayout = QVBoxLayout()
        mainLayout.addStretch(1)
        mainLayout.addLayout(bottomLayout)

        self.setLayout(mainLayout)

        self.time = 0
        self.time_step = 0.025
        self.timer_id = self.startTimer(1)

        self.tracking = None

        QObject.connect(self.closeButton, SIGNAL('clicked(bool)'), app.exit)
        QObject.connect(self.slider, SIGNAL('valueChanged(int)'), self.lcd, SLOT('display(float)'))
        #self.slider.valueChanged.connect(self.lcd.display)

        self.setWindowTitle('Bonus Example')

    def poly(self, pts):
        return QPolygonF(map(lambda p: QPointF(*p), pts))

    def bezAnimation(self):
        painter = QPainter(self)
        painter.setRenderHints(QPainter.Antialiasing)

        pts = points[:]
        crds = coords[:]

        painter.setPen(QPen(QColor(Qt.lightGray), 3, Qt.DashDotDotLine))
        painter.drawPolyline(self.poly(pts))

        painter.setBrush(QBrush(QColor(255, 025, 0)))
        painter.setPen(QPen(QColor(Qt.lightGray), 1))
        for x, y in pts:
            painter.drawEllipse(QRectF(x - 4, y - 4, 8, 8))

    def paintEvent(self, event):
        self.bezAnimation()

    # As you know, 0.00 > 't' > 1.00
    # and QSlider does not provide support for float numbers,
    # so we simply divide t by 100
    def liniar_bez(self, p, t):
        t = t / 100.0
        new_p[0] = (1 - t) * p[0][0] + t * p[1][0]
        new_p[1] = (1 - t) * p[0][1] + t * p[1][1]

    def biliniar_bez(self, p, t):
        t = t / 100.0
        new_p[0][0] = ((1 - t) ** 2) * p[0][0] + 2 * (1 - t) * t * p[1][0] + (t ** 2) * p[2][0]
        new_p[0][1] = ((1 - t) ** 2) * p[0][1] + 2 * (1 - t) * t * p[1][1] + (t ** 2) * p[2][1]

    def cubic_bez(self, p, t):
        t = t / 100.0
        new_p[0][0] = ((1 - t) ** 3) * p[0][0] + 3 * ((1 - t) ** 2) * t * p[1][0] + (t ** 2) * p[2][0] + (t ** 3) * p[3][0]
        new_p[0][1] = ((1 - t) ** 3) * p[0][1] + 3 * ((1 - t) ** 2) * t * p[1][1] + (t ** 2) * p[2][1] + (t ** 3) * p[3][1]

    def fourG_bez(self, p, t):
        t = t / 100.0
        new_p[0][0] = ((1 - t) ** 4) * p[0][0] + 4 * ((1 - t) ** 3) * t * p[1][0] + 4 * (1 - t) * (t ** 2) * p[2][0] + 4 * (1 - t) * (t ** 3) * p[3][0] + (t ** 4) * p[4][0]
        new_p[0][1] = ((1 - t) ** 4) * p[0][1] + 4 * ((1 - t) ** 3) * t * p[1][1] + 4 * (1 - t) * (t ** 2) * p[2][1] + 4 * (1 - t) * (t ** 3) * p[3][1] + (t ** 4) * p[4][1]

    def timerEvent(self, event):
        if self.timer_id == event.timerId():
            #self.bezAnimation()
            self.time += self.time_step
            self.update()

    def closeEvent(self, event):
        self.deleteLater()

    #================================================================
    # And this one too
    # http://stackoverflow.com/a/3220819/736306
    def mousePressEvent(self, event):
        i = min(range(len(points)),
            key=lambda i: (event.x() - points[i][0]) ** 2 +
                      (event.y() - points[i][1]) ** 2)

        self.tracking = lambda p: points.__setitem__(i, p)

    def mouseMoveEvent(self, event):
       if self.tracking:
            self.tracking((event.x(), event.y()))
            self.update()

    def mouseReleaseEvent(self, event):
        self.tracking = None
    #================================================================

if __name__ == '__main__':
    app = QApplication(sys.argv)
    form = Bezier()
    form.setGeometry(10, 30, 871, 727)
    form.show()
    sys.exit(app.exec_())

所以,我关于如何解决这个问题的想法: 1. 使用 self.bilinar_bez(),..., self.fourG_bez() 构建所有曲线 2.他们有相同的点,所以他们在这一点上实际上是匹配的。 3.移动点(我认为,它们的位置必须与t, so if t=0.25那么此时每个点都必须经过其线的四分之一)

问题出在移动点的方式上。我有每条线的第一点和第二点的坐标。需要中间的。


  1. 如果您使用普通的小部件,那么您会看到QPainter.drawPath() http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/qpainter.html#drawPath
  2. 如果您正在使用 QGraphics,那么您会看到QGraphicsPathItem http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/qgraphicspathitem.html

这两者中的任何一个都会有类似的方法,在绘制过程中,您必须随着时间的推移逐步构建线条。查看您自己之前的问题,了解如何随着时间的推移绘制一条线的具体示例:在 PySide/PyQt 中使用 drawPolyline 制作动画波 https://stackoverflow.com/questions/9465047/make-an-animated-wave-with-drawpolyline-in-pyside-pyqt

例如,如果您使用 QGraphics,那么您的场景中将有一个 QGraphicsPathItem 实例。然后,您可以通过循环和更新 QPainterPath(通过增量设置完整路径)来为其设置动画:http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/qpainterpath.html#cubicTo http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/qpainterpath.html#cubicTo

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

如何在PyQt4中用动画画一条线 的相关文章

  • sudo 和 pip 不在同一路径上

    pip and sudo不在我的计算机上的同一路径上 因此当 基本上一直 我需要运行这两个命令时 如下所示 sudo pip install xxx I get sudo pip command not found pip下载软件包 但由于
  • 从 asyncio 子进程获取实时输出

    我正在尝试使用 Python asyncio 子进程来启动交互式 SSH 会话并自动输入密码 实际用例并不重要 但它有助于说明我的问题 这是我的代码 proc await asyncio create subprocess exec ssh
  • 从 Python 中的 message_from_string() 获取发件人地址

    有人可以告诉我如何在Python中从email message from string 获取发件人地址吗 谢谢 我试过 message email message from string email text from message Fr
  • 嵌套函数中的变量作用域

    有人可以解释为什么以下程序失败 def g f for in range 10 f def main x 10 def f print x x x 1 g f if name main main 带有消息 Traceback most re
  • MacOS Big Sur 中的 NPM 错误“找不到 Python 可执行文件”

    我已经花了整整一周的时间寻找这个问题的答案 但没有成功 我查看了每个 StackOverflow 帖子 Google 的每一篇文章以及我能找到的每个相关的 Github 问题 大多数相关错误似乎都比较旧 所以我想知道我的问题是否由于我使用的
  • TemplateSyntaxError:“settings_tags”不是有效的标签库

    当我尝试运行此测试用例时 出现此错误 这是在我的 django 应用程序的tests py 中编写的 def test accounts register self self url http royalflag com pk accoun
  • 如何使用 Pycharm 运行 fast-api 服务器?

    我有一个简单的 API 函数 如下所示 from fastapi import FastAPI app FastAPI app get async def read root return Hello World 我正在使用启动服务器uvi
  • 将 numpy 数组及其大小写入二进制文件

    我需要将 2D numpy 数组写入文件 包括其尺寸 以便我可以从 C 程序中读取它并创建相应的数组 我编写了一些简单的代码来保存数组 并且可以从 C 读取它 但是如果我尝试先写入数组的大小 它总是会给我一个错误 这是我的简单 python
  • 使用 Poetry 创建的 Python 项目:如何在 Visual Studio Code 中调试它?

    我有一个根据基本 Poetry 创建的 Python 项目指示 https python poetry org docs basic usage 项目文件夹是这样的 my project my project my project py F
  • 如何检查给定的数字是否是2的幂?

    下面的代码不适用于某些输入 a i set 1 while i lt 10000 a add i i lt lt 1 N int input if N in a print True else print False 我最初的想法是检查每个
  • 如何同时有效地运行多个 Pytorch 进程/模型? Traceback:分页文件太小,无法完成此操作

    背景 我有一个非常小的网络 我想用不同的随机种子进行测试 该网络几乎只使用了我的 GPU 计算能力的 1 因此理论上我可以同时运行 50 个进程来同时尝试许多不同的种子 Problem 不幸的是我什至无法在多个进程中导入 pytorch 当
  • 如何用pygame画一条虚线?

    我需要在坐标系上绘制正弦波和余弦波 就像在this https i stack imgur com DGI8g png图片 除了没能代表以外 我所有的工作都做得很好虚线和曲线与 pygame 一致 我有与我需要的类似的东西 但我怎样才能让它
  • 在Python中,如何通过去掉括号和大括号来打印Json

    我想以一种很好的方式打印 Json 我想去掉方括号 引号和大括号 只使用缩进和行尾来显示 json 的结构 例如 如果我有一个像这样的 Json A A1 1 A2 2 B B1 B11 B111 1 B112 2 B12 B121 1
  • Python MySQLdb:connection.close() VS。光标.close()

    如果我使用MySQLdb通过Python连接到MySQL Server 我创建一个connection and a cursor像这样 connection MySQLdb connect cursor connection cursor
  • 如何停止 PythonShell

    如何终止 停止 Node js 中 PythonShell 执行的 Python 脚本的执行 我在交互模式下运行 输出通过 socket io 发送到给定的房间 如果没有更多的客户端连接到这个房间 我想停止 python 脚本的执行 这是我
  • 在 Keras 中使用有状态 LSTM 训练多变量多级数回归问题

    我有时间序列P过程 每个过程的长度各不相同 但都有 5 个变量 维度 我试图预测测试过程的估计寿命 我正在用有状态的方法来解决这个问题LSTM在喀拉斯 但我不确定我的训练过程是否正确 我将每个序列分成长度的批次30 所以每个序列都是这样的形
  • numpy 向量化而不是 for 循环

    我用 Python 写了一些代码 运行良好 但速度很慢 我认为是由于 for 循环 我希望可以使用 numpy 命令加速以下操作 让我定义目标 假设我有一个 2D numpy 数组all CMs尺寸row x col 例如考虑一个6x11数
  • 数据类和属性装饰器

    我一直在阅读 Python 3 7 的数据类 作为命名元组的替代品 我通常在必须将数据分组到结构中时使用它 我想知道数据类是否与属性装饰器兼容 以便为数据类的数据元素定义 getter 和 setter 函数 如果是这样 是否在某处进行了描
  • 如何在 Jupyter Notebook 中选择 conda 环境

    我安装了 Anaconda 5 3 和 Python 3 7 根环境 之后我使用 Python 3 6 创建了一个新环境 py36 我激活了新环境activate py36 conda env list表明环境是活跃的 但是当我启动 Jup
  • nltk 标记化和缩写

    我用 nltk 对文本进行标记 只是将句子输入到 wordpunct tokenizer 中 这会拆分缩写 例如 don t 到 don t 但我想将它们保留为一个单词 我正在改进我的方法 以实现更精确的文本标记化 因此我需要更深入地研究

随机推荐

  • C++ 将私有纯虚方法重写为公共方法

    为什么会出现这种情况 http coliru stacked crooked com a e1376beff0c157a1 http coliru stacked crooked com a e1376beff0c157a1 class B
  • NDepend CQL 查询缺少 IDisposable 实现

    我意识到这个问题正在寻找的查询不足以找到 IDisposable 实现的每个小问题 但每个早期警告都很重要 所以我会采取我能得到的 我想知道是否有人提出了一个 NDepend 的 CQL 查询 该查询将列出所有未实现 IDisposable
  • Spring Boot @Autowired 在运行时创建实例

    作为大多数 Spring Boot 新用户 我对 Autowired 有一个问题 D 我在这里阅读了大量有关此注释的主题 但仍然找不到适合我的问题的解决方案 假设我们有这个 Spring Boot 层次结构 SpringBootApplic
  • 在同一个项目中运行多个数据库好吗?

    我读过很多数据库设计书籍 但它们都只使用one数据库来处理一个专案 但我想知道这是一个好主意吗multiple数据库处理同一个项目 并不真地 当然在某些情况下是需要甚至是可取的 但这些都是针对特定用例的 一般来说 您不希望将关系完整性 难以
  • 如何使用约束编辑器中查询的结果集有条件地执行 SQL 任务?

    我的 SQL 脚本存储在 gempar NULL and in beneficiary 2018 01 01 需要根据这些变量的内容执行下一个执行SQL 任务 如果ISNULL gempar True那么我们不运行以下任务 因为那时 gem
  • JavaScript 运行时错误:“$”未定义

    有人可以帮助解决我的代码中的这个错误吗 当我在 Internet Explorer 中启动网站时出现此错误 JavaScript 运行时错误 未定义 这是代码请帮助我在java脚本中需要更改什么
  • 添加逗号或空格以每三位数字分组

    我有一个向数字添加逗号的函数 function commafy num num toString replace B d 3 g 不幸的是 它不太喜欢小数 鉴于以下使用示例 扩展我的功能的最佳方法是什么 commafy 123 123 co
  • 将节点插入抽象语法树

    ast模块的文档 https docs python org 3 library ast html解释如何使用以下命令替换 AST 中的节点节点转换器 https docs python org 3 library ast html ast
  • 从 Scala 函数到 Java 函数的隐式转换

    我想创建从 Scala 函数 可能是匿名 到java util function Function 这是我所拥有的 import java util function Function gt JavaFunction implicit de
  • 如何解决 ValueError:输入包含 NaN、无穷大或对于 dtype('float64') 来说太大的值

    所以我有这个代码 Data quest pd read csv inputFile csv names A1 A2 A200 Sim print quest head Set up Data and Label X quest drop S
  • 如何在程序运行时且仅在用户确认关闭并卸载后才将其卸载 - Inno Setup

    嘿 当我的程序在 Windows 中运行时 我需要使用 Inno Setup 卸载它 我喜欢我的卸载程序检测它是否正在运行并向用户提供一个消息框 例如 Windows 10 登录背景更改器正在运行 是否要关闭它并卸载 上述消息框应该有两个按
  • 访问 cookie,希望是在 JavaScript 中

    我正在开发一个 Firefox 插件 它允许用户 所有用户都属于特定组 该插件的受众范围非常有限 从状态栏查看其身份验证 cookie 的状态 我们都必须进行身份验证才能访问与工作相关的网站 但是当 cookie 过期时我们不会收到任何警告
  • 使用notepad++执行命令

    如何使用 Notepad 中的运行命令指定要处理的实际文件 例如 我想使用实际文件作为输入或 cs 编译器等运行 pdflatex 使用整个路径是不切实际的 它必须适用于任何实际文件 您可以使用执行字符串中的变量自动添加当前文件 C tem
  • require.js 的替代方式是 require?

    require js 的新功能 我有这个 define jquery underscore backbone views sidebar views dashboard views users views venues views paym
  • 如何确定与 PHP 中的 MIME 类型关联的扩展名?

    我可以使用 MIME 类型到 PHP 扩展的快速而肮脏的映射吗 不是内置的 但自己推出并不难 function system extension mime types Returns the system MIME type mapping
  • 在 32 位应用程序中使用 64 位整数可以吗?

    我注意到在 C 和 C 中 我们可以使用int64 t 或者只是一个long long 如果我编译32位代码使用这些类型 我会遇到任何性能问题吗64bit and or 32位机器 除了节省一些内存之外 我还有理由只使用int 毕竟 64
  • Postgresql 的函数

    在这个网站上我看到了一个函数 我想将其与 postgresql 一起使用 https raresql com 2013 05 16 sql server excel financial functions pmt https raresql
  • Angular 12 库源映射不可用

    升级到 Angular 12 后 自定义 Angular 库组件的源映射不再可用于调试 这是一部分angular json来自使用该库的 Angular 应用程序模块 projects myapp build configurations
  • 使用 POST 而不是 GET 的 REST API

    假设某个服务提供了一些我可以像这样使用的功能 GET service function param1 value1 param2 value2 我可以将它与 POST 查询一起使用吗 POST service function param1
  • 如何在PyQt4中用动画画一条线

    我有一个要点清单 例如 points 160 75 115 567 How to draw a line in PyQt4 so it would be something like this 提前致谢 EDIT For the recor