classwizard.cpp Example File | Qt 4.8 (original) (raw)

#include

#include "classwizard.h"

ClassWizard::ClassWizard(QWidget *parent) : QWizard(parent) { addPage(new IntroPage); addPage(new ClassInfoPage); addPage(new CodeStylePage); addPage(new OutputFilesPage); addPage(new ConclusionPage);

setPixmap([QWizard](qwizard.html)::BannerPixmap, [QPixmap](qpixmap.html)(":/images/banner.png"));
setPixmap([QWizard](qwizard.html)::BackgroundPixmap, [QPixmap](qpixmap.html)(":/images/background.png"));

setWindowTitle(tr("Class Wizard"));

}

void ClassWizard::accept() { QByteArray className = field("className").toByteArray(); QByteArray baseClass = field("baseClass").toByteArray(); QByteArray macroName = field("macroName").toByteArray(); QByteArray baseInclude = field("baseInclude").toByteArray();

[QString](qstring.html) outputDir = field("outputDir").toString();
[QString](qstring.html) header = field("header").toString();
[QString](qstring.html) implementation = field("implementation").toString();

[QByteArray](qbytearray.html) block;

if (field("comment").toBool()) {
    block += "/*\n";
    block += "    " + header.toAscii() + "\n";
    block += "*/\n";
    block += "\n";
}
if (field("protect").toBool()) {
    block += "#ifndef " + macroName + "\n";
    block += "#define " + macroName + "\n";
    block += "\n";
}
if (field("includeBase").toBool()) {
    block += "#include " + baseInclude + "\n";
    block += "\n";
}

block += "class " + className;
if (!baseClass.isEmpty())
    block += " : public " + baseClass;
block += "\n";
block += "{\n";


if (field("qobjectMacro").toBool()) {
    block += "    Q_OBJECT\n";
    block += "\n";
}
block += "public:\n";

if (field("qobjectCtor").toBool()) {
    block += "    " + className + "(QObject *parent = 0);\n";
} else if (field("qwidgetCtor").toBool()) {
    block += "    " + className + "(QWidget *parent = 0);\n";
} else if (field("defaultCtor").toBool()) {
    block += "    " + className + "();\n";
    if (field("copyCtor").toBool()) {
        block += "    " + className + "(const " + className + " &other);\n";
        block += "\n";
        block += "    " + className + " &operator=" + "(const " + className
                 + " &other);\n";
    }
}
block += "};\n";

if (field("protect").toBool()) {
    block += "\n";
    block += "#endif\n";
}

[QFile](qfile.html) headerFile(outputDir + "/" + header);
if (!headerFile.open([QFile](qfile.html)::WriteOnly | [QFile](qfile.html)::Text)) {
    [QMessageBox](qmessagebox.html)::warning(0, [QObject](qobject.html)::tr("Simple Wizard"),
                         [QObject](qobject.html)::tr("Cannot write file %1:\n%2")
                         .arg(headerFile.fileName())
                         .arg(headerFile.errorString()));
    return;
}
headerFile.write(block);

block.clear();

if (field("comment").toBool()) {
    block += "/*\n";
    block += "    " + implementation.toAscii() + "\n";
    block += "*/\n";
    block += "\n";
}
block += "#include \"" + header.toAscii() + "\"\n";
block += "\n";

if (field("qobjectCtor").toBool()) {
    block += className + "::" + className + "(QObject *parent)\n";
    block += "    : " + baseClass + "(parent)\n";
    block += "{\n";
    block += "}\n";
} else if (field("qwidgetCtor").toBool()) {
    block += className + "::" + className + "(QWidget *parent)\n";
    block += "    : " + baseClass + "(parent)\n";
    block += "{\n";
    block += "}\n";
} else if (field("defaultCtor").toBool()) {
    block += className + "::" + className + "()\n";
    block += "{\n";
    block += "    // missing code\n";
    block += "}\n";

    if (field("copyCtor").toBool()) {
        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.isEmpty())
            block += "    " + baseClass + "::operator=(other);\n";
        block += "    // missing code\n";
        block += "    return *this;\n";
        block += "}\n";
    }
}

[QFile](qfile.html) implementationFile(outputDir + "/" + implementation);
if (!implementationFile.open([QFile](qfile.html)::WriteOnly | [QFile](qfile.html)::Text)) {
    [QMessageBox](qmessagebox.html)::warning(0, [QObject](qobject.html)::tr("Simple Wizard"),
                         [QObject](qobject.html)::tr("Cannot write file %1:\n%2")
                         .arg(implementationFile.fileName())
                         .arg(implementationFile.errorString()));
    return;
}
implementationFile.write(block);

