This wiki is in the process of being archived due to lack of usage and the resources necessary to serve it — predominately to bots, crawlers, and LLM companies. Edits are discouraged.
Pages are preserved as they were at the time of archival. For current information, please visit python.org.
If a change to this archive is absolutely needed, requests can be made via the infrastructure@python.org mailing list.

Fading Between Widgets

This example was written in response to a message on the Python-list mailing list. It shows how to implement a stacked widget that fades between widgets on different pages.

import sys
from PyQt4.QtCore import QTimeLine
from PyQt4.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 paintEvent(self, event):
 
 painter = QPainter()
 painter.begin(self)
 painter.setOpacity(self.pixmap_opacity)
 painter.drawPixmap(0, 0, self.old_pixmap)
 painter.end()
 
 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))
 QStackedWidget.setCurrentIndex(self, index)
 
 def setPage1(self):
 self.setCurrentIndex(0)
 
 def setPage2(self):
 self.setCurrentIndex(1)


if __name__ == "__main__":

 app = QApplication(sys.argv)
 
 window = QWidget()
 
 stack = StackedWidget()
 stack.addWidget(QCalendarWidget())
 editor = QTextEdit()
 editor.setPlainText("Hello world! "*100)
 stack.addWidget(editor)
 
 page1Button = QPushButton("Page 1")
 page2Button = QPushButton("Page 2")
 page1Button.clicked.connect(stack.setPage1)
 page2Button.clicked.connect(stack.setPage2)
 
 layout = QGridLayout(window)
 layout.addWidget(stack, 0, 0, 1, 2)
 layout.addWidget(page1Button, 1, 0)
 layout.addWidget(page2Button, 1, 1)
 
 window.show()
 
 sys.exit(app.exec_())

2026年02月14日 16:12

AltStyle によって変換されたページ (->オリジナル) /