/**************************************************************************** ** ** Copyright (C) 2016 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the test suite of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:GPL-EXCEPT$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3 as published by the Free Software ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT ** included in the packaging of this file. Please review the following ** information to ensure the GNU General Public License requirements will ** be met: https://www.gnu.org/licenses/gpl-3.0.html. ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "wizardpanel.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include static QIcon coloredIcon(const Qt::GlobalColor color) { QImage image(QSize(24, 24), QImage::Format_RGB32); image.fill(color); return QIcon(QPixmap::fromImage(image)); } static QPixmap pixmapWithText(const QString &text, const QColor color) { QFont font; QFontMetrics metric(font); QRect rectangle = metric.boundingRect(text); rectangle.setBottomRight(rectangle.bottomRight() + QPoint(20, 20)); QImage image(rectangle.size(), QImage::Format_RGB32); image.fill(color); QPainter painter(&image); painter.setFont(font); painter.drawText(rectangle, Qt::AlignHCenter | Qt::AlignVCenter, text); return QPixmap::fromImage(image); } // A radio-group control for QWizard::WizardStyle. class WizardStyleControl : public QGroupBox { Q_OBJECT public: WizardStyleControl(QWidget *parent = 0); void setWizardStyle(int style); QWizard::WizardStyle wizardStyle() const; signals: void wizardStyleChanged(int); private: QButtonGroup *m_group; }; WizardStyleControl::WizardStyleControl(QWidget *parent) : QGroupBox(tr("Style"), parent) , m_group(new QButtonGroup(this)) { m_group->setExclusive(true); connect(m_group, SIGNAL(buttonClicked(int)), this, SIGNAL(wizardStyleChanged(int))); QVBoxLayout *vLayout = new QVBoxLayout(this); QRadioButton *radioButton = new QRadioButton(tr("None/OS Default"), this); m_group->addButton(radioButton, QWizard::NStyles); vLayout->addWidget(radioButton); radioButton = new QRadioButton(tr("ClassicStyle"), this); m_group->addButton(radioButton, QWizard::ClassicStyle); vLayout->addWidget(radioButton); radioButton = new QRadioButton(tr("ModernStyle"), this); m_group->addButton(radioButton, QWizard::ModernStyle); vLayout->addWidget(radioButton); radioButton = new QRadioButton(tr("MacStyle"), this); m_group->addButton(radioButton, QWizard::MacStyle); vLayout->addWidget(radioButton); radioButton = new QRadioButton(tr("AeroStyle"), this); m_group->addButton(radioButton, QWizard::AeroStyle); vLayout->addWidget(radioButton); vLayout->addItem(new QSpacerItem(0, 0, QSizePolicy::Ignored, QSizePolicy::MinimumExpanding)); setWizardStyle(style()->styleHint(QStyle::SH_WizardStyle)); } QWizard::WizardStyle WizardStyleControl::wizardStyle() const { return static_cast(m_group->checkedId()); } void WizardStyleControl::setWizardStyle(int wizardStyle) { if (wizardStyle < 0 || wizardStyle > QWizard::NStyles) wizardStyle = QWizard::NStyles; QAbstractButton *button = m_group->button(wizardStyle); Q_ASSERT(button); const bool blocked = m_group->blockSignals(true); button->setChecked(true); m_group->blockSignals(blocked); } // A control with checkboxes for QWizard::WizardOption. class WizardOptionsControl : public QGroupBox { public: explicit WizardOptionsControl(QWidget *parent = 0); QWizard::WizardOption wizardOptions() const; void setWizardOptions(int options); private: typedef QHash CheckBoxHash; void addCheckBox(QVBoxLayout *layout, int flag, const QString &title); CheckBoxHash m_checkBoxes; }; WizardOptionsControl::WizardOptionsControl(QWidget *parent) : QGroupBox(tr("Options"), parent) { QVBoxLayout *vLayout = new QVBoxLayout(this); addCheckBox(vLayout, QWizard::IndependentPages, QLatin1String("IndependentPages")); addCheckBox(vLayout, QWizard::IgnoreSubTitles, QLatin1String("IgnoreSubTitles")); addCheckBox(vLayout, QWizard::ExtendedWatermarkPixmap, QLatin1String("ExtendedWatermarkPixmap")); addCheckBox(vLayout, QWizard::NoDefaultButton, QLatin1String("NoDefaultButton")); addCheckBox(vLayout, QWizard::NoBackButtonOnStartPage, QLatin1String("NoBackButtonOnStartPage")); addCheckBox(vLayout, QWizard::NoBackButtonOnLastPage, QLatin1String("NoBackButtonOnLastPage")); addCheckBox(vLayout, QWizard::DisabledBackButtonOnLastPage, QLatin1String("DisabledBackButtonOnLastPage")); addCheckBox(vLayout, QWizard::HaveNextButtonOnLastPage, QLatin1String("HaveNextButtonOnLastPage")); addCheckBox(vLayout, QWizard::HaveFinishButtonOnEarlyPages, QLatin1String("HaveFinishButtonOnEarlyPages")); addCheckBox(vLayout, QWizard::NoCancelButton, QLatin1String("NoCancelButton")); addCheckBox(vLayout, QWizard::CancelButtonOnLeft, QLatin1String("CancelButtonOnLeft")); addCheckBox(vLayout, QWizard::HaveHelpButton, QLatin1String("HaveHelpButton")); addCheckBox(vLayout, QWizard::HelpButtonOnRight, QLatin1String("HelpButtonOnRight")); addCheckBox(vLayout, QWizard::HaveCustomButton1, QLatin1String("HaveCustomButton1")); addCheckBox(vLayout, QWizard::HaveCustomButton2, QLatin1String("HaveCustomButton2")); addCheckBox(vLayout, QWizard::HaveCustomButton3, QLatin1String("HaveCustomButton3")); vLayout->addItem(new QSpacerItem(0, 0, QSizePolicy::Ignored, QSizePolicy::MinimumExpanding)); } void WizardOptionsControl::addCheckBox(QVBoxLayout *layout, int flag, const QString &title) { QCheckBox *checkBox = new QCheckBox(title, this); layout->addWidget(checkBox); m_checkBoxes.insert(flag, checkBox); } QWizard::WizardOption WizardOptionsControl::wizardOptions() const { int result = 0; typedef CheckBoxHash::const_iterator ConstIterator; const ConstIterator cend = m_checkBoxes.constEnd(); for (ConstIterator it = m_checkBoxes.constBegin(); it != cend; ++it) if (it.value()->isChecked()) result |= it.key(); return static_cast(result); } void WizardOptionsControl::setWizardOptions(int options) { typedef CheckBoxHash::iterator Iterator; const Iterator end = m_checkBoxes.end(); for (Iterator it = m_checkBoxes.begin(); it != end; ++it) it.value()->setChecked(options & it.key()); } // A test wizard with a slot to change its style. class Wizard : public QWizard { Q_OBJECT public: explicit Wizard(QWidget *parent = nullptr, Qt::WindowFlags flags = Qt::WindowFlags()); public slots: void changeWizardStyle(int newStyle); }; void Wizard::changeWizardStyle(int newStyle) { if (newStyle >= 0 && newStyle < int(QWizard::NStyles)) setWizardStyle(static_cast(newStyle)); } // A test wizard page with a WizardStyleControl. class WizardPage : public QWizardPage { public: explicit WizardPage(const QString &title, QWidget *parent = 0); void initializePage(); private: WizardStyleControl *m_styleControl; bool m_firstTimeShown; }; WizardPage::WizardPage(const QString &title, QWidget *parent) : QWizardPage(parent) , m_styleControl(new WizardStyleControl(this)) , m_firstTimeShown(true) { setTitle(title); setSubTitle(title + QLatin1String(" SubTitle")); QVBoxLayout *vLayout = new QVBoxLayout(this); vLayout->addWidget(m_styleControl); } void WizardPage::initializePage() { m_styleControl->setWizardStyle(wizard()->wizardStyle()); if (m_firstTimeShown) { m_firstTimeShown = false; connect(m_styleControl, SIGNAL(wizardStyleChanged(int)), wizard(), SLOT(changeWizardStyle(int))); } } Wizard::Wizard(QWidget *parent, Qt::WindowFlags flags) : QWizard(parent, flags) { setWindowIcon(coloredIcon(Qt::red)); setWindowTitle(QLatin1String("Wizard ") + QLatin1String(QT_VERSION_STR)); addPage(new WizardPage(tr("Page 1"), this)); addPage(new WizardPage(tr("Page 2"), this)); addPage(new WizardPage(tr("Page 3"), this)); } // A dialog using a Wizard as child widget (emulating Qt Designer). class WizardEmbeddingDialog : public QDialog { public: explicit WizardEmbeddingDialog(QWidget *parent = 0); Wizard *wizard() const { return m_wizard; } private: Wizard *m_wizard; }; WizardEmbeddingDialog::WizardEmbeddingDialog(QWidget *parent) : QDialog(parent) , m_wizard(new Wizard) { setWindowTitle(QString::fromLatin1("Dialog Embedding QWizard %1").arg(QT_VERSION_STR)); QGridLayout *gridLayout = new QGridLayout(this); gridLayout->addWidget(new QLabel(tr("Above wizard")), 0, 0, 1, 3); gridLayout->addWidget(new QLabel(tr("Left of wizard")), 1, 0); m_wizard->setObjectName(QLatin1String("EmbeddedWizard")); m_wizard->setParent(this, Qt::Widget); gridLayout->addWidget(m_wizard, 1, 1); gridLayout->addWidget(new QLabel(tr("Right of wizard")), 1, 2); gridLayout->addWidget(new QLabel(tr("Below wizard")), 2, 0, 1, 3); } WizardPanel::WizardPanel(QWidget *parent) : QWidget(parent) , m_styleControl(new WizardStyleControl(this)) , m_optionsControl(new WizardOptionsControl(this)) { { QWizard wizard; m_optionsControl->setWizardOptions(wizard.options()); m_styleControl->setWizardStyle(wizard.wizardStyle()); } QGridLayout *gridLayout = new QGridLayout(this); gridLayout->addWidget(m_optionsControl, 0, 0, 2, 1); gridLayout->addWidget(m_styleControl, 0, 1); QGroupBox *buttonGroupBox = new QGroupBox(this); QVBoxLayout *vLayout = new QVBoxLayout(buttonGroupBox); QPushButton *button = new QPushButton(tr("Show modal"), this); connect(button, SIGNAL(clicked()), this, SLOT(showModal())); vLayout->addWidget(button); button = new QPushButton(tr("Show non-modal"), this); connect(button, SIGNAL(clicked()), this, SLOT(showNonModal())); vLayout->addWidget(button); button = new QPushButton(tr("Show embedded"), this); button->setToolTip(tr("Test QWizard's behavior when used as a widget child.")); connect(button, SIGNAL(clicked()), this, SLOT(showEmbedded())); vLayout->addWidget(button); vLayout->addItem(new QSpacerItem(0, 0, QSizePolicy::Ignored, QSizePolicy::MinimumExpanding)); gridLayout->addWidget(buttonGroupBox, 1, 1); } void WizardPanel::showModal() { Wizard wizard(this); applyParameters(&wizard); wizard.exec(); } void WizardPanel::showNonModal() { Wizard *wizard = new Wizard(this); applyParameters(wizard); wizard->setModal(false); wizard->setAttribute(Qt::WA_DeleteOnClose); wizard->show(); } void WizardPanel::showEmbedded() { WizardEmbeddingDialog *dialog = new WizardEmbeddingDialog(this); applyParameters(dialog->wizard()); dialog->setModal(false); dialog->setAttribute(Qt::WA_DeleteOnClose); dialog->show(); } void WizardPanel::applyParameters(QWizard *wizard) const { wizard->setWizardStyle(m_styleControl->wizardStyle()); wizard->setOptions(m_optionsControl->wizardOptions()); wizard->setPixmap(QWizard::WatermarkPixmap, pixmapWithText(QLatin1String("Watermark"), QColor(Qt::blue).lighter())); wizard->setPixmap(QWizard::LogoPixmap, pixmapWithText(QLatin1String("Logo"), Qt::green)); wizard->setPixmap(QWizard::BannerPixmap, pixmapWithText(QLatin1String("Banner"), Qt::green)); wizard->setPixmap(QWizard::BackgroundPixmap, pixmapWithText(QLatin1String("Background"), QColor(Qt::red).lighter())); } #include "wizardpanel.moc"