- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用一个 QStackedWidget
,它有自己的 enterEvent
和 leaveEvent
。当我将鼠标移动到 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/
我在 Qt 中遇到鼠标事件的奇怪问题。我有以下代码: #ifndef QSTONEFIELD_HPP_ #define QSTONEFIELD_HPP_ #include #include cla
从 Qt 4.8 移植到 5.4 后,我遇到了下一个问题......当我显示多个设置了 Qt::Popup 标志的小部件时,只有第一个小部件可以接收鼠标 enterEvent 或 leaveEvent
我正在使用一个 QStackedWidget,它有自己的 enterEvent 和 leaveEvent。当我将鼠标移动到 QStackedWidget 时,enterEvent 将当前索引设置为 1
我是一名优秀的程序员,十分优秀!