0

我无计可施。我已经尝试了几天,似乎无法弄清楚我做错了什么。我认为我做错了什么,因为我找不到任何其他对我的问题的引用。当我在 QOpenGLWidget 中覆盖paintEvent 时,即使我在 QT Designer 中将最小和最大高度设置为 48,小部件的大小始终为 (100, 30)。并且对宽度没有限制。这是初始化代码:

from PyQt5 import uic
from PyQt5.QtWidgets import QApplication
from components.PaletteBar import PaletteBar


Form, Window = uic.loadUiType("qt/main.ui")

app = QApplication([])
window = Window()
form = Form()
form.setupUi(window)
palette = PaletteBar(form.centralwidget) # A python class that subclasses QOpenGLWidget
window.show()
app.exec_()

这是一些小部件代码:

import math
from PyQt5.QtWidgets import QOpenGLWidget
from PyQt5.QtGui import QPainter, QColor, QPaintEvent, QResizeEvent, QOpenGLContext, QSurfaceFormat
from PyQt5.QtCore import QRect
from fractal.Palette import Palette


class PaletteBar(QOpenGLWidget):
    _my_palette: Palette = None

    def __init__(self, parent):
        super(PaletteBar, self).__init__(parent)

        self._my_palette = Palette({})

    def initializeGL(self) -> None:
        pass

    def paintEvent(self, event:QPaintEvent):
        bounds: QRect = event.rect()
        self.update_view(bounds)

    def paintGL(self):
        pass

    def resizeGL(self, width, height):
        bounds: QRect = QRect(0, 0, width, height)
        self.update_view(bounds)

    def resizeEvent(self, event:QResizeEvent):
        size = event.size()
        bounds: QRect = QRect(0, 0, size.width(), size.height())
        self.update_view(bounds)

    def update_view(self, bounds: QRect):
        painter = QPainter()
        painter.begin(self)

        num_colors = math.floor(len(self.my_palette.colors) / self.my_palette.color_range)
        if num_colors == 0:
            return

        width = math.ceil(bounds.width() / num_colors)
        height = bounds.height()

        for idx in range(num_colors):
            color = self.my_palette.colors[idx]
            x = idx * width
            rect = QRect(x, 0, x + width, height)
            painter.fillRect(rect, color)

        painter.end()

resizeEvent 在启动时被调用,并且 event.size 的值为 (100, 30),即使调整整个应用程序的大小,它也不会再次被调用。

paintEvent 在启动时被调用并且 event.rect 是 (0, 0, 100, 30)。此事件似乎经常被调用,但大小始终相同。

paintGL 和 resizeGL 永远不会被调用。

我觉得我一定是在做一些明显错误的事情,我希望你们中的一位大师能发现它。

4

0 回答 0