update()不会触发paintEvent()

时间:2019-08-23 17:55:01

标签: python pyqt pyqt5 qpainter

我正在尝试在图像上绘制一个交互式缩放框,这将导致缩放的图像出现在其他图像窗口中。我的问题是没有任何东西触发paintEvent()。实例化对象后,它不会执行,而且我无法使用update()或repaint()手动触发它。

我在里面放了一个print()语句,以确保paintEvent()没有被执行(不是)。我知道在图像上绘制矩形的代码是可行的,因为我通过直接在 init ()语句中执行它来对其进行了测试。我尝试使用update()(并使用QApplication.processEvent()强制执行)和repaint()。

from math import floor, ceil
from PyQt5.QtWidgets import QLabel, QApplication, QHBoxLayout, QWidget, QGraphicsRectItem
from PyQt5.QtCore import Qt, QSize 
from PyQt5.QtGui import QPixmap, QColor, QPainter, QPolygon, QBrush, QPen
import sys
from RangeSlider import *
from StyleSheet import *
from LayoutDefine import *

class ZoomBox(QLabel):

    def __init__(self, parent, zoomLevel = 100, penWidth = 3):
        super(ZoomBox, self).__init__()
        # zoomLevel specified in pct
        if zoomLevel < 100:
            self.zoom = 100
        else:
            self.zoom = zoomLevel
        self.rectPen = QPen(QColor("#ff1f1f"))
        self.rectPen.setWidth(penWidth)
        self.left, self.top = 0, 0
        self.parent = parent
        self.DefSize()
        self.update()
        QApplication.processEvents()

    def DefSize(self):
        self.width = ceil(self.parent.width() / self.zoom * 100)
        self.height = ceil(self.parent.height() / self.zoom * 100)

    def paintEvent(self, event):
        print("paintEvent")
        self.DefSize()
        img = QPixmap([path/to/image]).scaledToHeight(parent.height(), Qt.SmoothTransformation)
        painter = QPainter(img)
        painter.begin(self.parent)
        painter.setRenderHint(QPainter.Antialiasing)
        painter.setPen(self.rectPen)
        painter.drawRect(self.left, self.top, self.width, self.height)
        painter.end()
        parent.setPixmap(img)

class VidWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.InitUI()

    def InitUI(self):

        foo = QLabel()
        foo.setMaximumHeight(500)
        foo.setPixmap(QPixmap([path/to/image]).scaledToHeight(500))
        ZoomBox(foo)

        bar = QHBoxLayout()
        bar.addWidget(foo)
        self.setLayout(bar)
        self.showMaximized()

        foo.update()

if __name__ == '__main__':

    # init application
    app = QApplication(sys.argv)

    # instantiate main window
    ex = VidWindow()

    # end program handler
    sys.exit(app.exec_())

结果是..什么都没有。什么都没画,也没有错误消息输出。

P.S。对所有进口商品表示歉意,我不确定我可以删除哪些进口商品,而且我也考虑到可能存在冲突。

1 个答案:

答案 0 :(得分:0)

musicamante,3小时前(作为评论):

  

zoomBox无法绘制的原因是您没有   将其分配给任何持久对象属性,这意味着它是   InitUi返回后立即删除。而且,它没有父:   您只是将父项设置为本地属性,而您应该   可能将其添加为超级初始化的参数);如果你不这样做   那,您必须显式调用show()。就是说,整个   程序有点混乱,您可能会想澄清您的逻辑   还有一些。