text: #!/usr/bin/env python
  
  
  #############################################################################
  ##
  ## Copyright (C) 2010 Riverbank Computing Limited.
  ## Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
  ## All rights reserved.
  ##
  ## This file is part of the examples of PyQt.
  ##
  ## $QT_BEGIN_LICENSE:BSD$
  ## You may use this file under the terms of the BSD license as follows:
  ##
  ## "Redistribution and use in source and binary forms, with or without
  ## modification, are permitted provided that the following conditions are
  ## met:
  ##   * Redistributions of source code must retain the above copyright
  ##     notice, this list of conditions and the following disclaimer.
  ##   * Redistributions in binary form must reproduce the above copyright
  ##     notice, this list of conditions and the following disclaimer in
  ##     the documentation and/or other materials provided with the
  ##     distribution.
  ##   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
  ##     the names of its contributors may be used to endorse or promote
  ##     products derived from this software without specific prior written
  ##     permission.
  ##
  ## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  ## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  ## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  ## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  ## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  ## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  ## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  ## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  ## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  ## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  ## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
  ## $QT_END_LICENSE$
  ##
  #############################################################################
  
  
  # This is only needed for Python v2 but is harmless for Python v3.
  import sip
  sip.setapi('QString', 2)
  sip.setapi('QVariant', 2)
  
  from PyQt4 import QtCore, QtGui
  
  try:
      import classwizard_rc3
  except ImportError:
      import classwizard_rc2
  
  
  class ClassWizard(QtGui.QWizard):
      def __init__(self, parent=None):
          super(ClassWizard, self).__init__(parent)
  
          self.addPage(IntroPage())
          self.addPage(ClassInfoPage())
          self.addPage(CodeStylePage())
          self.addPage(OutputFilesPage())
          self.addPage(ConclusionPage())
  
          self.setPixmap(QtGui.QWizard.BannerPixmap,
                  QtGui.QPixmap(':/images/banner.png'))
          self.setPixmap(QtGui.QWizard.BackgroundPixmap,
                  QtGui.QPixmap(':/images/background.png'))
  
          self.setWindowTitle("Class Wizard")
  
      def accept(self):
          className = self.field('className')
          baseClass = self.field('baseClass')
          macroName = self.field('macroName')
          baseInclude = self.field('baseInclude')
  
          outputDir = self.field('outputDir')
          header = self.field('header')
          implementation = self.field('implementation')
  
          block = ''
  
          if self.field('comment'):
              block += '/*\n'
              block += '    ' + header + '\n'
              block += '*/\n'
              block += '\n'
  
          if self.field('protect'):
              block += '#ifndef ' + macroName + '\n'
              block += '#define ' + macroName + '\n'
              block += '\n'
  
          if self.field('includeBase'):
              block += '#include ' + baseInclude + '\n'
              block += '\n'
  
          block += 'class ' + className
          if baseClass:
              block += ' : public ' + baseClass
  
          block += '\n'
          block += '{\n'
  
          if self.field('qobjectMacro'):
              block += '    Q_OBJECT\n'
              block += '\n'
  
          block += 'public:\n'
  
          if self.field('qobjectCtor'):
              block += '    ' + className + '(QObject *parent = 0);\n'
          elif self.field('qwidgetCtor'):
              block += '    ' + className + '(QWidget *parent = 0);\n'
          elif self.field('defaultCtor'):
              block += '    ' + className + '();\n'
  
              if self.field('copyCtor'):
                  block += '    ' + className + '(const ' + className + ' &other);\n'
                  block += '\n'
                  block += '    ' + className + ' &operator=' + '(const ' + className + ' &other);\n'
  
          block += '};\n'
  
          if self.field('protect'):
              block += '\n'
              block += '#endif\n'
  
          headerFile = QtCore.QFile(outputDir + '/' + header)
  
          if not headerFile.open(QtCore.QFile.WriteOnly | QtCore.QFile.Text):
              QtGui.QMessageBox.warning(None, "Class Wizard",
                      "Cannot write file %s:\n%s" % (headerFile.fileName(), headerFile.errorString()))
              return
  
          headerFile.write(block)
  
          block = ''
  
          if self.field('comment'):
              block += '/*\n'
              block += '    ' + implementation + '\n'
              block += '*/\n'
              block += '\n'
  
          block += '#include "' + header + '"\n'
          block += '\n'
  
          if self.field('qobjectCtor'):
              block += className + '::' + className + '(QObject *parent)\n'
              block += '    : ' + baseClass + '(parent)\n'
              block += '{\n'
              block += '}\n'
          elif self.field('qwidgetCtor'):
              block += className + '::' + className + '(QWidget *parent)\n'
              block += '    : ' + baseClass + '(parent)\n'
              block += '{\n'
              block += '}\n'
          elif self.field('defaultCtor'):
              block += className + '::' + className + '()\n'
              block += '{\n'
              block += '    // missing code\n'
              block += '}\n'
  
              if self.field('copyCtor'):
                  block += '\n'
                  block += className + '::' + className + '(const ' + className + ' &other)\n'
                  block += '{\n'
                  block += '    *this = other;\n'
                  block += '}\n'
                  block += '\n'
                  block += className + ' &' + className + '::operator=(const ' + className + ' &other)\n'
                  block += '{\n'
  
                  if baseClass:
                      block += '    ' + baseClass + '::operator=(other);\n'
  
                  block += '    // missing code\n'
                  block += '    return *this;\n'
                  block += '}\n'
  
          implementationFile = QtCore.QFile(outputDir + '/' + implementation)
  
          if not implementationFile.open(QtCore.QFile.WriteOnly | QtCore.QFile.Text):
              QtGui.QMessageBox.warning(None, "Class Wizard",
                      "Cannot write file %s:\n%s" % (implementationFile.fileName(), implementationFile.errorString()))
              return
  
          implementationFile.write(block)
  
          super(ClassWizard, self).accept()
  
  
  class IntroPage(QtGui.QWizardPage):
      def __init__(self, parent=None):
          super(IntroPage, self).__init__(parent)
  
          self.setTitle("Introduction")
          self.setPixmap(QtGui.QWizard.WatermarkPixmap,
                  QtGui.QPixmap(':/images/watermark1.png'))
  
          label = QtGui.QLabel("This wizard will generate a skeleton C++ class "
                  "definition, including a few functions. You simply need to "
                  "specify the class name and set a few options to produce a "
                  "header file and an implementation file for your new C++ "
                  "class.")
          label.setWordWrap(True)
  
          layout = QtGui.QVBoxLayout()
          layout.addWidget(label)
          self.setLayout(layout)
  
  
  class ClassInfoPage(QtGui.QWizardPage):
      def __init__(self, parent=None):
          super(ClassInfoPage, self).__init__(parent)
  
          self.setTitle("Class Information")
          self.setSubTitle("Specify basic information about the class for "
                  "which you want to generate skeleton source code files.")
          self.setPixmap(QtGui.QWizard.LogoPixmap,
                  QtGui.QPixmap(':/images/logo1.png'))
  
          classNameLabel = QtGui.QLabel("&Class name:")
          classNameLineEdit = QtGui.QLineEdit()
          classNameLabel.setBuddy(classNameLineEdit)
  
          baseClassLabel = QtGui.QLabel("B&ase class:")
          baseClassLineEdit = QtGui.QLineEdit()
          baseClassLabel.setBuddy(baseClassLineEdit)
  
          qobjectMacroCheckBox = QtGui.QCheckBox("Generate Q_OBJECT &macro")
  
          groupBox = QtGui.QGroupBox("C&onstructor")
  
          qobjectCtorRadioButton = QtGui.QRadioButton("&QObject-style constructor")
          qwidgetCtorRadioButton = QtGui.QRadioButton("Q&Widget-style constructor")
          defaultCtorRadioButton = QtGui.QRadioButton("&Default constructor")
          copyCtorCheckBox = QtGui.QCheckBox("&Generate copy constructor and operator=")
  
          defaultCtorRadioButton.setChecked(True)
  
          defaultCtorRadioButton.toggled.connect(copyCtorCheckBox.setEnabled)
  
          self.registerField('className*', classNameLineEdit)
          self.registerField('baseClass', baseClassLineEdit)
          self.registerField('qobjectMacro', qobjectMacroCheckBox)
          self.registerField('qobjectCtor', qobjectCtorRadioButton)
          self.registerField('qwidgetCtor', qwidgetCtorRadioButton)
          self.registerField('defaultCtor', defaultCtorRadioButton)
          self.registerField('copyCtor', copyCtorCheckBox)
  
          groupBoxLayout = QtGui.QVBoxLayout()
          groupBoxLayout.addWidget(qobjectCtorRadioButton)
          groupBoxLayout.addWidget(qwidgetCtorRadioButton)
          groupBoxLayout.addWidget(defaultCtorRadioButton)
          groupBoxLayout.addWidget(copyCtorCheckBox)
          groupBox.setLayout(groupBoxLayout)
  
          layout = QtGui.QGridLayout()
          layout.addWidget(classNameLabel, 0, 0)
          layout.addWidget(classNameLineEdit, 0, 1)
          layout.addWidget(baseClassLabel, 1, 0)
          layout.addWidget(baseClassLineEdit, 1, 1)
          layout.addWidget(qobjectMacroCheckBox, 2, 0, 1, 2)
          layout.addWidget(groupBox, 3, 0, 1, 2)
          self.setLayout(layout)
  
  
  class CodeStylePage(QtGui.QWizardPage):
      def __init__(self, parent=None):
          super(CodeStylePage, self).__init__(parent)
  
          self.setTitle("Code Style Options")
          self.setSubTitle("Choose the formatting of the generated code.")
          self.setPixmap(QtGui.QWizard.LogoPixmap,
                  QtGui.QPixmap(':/images/logo2.png'))
  
          commentCheckBox = QtGui.QCheckBox("&Start generated files with a "
                  "comment")
          commentCheckBox.setChecked(True)
  
          protectCheckBox = QtGui.QCheckBox("&Protect header file against "
                  "multiple inclusions")
          protectCheckBox.setChecked(True)
  
          macroNameLabel = QtGui.QLabel("&Macro name:")
          self.macroNameLineEdit = QtGui.QLineEdit()
          macroNameLabel.setBuddy(self.macroNameLineEdit)
  
          self.includeBaseCheckBox = QtGui.QCheckBox("&Include base class "
                  "definition")
          self.baseIncludeLabel = QtGui.QLabel("Base class include:")
          self.baseIncludeLineEdit = QtGui.QLineEdit()
          self.baseIncludeLabel.setBuddy(self.baseIncludeLineEdit)
  
          protectCheckBox.toggled.connect(macroNameLabel.setEnabled)
          protectCheckBox.toggled.connect(self.macroNameLineEdit.setEnabled)
          self.includeBaseCheckBox.toggled.connect(self.baseIncludeLabel.setEnabled)
          self.includeBaseCheckBox.toggled.connect(self.baseIncludeLineEdit.setEnabled)
  
          self.registerField('comment', commentCheckBox)
          self.registerField('protect', protectCheckBox)
          self.registerField('macroName', self.macroNameLineEdit)
          self.registerField('includeBase', self.includeBaseCheckBox)
          self.registerField('baseInclude', self.baseIncludeLineEdit)
  
          layout = QtGui.QGridLayout()
          layout.setColumnMinimumWidth(0, 20)
          layout.addWidget(commentCheckBox, 0, 0, 1, 3)
          layout.addWidget(protectCheckBox, 1, 0, 1, 3)
          layout.addWidget(macroNameLabel, 2, 1)
          layout.addWidget(self.macroNameLineEdit, 2, 2)
          layout.addWidget(self.includeBaseCheckBox, 3, 0, 1, 3)
          layout.addWidget(self.baseIncludeLabel, 4, 1)
          layout.addWidget(self.baseIncludeLineEdit, 4, 2)
          self.setLayout(layout)
  
      def initializePage(self):
          className = self.field('className')
          self.macroNameLineEdit.setText(className.upper() + "_H")
  
          baseClass = self.field('baseClass')
          is_baseClass = bool(baseClass)
  
          self.includeBaseCheckBox.setChecked(is_baseClass)
          self.includeBaseCheckBox.setEnabled(is_baseClass)
          self.baseIncludeLabel.setEnabled(is_baseClass)
          self.baseIncludeLineEdit.setEnabled(is_baseClass)
  
          if not is_baseClass:
              self.baseIncludeLineEdit.clear()
          elif QtCore.QRegExp('Q[A-Z].*').exactMatch(baseClass):
              self.baseIncludeLineEdit.setText('<' + baseClass + '>')
          else:
              self.baseIncludeLineEdit.setText('"' + baseClass.lower() + '.h"')
  
  
  class OutputFilesPage(QtGui.QWizardPage):
      def __init__(self, parent=None):
          super(OutputFilesPage, self).__init__(parent)
  
          self.setTitle("Output Files")
          self.setSubTitle("Specify where you want the wizard to put the "
                  "generated skeleton code.")
          self.setPixmap(QtGui.QWizard.LogoPixmap,
                  QtGui.QPixmap(':/images/logo3.png'))
  
          outputDirLabel = QtGui.QLabel("&Output directory:")
          self.outputDirLineEdit = QtGui.QLineEdit()
          outputDirLabel.setBuddy(self.outputDirLineEdit)
  
          headerLabel = QtGui.QLabel("&Header file name:")
          self.headerLineEdit = QtGui.QLineEdit()
          headerLabel.setBuddy(self.headerLineEdit)
  
          implementationLabel = QtGui.QLabel("&Implementation file name:")
          self.implementationLineEdit = QtGui.QLineEdit()
          implementationLabel.setBuddy(self.implementationLineEdit)
  
          self.registerField('outputDir*', self.outputDirLineEdit)
          self.registerField('header*', self.headerLineEdit)
          self.registerField('implementation*', self.implementationLineEdit)
  
          layout = QtGui.QGridLayout()
          layout.addWidget(outputDirLabel, 0, 0)
          layout.addWidget(self.outputDirLineEdit, 0, 1)
          layout.addWidget(headerLabel, 1, 0)
          layout.addWidget(self.headerLineEdit, 1, 1)
          layout.addWidget(implementationLabel, 2, 0)
          layout.addWidget(self.implementationLineEdit, 2, 1)
          self.setLayout(layout)
  
      def initializePage(self):
          className = self.field('className')
          self.headerLineEdit.setText(className.lower() + '.h')
          self.implementationLineEdit.setText(className.lower() + '.cpp')
          self.outputDirLineEdit.setText(QtCore.QDir.convertSeparators(QtCore.QDir.tempPath()))
  
  
  class ConclusionPage(QtGui.QWizardPage):
      def __init__(self, parent=None):
          super(ConclusionPage, self).__init__(parent)
  
          self.setTitle("Conclusion")
          self.setPixmap(QtGui.QWizard.WatermarkPixmap,
                  QtGui.QPixmap(':/images/watermark2.png'))
  
          self.label = QtGui.QLabel()
          self.label.setWordWrap(True)
  
          layout = QtGui.QVBoxLayout()
          layout.addWidget(self.label)
          self.setLayout(layout)
  
      def initializePage(self):
          finishText = self.wizard().buttonText(QtGui.QWizard.FinishButton)
          finishText.replace('&', '')
          self.label.setText("Click %s to generate the class skeleton." % finishText)
  
  
  if __name__ == '__main__':
  
      import sys
  
      app = QtGui.QApplication(sys.argv)
      wizard = ClassWizard()
      wizard.show()
      sys.exit(app.exec_())
  