#!/usr/bin/env python from PyQt4 import QtCore, QtGui import sys class ComplexWizard(QtGui.QDialog): def __init__(self, parent=None): QtGui.QDialog.__init__(self, parent) self.history = [] self.cancelButton = QtGui.QPushButton(self.tr("Cancel")) self.backButton = QtGui.QPushButton(self.tr("< &Back")) self.nextButton = QtGui.QPushButton(self.tr("Next >")) self.finishButton = QtGui.QPushButton(self.tr("&Finish")) self.connect(self.cancelButton, QtCore.SIGNAL("clicked()"), self.reject) self.connect(self.backButton, QtCore.SIGNAL("clicked()"), self.backButtonClicked) self.connect(self.nextButton, QtCore.SIGNAL("clicked()"), self.nextButtonClicked) self.connect(self.finishButton, QtCore.SIGNAL("clicked()"), self.accept) buttonLayout = QtGui.QHBoxLayout() buttonLayout.addStretch(1) buttonLayout.addWidget(self.cancelButton) buttonLayout.addWidget(self.backButton) buttonLayout.addWidget(self.nextButton) buttonLayout.addWidget(self.finishButton) self.mainLayout = QtGui.QVBoxLayout() self.mainLayout.addLayout(buttonLayout) self.setLayout(self.mainLayout) def historyPages(self): return self.history def setFirstPage(self, page): page.resetPage() self.history.append(page) self.switchPage(None) def backButtonClicked(self): oldpage = self.history.pop() oldpage.resetPage() self.switchPage(oldpage) def nextButtonClicked(self): oldpage = self.history[-1] newpage = oldpage.nextPage() newpage.resetPage() self.history.append(newpage) self.switchPage(oldpage) def completeStateChanged(self): currentpage = self.history[-1] if currentpage.isLastPage(): self.finishButton.setEnabled(currentpage.isComplete()) else: self.nextButton.setEnabled(currentpage.isComplete()) def switchPage(self, oldPage): if oldPage is not None: oldPage.hide() self.mainLayout.removeWidget(oldPage) self.disconnect(oldPage, QtCore.SIGNAL("completeStateChanged())"), self.completeStateChanged) newpage = self.history[-1] self.mainLayout.insertWidget(0, newpage) newpage.show() newpage.setFocus() self.connect(newpage, QtCore.SIGNAL("completeStateChanged()"), self.completeStateChanged) self.backButton.setEnabled(len(self.history) != 1) if newpage.isLastPage(): self.nextButton.setEnabled(False) self.finishButton.setDefault(True) else: self.nextButton.setDefault(True) self.finishButton.setEnabled(False) self.completeStateChanged() class WizardPage(QtGui.QWidget): def __init__(self, parent=None): QtGui.QWidget.__init__(self, parent) self.hide() def resetPage(self): pass def nextPage(self): return None def isLastPage(self): return False def isComplete(self): return True class LicenseWizard(ComplexWizard): def __init__(self, parent=None): ComplexWizard.__init__(self, parent) self.titlePage = TitlePage(self) self.evaluatePage = EvaluatePage(self) self.registerPage = RegisterPage(self) self.detailsPage = DetailsPage(self) self.finishPage = FinishPage(self) self.setFirstPage(self.titlePage) self.setWindowTitle(self.tr("Complex Wizard")) self.resize(480, 200) class LicenseWizardPage(WizardPage): def __init__(self, wizard): WizardPage.__init__(self, wizard) self.wizard = wizard class TitlePage(LicenseWizardPage): def __init__(self, wizard): LicenseWizardPage.__init__(self, wizard) self.topLabel = QtGui.QLabel(self.tr( "
" "Super Product One
")) self.registerRadioButton = QtGui.QRadioButton(self.tr("&Register your copy")) self.evaluateRadioButton = QtGui.QRadioButton(self.tr("&Evaluate our product")) self.setFocusProxy(self.registerRadioButton) layout = QtGui.QVBoxLayout() layout.addWidget(self.topLabel) layout.addSpacing(10) layout.addWidget(self.registerRadioButton) layout.addWidget(self.evaluateRadioButton) layout.addStretch(1) self.setLayout(layout) def resetPage(self): self.registerRadioButton.setChecked(True) def nextPage(self): if self.evaluateRadioButton.isChecked(): return self.wizard.evaluatePage else: return self.wizard.registerPage class EvaluatePage(LicenseWizardPage): def __init__(self, wizard): LicenseWizardPage.__init__(self, wizard) self.topLabel = QtGui.QLabel(self.tr( "
Evaluate Super Product One" "
")) self.nameLabel = QtGui.QLabel(self.tr("&Name:")) self.nameLineEdit = QtGui.QLineEdit() self.nameLabel.setBuddy(self.nameLineEdit) self.setFocusProxy(self.nameLineEdit) self.emailLabel = QtGui.QLabel(self.tr("&Email address:")) self.emailLineEdit = QtGui.QLineEdit() self.emailLabel.setBuddy(self.emailLineEdit) self.bottomLabel = QtGui.QLabel(self.tr( "Please fill in both fields.\nThis will " "entitle you to a 30-day evaluation.")) self.connect(self.nameLineEdit, QtCore.SIGNAL("textChanged(QString)"), self, QtCore.SIGNAL("completeStateChanged()")) self.connect(self.emailLineEdit, QtCore.SIGNAL("textChanged(QString)"), self, QtCore.SIGNAL("completeStateChanged()")) layout = QtGui.QGridLayout() layout.addWidget(self.topLabel, 0, 0, 1, 2) layout.setRowMinimumHeight(1, 10) layout.addWidget(self.nameLabel, 2, 0) layout.addWidget(self.nameLineEdit, 2, 1) layout.addWidget(self.emailLabel, 3, 0) layout.addWidget(self.emailLineEdit, 3, 1) layout.setRowMinimumHeight(4, 10) layout.addWidget(self.bottomLabel, 5, 0, 1, 2) layout.setRowStretch(6, 1) self.setLayout(layout) def resetPage(self): self.nameLineEdit.clear() self.emailLineEdit.clear() def nextPage(self): return self.wizard.finishPage def isComplete(self): return ( not self.nameLineEdit.text().isEmpty() and not self.emailLineEdit.text().isEmpty() ) class RegisterPage(LicenseWizardPage): def __init__(self, wizard): LicenseWizardPage.__init__(self, wizard) self.topLabel = QtGui.QLabel(self.tr( "
Register your copy of Super Product " "One
")) self.nameLabel = QtGui.QLabel(self.tr("&Name:")) self.nameLineEdit = QtGui.QLineEdit() self.nameLabel.setBuddy(self.nameLineEdit) self.setFocusProxy(self.nameLineEdit) self.upgradeKeyLabel = QtGui.QLabel(self.tr("&Upgrade key:")) self.upgradeKeyLineEdit = QtGui.QLineEdit() self.upgradeKeyLabel.setBuddy(self.upgradeKeyLineEdit) self.bottomLabel = QtGui.QLabel(self.tr( "If you have an upgrade key, please fill in " "the appropriate field.")) self.connect(self.nameLineEdit, QtCore.SIGNAL("textChanged(QString)"), self, QtCore.SIGNAL("completeStateChanged()")) layout = QtGui.QGridLayout() layout.addWidget(self.topLabel, 0, 0, 1, 2) layout.setRowMinimumHeight(1, 10) layout.addWidget(self.nameLabel, 2, 0) layout.addWidget(self.nameLineEdit, 2, 1) layout.addWidget(self.upgradeKeyLabel, 3, 0) layout.addWidget(self.upgradeKeyLineEdit, 3, 1) layout.setRowMinimumHeight(4, 10) layout.addWidget(self.bottomLabel, 5, 0, 1, 2) layout.setRowStretch(6, 1) self.setLayout(layout) def resetPage(self): self.nameLineEdit.clear() self.upgradeKeyLineEdit.clear() def nextPage(self): if self.upgradeKeyLineEdit.text().isEmpty(): return self.wizard.detailsPage else: return self.wizard.finishPage def isComplete(self): return ( not self.nameLineEdit.text().isEmpty() ) class DetailsPage(LicenseWizardPage): def __init__(self, wizard): LicenseWizardPage.__init__(self, wizard) self.topLabel = QtGui.QLabel(self.tr("
Fill in your details
")) self.companyLabel = QtGui.QLabel(self.tr("&Company name:")) self.companyLineEdit = QtGui.QLineEdit() self.companyLabel.setBuddy(self.companyLineEdit) self.setFocusProxy(self.companyLineEdit) self.emailLabel = QtGui.QLabel(self.tr("&Email address:")) self.emailLineEdit = QtGui.QLineEdit() self.emailLabel.setBuddy(self.emailLineEdit) self.postalLabel = QtGui.QLabel(self.tr("&Postal address:")) self.postalLineEdit = QtGui.QLineEdit() self.postalLabel.setBuddy(self.postalLineEdit) self.connect(self.companyLineEdit, QtCore.SIGNAL("textChanged(QString)"), self, QtCore.SIGNAL("completeStateChanged()")) self.connect(self.emailLineEdit, QtCore.SIGNAL("textChanged(QString)"), self, QtCore.SIGNAL("completeStateChanged()")) self.connect(self.postalLineEdit, QtCore.SIGNAL("textChanged(QString)"), self, QtCore.SIGNAL("completeStateChanged()")) layout = QtGui.QGridLayout() layout.addWidget(self.topLabel, 0, 0, 1, 2) layout.setRowMinimumHeight(1, 10) layout.addWidget(self.companyLabel, 2, 0) layout.addWidget(self.companyLineEdit, 2, 1) layout.addWidget(self.emailLabel, 3, 0) layout.addWidget(self.emailLineEdit, 3, 1) layout.addWidget(self.postalLabel, 4, 0) layout.addWidget(self.postalLineEdit, 4, 1) layout.setRowStretch(5, 1) self.setLayout(layout) def resetPage(self): self.companyLineEdit.clear() self.emailLineEdit.clear() self.postalLineEdit.clear() def nextPage(self): return self.wizard.finishPage def isComplete(self): return (not self.companyLineEdit.text().isEmpty() and not self.emailLineEdit.text().isEmpty() and not self.postalLineEdit.text().isEmpty()) class FinishPage(LicenseWizardPage): def __init__(self, wizard): LicenseWizardPage.__init__(self, wizard) self.topLabel = QtGui.QLabel(self.tr( "
Complete your registration" "
")) self.bottomLabel = QtGui.QLabel() self.bottomLabel.setWordWrap(True) self.agreeCheckBox = QtGui.QCheckBox(self.tr( "I agree to the terms and conditions of " "the license")) self.setFocusProxy(self.agreeCheckBox) self.connect(self.agreeCheckBox, QtCore.SIGNAL("toggled(bool)"), self, QtCore.SIGNAL("completeStateChanged()")) layout = QtGui.QVBoxLayout() layout.addWidget(self.topLabel) layout.addSpacing(10) layout.addWidget(self.bottomLabel) layout.addWidget(self.agreeCheckBox) layout.addStretch(1) self.setLayout(layout) def resetPage(self): if self.wizard.evaluatePage in self.wizard.historyPages(): licenseText = self.tr("Evaluation License Agreement: " "You can use this software for 30 days and make one " "back up, but you are not allowed to distribute it.") elif self.wizard.detailsPage in self.wizard.historyPages(): licenseText = self.tr("First-Time License Agreement: " "You can use this software subject to the license " "you will receive by email.") else: licenseText = self.tr("Upgrade License Agreement: " "This software is licensed under the terms of your " "current license.") self.bottomLabel.setText(licenseText) self.agreeCheckBox.setChecked(False) def isLastPage(self): return True def isComplete(self): return self.agreeCheckBox.isChecked() if __name__ == "__main__": app = QtGui.QApplication(sys.argv) wizard = LicenseWizard() sys.exit(wizard.exec_())