[QDialog](qdialog.html)::accept();

}

IntroPage::IntroPage(QWidget *parent) : QWizardPage(parent) { setTitle(tr("Introduction")); setPixmap(QWizard::WatermarkPixmap, QPixmap(":/images/watermark1.png"));

label = new [QLabel](qlabel.html)(tr("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);

[QVBoxLayout](qvboxlayout.html) *layout = new [QVBoxLayout](qvboxlayout.html);
layout->addWidget(label);
setLayout(layout);

}

ClassInfoPage::ClassInfoPage(QWidget *parent) : QWizardPage(parent) { setTitle(tr("Class Information")); setSubTitle(tr("Specify basic information about the class for which you " "want to generate skeleton source code files.")); setPixmap(QWizard::LogoPixmap, QPixmap(":/images/logo1.png"));

classNameLabel = new [QLabel](qlabel.html)(tr("&Class name:"));
classNameLineEdit = new [QLineEdit](qlineedit.html);
classNameLabel->setBuddy(classNameLineEdit);

baseClassLabel = new [QLabel](qlabel.html)(tr("B&ase class:"));
baseClassLineEdit = new [QLineEdit](qlineedit.html);
baseClassLabel->setBuddy(baseClassLineEdit);

qobjectMacroCheckBox = new [QCheckBox](qcheckbox.html)(tr("Generate Q_OBJECT &macro"));

groupBox = new [QGroupBox](qgroupbox.html)(tr("C&onstructor"));

qobjectCtorRadioButton = new [QRadioButton](qradiobutton.html)(tr("&QObject-style constructor"));
qwidgetCtorRadioButton = new [QRadioButton](qradiobutton.html)(tr("Q&Widget-style constructor"));
defaultCtorRadioButton = new [QRadioButton](qradiobutton.html)(tr("&Default constructor"));
copyCtorCheckBox = new [QCheckBox](qcheckbox.html)(tr("&Generate copy constructor and "
                                    "operator="));

defaultCtorRadioButton->setChecked(true);

connect(defaultCtorRadioButton, SIGNAL(toggled(bool)),
        copyCtorCheckBox, SLOT(setEnabled(bool)));

registerField("className*", classNameLineEdit);
registerField("baseClass", baseClassLineEdit);
registerField("qobjectMacro", qobjectMacroCheckBox);
registerField("qobjectCtor", qobjectCtorRadioButton);
registerField("qwidgetCtor", qwidgetCtorRadioButton);
registerField("defaultCtor", defaultCtorRadioButton);
registerField("copyCtor", copyCtorCheckBox);

[QVBoxLayout](qvboxlayout.html) *groupBoxLayout = new [QVBoxLayout](qvboxlayout.html);
groupBoxLayout->addWidget(qobjectCtorRadioButton);
groupBoxLayout->addWidget(qwidgetCtorRadioButton);
groupBoxLayout->addWidget(defaultCtorRadioButton);
groupBoxLayout->addWidget(copyCtorCheckBox);
groupBox->setLayout(groupBoxLayout);

[QGridLayout](qgridlayout.html) *layout = new [QGridLayout](qgridlayout.html);
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);
setLayout(layout);

}

CodeStylePage::CodeStylePage(QWidget *parent) : QWizardPage(parent) { setTitle(tr("Code Style Options")); setSubTitle(tr("Choose the formatting of the generated code.")); setPixmap(QWizard::LogoPixmap, QPixmap(":/images/logo2.png"));

commentCheckBox = new [QCheckBox](qcheckbox.html)(tr("&Start generated files with a "
                                   "comment"));
commentCheckBox->setChecked(true);

protectCheckBox = new [QCheckBox](qcheckbox.html)(tr("&Protect header file against multiple "
                                   "inclusions"));
protectCheckBox->setChecked(true);

macroNameLabel = new [QLabel](qlabel.html)(tr("&Macro name:"));
macroNameLineEdit = new [QLineEdit](qlineedit.html);
macroNameLabel->setBuddy(macroNameLineEdit);

includeBaseCheckBox = new [QCheckBox](qcheckbox.html)(tr("&Include base class definition"));
baseIncludeLabel = new [QLabel](qlabel.html)(tr("Base class include:"));
baseIncludeLineEdit = new [QLineEdit](qlineedit.html);
baseIncludeLabel->setBuddy(baseIncludeLineEdit);

connect(protectCheckBox, SIGNAL(toggled(bool)),
        macroNameLabel, SLOT(setEnabled(bool)));
connect(protectCheckBox, SIGNAL(toggled(bool)),
        macroNameLineEdit, SLOT(setEnabled(bool)));
connect(includeBaseCheckBox, SIGNAL(toggled(bool)),
        baseIncludeLabel, SLOT(setEnabled(bool)));
connect(includeBaseCheckBox, SIGNAL(toggled(bool)),
        baseIncludeLineEdit, SLOT(setEnabled(bool)));

registerField("comment", commentCheckBox);
registerField("protect", protectCheckBox);
registerField("macroName", macroNameLineEdit);
registerField("includeBase", includeBaseCheckBox);
registerField("baseInclude", baseIncludeLineEdit);

[QGridLayout](qgridlayout.html) *layout = new [QGridLayout](qgridlayout.html);
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(macroNameLineEdit, 2, 2);
layout->addWidget(includeBaseCheckBox, 3, 0, 1, 3);
layout->addWidget(baseIncludeLabel, 4, 1);
layout->addWidget(baseIncludeLineEdit, 4, 2);
setLayout(layout);

}

void CodeStylePage::initializePage() { QString className = field("className").toString(); macroNameLineEdit->setText(className.toUpper() + "_H");

[QString](qstring.html) baseClass = field("baseClass").toString();

includeBaseCheckBox->setChecked(!baseClass.isEmpty());
includeBaseCheckBox->setEnabled(!baseClass.isEmpty());
baseIncludeLabel->setEnabled(!baseClass.isEmpty());
baseIncludeLineEdit->setEnabled(!baseClass.isEmpty());

if (baseClass.isEmpty()) {
    baseIncludeLineEdit->clear();
} else if ([QRegExp](qregexp.html)("Q[A-Z].*").exactMatch(baseClass)) {
    baseIncludeLineEdit->setText("<" + baseClass + ">");
} else {
    baseIncludeLineEdit->setText("\"" + baseClass.toLower() + ".h\"");
}

}

OutputFilesPage::OutputFilesPage(QWidget *parent) : QWizardPage(parent) { setTitle(tr("Output Files")); setSubTitle(tr("Specify where you want the wizard to put the generated " "skeleton code.")); setPixmap(QWizard::LogoPixmap, QPixmap(":/images/logo3.png"));

outputDirLabel = new [QLabel](qlabel.html)(tr("&Output directory:"));
outputDirLineEdit = new [QLineEdit](qlineedit.html);
outputDirLabel->setBuddy(outputDirLineEdit);

headerLabel = new [QLabel](qlabel.html)(tr("&Header file name:"));
headerLineEdit = new [QLineEdit](qlineedit.html);
headerLabel->setBuddy(headerLineEdit);

implementationLabel = new [QLabel](qlabel.html)(tr("&Implementation file name:"));
implementationLineEdit = new [QLineEdit](qlineedit.html);
implementationLabel->setBuddy(implementationLineEdit);

registerField("outputDir*", outputDirLineEdit);
registerField("header*", headerLineEdit);
registerField("implementation*", implementationLineEdit);

[QGridLayout](qgridlayout.html) *layout = new [QGridLayout](qgridlayout.html);
layout->addWidget(outputDirLabel, 0, 0);
layout->addWidget(outputDirLineEdit, 0, 1);
layout->addWidget(headerLabel, 1, 0);
layout->addWidget(headerLineEdit, 1, 1);
layout->addWidget(implementationLabel, 2, 0);
layout->addWidget(implementationLineEdit, 2, 1);
setLayout(layout);

}

void OutputFilesPage::initializePage() { QString className = field("className").toString(); headerLineEdit->setText(className.toLower() + ".h"); implementationLineEdit->setText(className.toLower() + ".cpp"); outputDirLineEdit->setText(QDir::convertSeparators(QDir::tempPath())); }

ConclusionPage::ConclusionPage(QWidget *parent) : QWizardPage(parent) { setTitle(tr("Conclusion")); setPixmap(QWizard::WatermarkPixmap, QPixmap(":/images/watermark2.png"));

label = new [QLabel](qlabel.html);
label->setWordWrap(true);

[QVBoxLayout](qvboxlayout.html) *layout = new [QVBoxLayout](qvboxlayout.html);
layout->addWidget(label);
setLayout(layout);

}

void ConclusionPage::initializePage() { QString finishText = wizard()->buttonText(QWizard::FinishButton); finishText.remove('&'); label->setText(tr("Click %1 to generate the class skeleton.") .arg(finishText)); }