如何以交互方式将点绘制到PyQT中QLabel上的Pixmap

时间:2011-06-02 22:31:25

标签: python qt pyqt qpixmap

我正在构建一个小的GUI界面,我有一个QLabel,通过将目录设置为像素图,将目录中的图像绘制到自身上。我希望用户能够以交互方式点击此像素图上的点,并在点击的位置显示一个小的绿色“x”。我已经尝试重新实现paintEvent方法,但这不是我想要的功能。每次有理由在QLabel上绘制时都会调用paintEvent ...而我想单独留下基本绘图(图像)并简单地将点放在已绘制图像的顶部。最终,我希望用户能够使用第三方跟踪算法通过一系列图像以交互方式跟踪这些点。因此,我需要能够让用户移动点,移除点,添加点并修改它们,而无需重新绘制它们后面的图像。有几个简单的绘图点在线教程,但它们都涉及重新实现paintEvent方法,然后将mouseEvent连接到paintEvent。我试图特别避免这一点。有什么建议吗?

1 个答案:

答案 0 :(得分:3)

您实际上确实想要使用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()覆盖是更好的选择。