我无计可施。我已经尝试了几天,似乎无法弄清楚我做错了什么。我认为我做错了什么,因为我找不到任何其他对我的问题的引用。当我在 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 永远不会被调用。
我觉得我一定是在做一些明显错误的事情,我希望你们中的一位大师能发现它。