【问题标题】:How to interactively draw points onto a Pixmap that is on a QLabel in PyQT如何以交互方式在 PyQT 中 QLabel 上的 Pixmap 上绘制点
【发布时间】:2011-06-02 22:31:24
【问题描述】:

我正在构建一个小型 GUI 界面,并且我有一个 QLabel,它通过将图像设置为像素图来将图像从目录绘制到自身上。我希望用户能够以交互方式单击此像素图上的点,并在单击的位置出现一个小的绿色“x”。我尝试过重新实现paintEvent 方法,但这根本不是我想要的功能。每当有理由在 QLabel 上绘画时,paintEvent 都会被调用……而我想单独留下基本图形(图像),只需将点放在已绘制图像的顶部。最终,我希望用户能够使用第三方跟踪算法,通过一系列图像交互式地跟踪这些点。因此,我需要让用户移动点、删除点、添加点和修改它们而不需要重新绘制它们后面的图像的能力。网上有几个关于简单画点的教程,但都涉及重新实现paintEvent方法,然后将mouseEvent连接到paintEvent。我正在努力避免这种情况。有什么建议吗?

【问题讨论】:

    标签: python qt pyqt qpixmap


    【解决方案1】:

    您确实想使用paintEvent() 覆盖。即使您确实只想在图像上绘制东西,如果您删除或移动在图像上绘制的东西,小部件仍然需要能够重绘图像的一部分,这发生在paintEvent()。如果你想在渲染中添加东西,那你也必须这样做。

    paintEvent() 视为draw-the-entire-part-of-the-widget-that's-visible-Event()。如果你使用QLabel 的子类,那么你的覆盖应该调用QLabel::paintEvent(e) 然后你的东西。

    听起来您将维护一个点列表,因此您的paintEvent() 部分应该以您需要的方式绘制所有点。

    您的鼠标事件应该对您的点列表执行一些操作(例如添加一个点或移动一个点),然后调用 update() 这将触发对 paintEvent() 的调用,这将使用背景图像重绘整个小部件并您的更新点。不应将鼠标事件连接到 paintEvent() 或试图在 paintEvent() 中跟踪或处理鼠标事件。

    要记住的主要事情是鼠标事件将修改您的“模型”,而paintEvent() 将在模型更改时绘制整个模型。即使有一个抽象/功能只需要您绘制新事物或改变的事物,在幕后,仍然需要擦除和重绘很多东西。

    这可以通过使用传递给paintEvent() 的事件对象中的区域信息来优化,但这通常不是必需的。

    您可以查看我提供的an answer to another question 中的一个有点相似的示例,尽管它可能与您已经看到的其他示例没有太大不同。不幸的是,它不在 Python 中。

    您可以对内存中的图像进行所有渲染,然后只更新标签显示的图像,但paintEvent() 覆盖是更好的选择。

    【讨论】:

    • 几个问题,因为我是新手:(1)当你说'调用更新'是 mouseEvent 的事情,就像在 mousePressEvent(self,event) 里面我可以调用 event.update (或是self.update)吗? (2) 我目前正在发出我自己的自定义信号 SIGNAL("leftclick"),其中 (x,y) 鼠标位置作为传递的参数。如何让paintEvent 响应此自定义信号,或者这不是必需的。
    • 在您的点击信号槽中,我假设这将是您的 QLable 子类中的一个槽,您将对点列表进行某种更改(应存储在成员中变量) 基于 x,y 信息,然后调用 update();就这样。然后,在您的 paintEvent() 覆盖中,您将使用 points 的成员变量来决定在哪里绘制东西。对 update() 的调用会触发小部件重绘自身,其中包括对 paintEvent() 的调用。
    • 知道了。所以我需要用户交互来改变图形持有对象的私有属性,在这种情况下是一个 QLabel,然后在更新绘图时让paintEvent访问这些属性。
    • 这就是它的要点,是的:)
    • 再次感谢您的帮助。我在这里添加了一个后续问题:stackoverflow.com/questions/6222044/…,以防您有更多时间考虑这些问题。
    猜你喜欢
    • 1970-01-01
    • 2012-05-12
    • 1970-01-01
    • 1970-01-01
    • 2021-08-04
    • 2013-05-01
    • 2013-03-27
    • 2013-12-14
    • 2018-09-15
    相关资源
    最近更新 更多