gpt4 book ai didi

python - 使用 enterEvent 和 leaveEvent 时 PyQt QStackedWidget 上的递归错误

转载 作者:行者123 更新时间:2023-12-04 09:40:44 25 4
gpt4 key购买 nike

我正在使用一个 QStackedWidget,它有自己的 enterEventleaveEvent。当我将鼠标移动到 QStackedWidget 时,enterEvent 将当前索引设置为 1 并在 leaveEvent 上设置当前索引为 0,以便在 QStackedWidget 区域中的鼠标进入和鼠标离开时显示不同的小部件。只有当我快速将鼠标移入和移出时,它才会执行我想要的操作,如果我将鼠标放在该区域的时间过长,我会得到 RecursionError: maximum recursion depth exceeded

这是因为小部件变化太快以至于内部堆栈跟不上吗?我的问题是“我怎样才能确保这个错误不会发生?我想显示一个小部件只要鼠标在 QStackedWidget 上,当它不在时我想显示原始小部件。”

以下是我修改后的代码(Original Source使用按钮设置索引,是PyQt4)

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import QTimeLine
from PyQt5.QtGui import *

class FaderWidget(QWidget):

def __init__(self, old_widget, new_widget):
QWidget.__init__(self, new_widget)
self.old_pixmap = QPixmap(new_widget.size())
old_widget.render(self.old_pixmap)
self.pixmap_opacity = 1.0
self.timeline = QTimeLine()
self.timeline.valueChanged.connect(self.animate)
self.timeline.finished.connect(self.close)
self.timeline.setDuration(333)
self.timeline.start()

self.resize(new_widget.size())
self.show()


def animate(self, value):

self.pixmap_opacity = 1.0 - value
self.repaint()

class StackedWidget(QStackedWidget):

def __init__(self, parent = None):
QStackedWidget.__init__(self, parent)

def setCurrentIndex(self, index):
self.fader_widget = FaderWidget(self.currentWidget(), self.widget(index))
super().setCurrentIndex(index)

def enterEvent(self,event):
self.setCurrentIndex(1)

def leaveEvent(self,event):
self.setCurrentIndex(0)


if __name__ == "__main__":

app = QApplication(sys.argv)

window = QWidget()

stack = StackedWidget()
cal=QCalendarWidget()
stack.addWidget(cal)
editor = QTextEdit()
editor.setPlainText("Hello world! "*100)
stack.addWidget(editor)

layout = QGridLayout(window)
layout.addWidget(stack, 0, 0, 1, 2)

window.show()
sys.exit(app.exec_())

最佳答案

之所以发生递归,是因为当您启动 FaderWidget 时,它会更改焦点并再次调用 enterEvent,从而创建一个新的 FaderWidget。

解决方案是验证旧索引与新索引不同以创建 FadeWidget:

import sys

from PyQt5.QtCore import QTimeLine
from PyQt5.QtGui import QPainter, QPixmap
from PyQt5.QtWidgets import (
QApplication,
QCalendarWidget,
QGridLayout,
QStackedWidget,
QTextEdit,
QWidget,
)


class FaderWidget(QWidget):
def __init__(self, old_widget, new_widget):
QWidget.__init__(self, new_widget)
self.pixmap_opacity = 1.0
self.old_pixmap = QPixmap(new_widget.size())
old_widget.render(self.old_pixmap)

self.timeline = QTimeLine()
self.timeline.valueChanged.connect(self.animate)
self.timeline.finished.connect(self.close)
self.timeline.setDuration(333)
self.timeline.start()

self.resize(new_widget.size())
self.show()

def paintEvent(self, event):
painter = QPainter(self)
painter.setOpacity(self.pixmap_opacity)
painter.drawPixmap(0, 0, self.old_pixmap)

def animate(self, value):
self.pixmap_opacity = 1.0 - value
self.update()


class StackedWidget(QStackedWidget):
def setCurrentIndex(self, index):
if self.currentIndex() != index:
self.fader_widget = FaderWidget(self.currentWidget(), self.widget(index))
super().setCurrentIndex(index)

def enterEvent(self, event):
self.setCurrentIndex(1)

def leaveEvent(self, event):
self.setCurrentIndex(0)


if __name__ == "__main__":

app = QApplication(sys.argv)

window = QWidget()

stack = StackedWidget()
cal = QCalendarWidget()
stack.addWidget(cal)
editor = QTextEdit()
editor.setPlainText("Hello world! " * 100)
stack.addWidget(editor)

layout = QGridLayout(window)
layout.addWidget(stack, 0, 0, 1, 2)

window.show()
sys.exit(app.exec_())

关于python - 使用 enterEvent 和 leaveEvent 时 PyQt QStackedWidget 上的递归错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62346766/

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