gpt4 book ai didi

python - 在 PyQt5 和 PySide2 中重写 PaintEvent

转载 作者:行者123 更新时间:2023-11-30 22:05:16 27 4
gpt4 key购买 nike

我使用 PyQt 和 PySide 一段时间了。今天我偶然发现了一个奇怪的行为:重新实现paintEvent似乎在Qt5的Python版本中不起作用。我在 Qt4 中从未遇到过这个问题。

from PySide2 import QtWidgets, QtCore, QtGui # use pyside
# from PyQt5 import QtWidgets, QtCore, QtGui # use pyqt
import sys


class TagWidget(QtWidgets.QWidget):

def __init__(self, parent):
super().__init__(parent)
print("__init__")


def paintEvent(self, e):
# this is called or not
# depends (see below)
print("paintEvent")
raise(AssertionError)


class MyGui(QtWidgets.QMainWindow):


def __init__(self,parent=None):
super(MyGui, self).__init__()
self.setupUi()

def setupUi(self):
self.setGeometry(QtCore.QRect(100,100,500,500))

self.w=QtWidgets.QWidget(self)
self.setCentralWidget(self.w)

self.lay = QtWidgets.QHBoxLayout(self.w)
self.image = TagWidget(self.w)
self.lay.addWidget(self.image)

# return
# exit here, and TagWidget.paintEvent
# is still being called

self.file_list = QtWidgets.QListWidget(self.w)

# return
# exit here, and TagWidget.paintEvent
# is still being called

self.lay.addWidget(self.file_list)

# .. but if we reach all the way here,
# TagWidget.paintEvent is never called !


def main():
app=QtWidgets.QApplication(["test_app"])
mg=MyGui()
mg.show()
app.exec_()


if (__name__=="__main__"):
main()

因此,我们只是测试 PaintEvent 是否被调用(通过在调用时引发 AssertionError)。

一旦我们将另一个小部件添加到 TagWidget 所在的同一布局中,paintEvent 就不再有效。

太奇怪了。感谢帮助。

最佳答案

paintEvent() 在需要重新绘制时调用,如果小部件具有 size(0, 0),或者尺寸无效或被隐藏,该方法不存在调用,这就是您的情况发生的情况,当使用布局时,默认情况下它将采用 sizeHint() 的大小,默认情况下 QWidget sizeHint()QSize(-1, -1) 因此无需绘制。

所以解决方案是设置适当的sizeHint():

class TagWidget(QtWidgets.QWidget):
def paintEvent(self, e):
print("paintEvent")
raise(AssertionError)

def sizeHint(self):
print("default sizeHint: ", super(TagWidget, self).sizeHint())
return QtCore.QSize(640, 480)

我已经用PyQt4PySide尝试过,并且发生了同样的问题,所以问题不是Qt,而是具体的示例。

关于python - 在 PyQt5 和 PySide2 中重写 PaintEvent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53072068/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com