mirror of
https://github.com/pyqt/examples.git
synced 2025-08-22 17:47:10 +00:00
The commits since then moved many files into the src/ subdirectory. This would have broken existing links on the internet. To solve this, we leave the master branch as-is and make such breaking changes on a different branch.
108 lines
3.9 KiB
Python
108 lines
3.9 KiB
Python
#!/usr/bin/env python
|
|
|
|
#============================================================================#
|
|
# PyQt5 port of the designer/containerextension example from Qt v5.x #
|
|
#----------------------------------------------------------------------------#
|
|
from PyQt5.QtCore import pyqtProperty, pyqtSignal, pyqtSlot, QSize
|
|
from PyQt5.QtWidgets import (QApplication, QComboBox, QLabel, QStackedWidget,
|
|
QVBoxLayout, QWidget)
|
|
|
|
|
|
#============================================================================#
|
|
# Implementation of a MultiPageWidget using a QComboBox and a QStackedWidget #
|
|
#----------------------------------------------------------------------------#
|
|
class PyMultiPageWidget(QWidget):
|
|
|
|
currentIndexChanged = pyqtSignal(int)
|
|
|
|
pageTitleChanged = pyqtSignal(str)
|
|
|
|
def __init__(self, parent=None):
|
|
super(PyMultiPageWidget, self).__init__(parent)
|
|
|
|
self.comboBox = QComboBox()
|
|
# MAGIC
|
|
# It is important that the combo box has an object name beginning
|
|
# with '__qt__passive_', otherwise, it is inactive in the form editor
|
|
# of the designer and you can't change the current page via the
|
|
# combo box.
|
|
# MAGIC
|
|
self.comboBox.setObjectName('__qt__passive_comboBox')
|
|
self.stackWidget = QStackedWidget()
|
|
self.comboBox.activated.connect(self.setCurrentIndex)
|
|
self.layout = QVBoxLayout()
|
|
self.layout.addWidget(self.comboBox)
|
|
self.layout.addWidget(self.stackWidget)
|
|
self.setLayout(self.layout)
|
|
|
|
def sizeHint(self):
|
|
return QSize(200, 150)
|
|
|
|
def count(self):
|
|
return self.stackWidget.count()
|
|
|
|
def widget(self, index):
|
|
return self.stackWidget.widget(index)
|
|
|
|
@pyqtSlot(QWidget)
|
|
def addPage(self, page):
|
|
self.insertPage(self.count(), page)
|
|
|
|
@pyqtSlot(int, QWidget)
|
|
def insertPage(self, index, page):
|
|
page.setParent(self.stackWidget)
|
|
self.stackWidget.insertWidget(index, page)
|
|
title = page.windowTitle()
|
|
if title == "":
|
|
title = "Page %d" % (self.comboBox.count() + 1)
|
|
page.setWindowTitle(title)
|
|
self.comboBox.insertItem(index, title)
|
|
|
|
@pyqtSlot(int)
|
|
def removePage(self, index):
|
|
widget = self.stackWidget.widget(index)
|
|
self.stackWidget.removeWidget(widget)
|
|
self.comboBox.removeItem(index)
|
|
|
|
def getPageTitle(self):
|
|
cw = self.stackWidget.currentWidget()
|
|
return cw.windowTitle() if cw is not None else ''
|
|
|
|
@pyqtSlot(str)
|
|
def setPageTitle(self, newTitle):
|
|
cw = self.stackWidget.currentWidget()
|
|
if cw is not None:
|
|
self.comboBox.setItemText(self.getCurrentIndex(), newTitle)
|
|
cw.setWindowTitle(newTitle)
|
|
self.pageTitleChanged.emit(newTitle)
|
|
|
|
def getCurrentIndex(self):
|
|
return self.stackWidget.currentIndex()
|
|
|
|
@pyqtSlot(int)
|
|
def setCurrentIndex(self, index):
|
|
if index != self.getCurrentIndex():
|
|
self.stackWidget.setCurrentIndex(index)
|
|
self.comboBox.setCurrentIndex(index)
|
|
self.currentIndexChanged.emit(index)
|
|
|
|
pageTitle = pyqtProperty(str, fget=getPageTitle, fset=setPageTitle, stored=False)
|
|
currentIndex = pyqtProperty(int, fget=getCurrentIndex, fset=setCurrentIndex)
|
|
|
|
|
|
#============================================================================#
|
|
# Main for testing the class #
|
|
#----------------------------------------------------------------------------#
|
|
if __name__ == "__main__":
|
|
import sys
|
|
app = QApplication(sys.argv)
|
|
widget = PyMultiPageWidget()
|
|
widget.addPage(QLabel('This is page #1'))
|
|
widget.addPage(QLabel('This is page #2'))
|
|
widget.show()
|
|
sys.exit(app.exec_())
|
|
|
|
#============================================================================#
|
|
# EOF #
|
|
#----------------------------------------------------------------------------#
|