首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >update()不触发paintEvent()

update()不触发paintEvent()
EN

Stack Overflow用户
提问于 2019-08-23 17:55:01
回答 1查看 423关注 0票数 0

我试图绘制一个交互式缩放框的图像,这将导致放大的图像出现在其他图像窗口。我的问题是,没有什么会触发paintEvent()。当对象被实例化时,它不会执行,而且我不能使用update()或repaint()手动触发它。

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

代码语言:javascript
复制
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_())

结果是..。没什么。不会绘制任何内容,也不会输出错误消息。

对所有进口产品表示歉意,我对我可以删除哪些进口产品没有信心,我也考虑到可能会发生冲突。

EN

回答 1

Stack Overflow用户

发布于 2019-08-23 23:38:17

音乐人,3小时前(作为评论):

未绘制zoomBox的原因是您没有将其分配给任何持久性对象属性,这意味着它在InitUi返回后立即被删除。此外,它没有父属性:您只是将父属性设置为本地属性,而可能添加它作为超级init的参数);如果不这样做,则必须显式调用show()。尽管如此,整个过程有点混乱,您可能会考虑进一步澄清您的逻辑。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57631003

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档