Пример "License Wizard"
|
Имя класса | Значение перечисления | Идентификатор страницы |
---|---|---|
IntroPage | Page_Intro | 0 |
EvaluatePage | Page_Evaluate | 1 |
RegisterPage | Page_Register | 2 |
DetailsPage | Page_Details | 3 |
ConclusionPage | Page_Conclusion | 4 |
Для этого примера идентификаторы являются произвольными. Единственными ограничениями является то, что они должны быть уникальными и отличным от -1. Идентификаторы позволяют нам ссылать на страницы.
LicenseWizard::LicenseWizard(QWidget *parent) : QWizard(parent) { setPage(Page_Intro, new IntroPage); setPage(Page_Evaluate, new EvaluatePage); setPage(Page_Register, new RegisterPage); setPage(Page_Details, new DetailsPage); setPage(Page_Conclusion, new ConclusionPage); setStartId(Page_Intro);
В конструкторе мы создаём пять страниц, вставляет их в мастер, используя QWizard::setPage(), и устанавливаем Page_Intro первой страницей.
#ifndef Q_WS_MAC setWizardStyle(ModernStyle); #endif
Мы установили стиль ModernStyle на всех платформах, за исключением Mac OS X,
setOption(HaveHelpButton, true); setPixmap(QWizard::LogoPixmap, QPixmap(":/images/logo.png")); connect(this, SIGNAL(helpRequested()), this, SLOT(showHelp())); setWindowTitle(tr("License Wizard")); }
Мы конфигурируем QWizard чтобы показать кнопку Help, которая соединена с нашим слотом showHelp(). Мы также установили LogoPixmap для всех страниц, у которых есть заголовок (т.е., EvaluatePage, RegisterPage и DetailsPage).
void LicenseWizard::showHelp() { static QString lastHelpMessage; QString message; switch (currentId()) { case Page_Intro: message = tr("The decision you make here will affect which page you " "get to see next."); break; ... default: message = tr("This help is likely not to be of any help."); } if (lastHelpMessage == message) message = tr("Sorry, I already gave what help I could. " "Maybe you should try asking a human?"); QMessageBox::information(this, tr("License Wizard Help"), message); lastHelpMessage = message; }
В showHelp() мы выводим на экран справочные тексты, которые соответствуют текущей странице. Если пользователь дважды щелкнет Help на одной и той же странице, мы сообщим: "Sorry, I already gave what help I could. Maybe you should try asking a human?"
Страницы определены в licensewizard.h и реализованы в licensewizard.cpp, вместе с LicenseWizard.
Вот определение и реализация IntroPage:
class IntroPage : public QWizardPage { Q_OBJECT public: IntroPage(QWidget *parent = 0); int nextId() const; private: QLabel *topLabel; QRadioButton *registerRadioButton; QRadioButton *evaluateRadioButton; }; IntroPage::IntroPage(QWidget *parent) : QWizardPage(parent) { setTitle(tr("Introduction")); setPixmap(QWizard::WatermarkPixmap, QPixmap(":/images/watermark.png")); topLabel = new QLabel(tr("This wizard will help you register your copy of " "<i>Super Product One</i>™ or start " "evaluating the product.")); topLabel->setWordWrap(true); registerRadioButton = new QRadioButton(tr("&Register your copy")); evaluateRadioButton = new QRadioButton(tr("&Evaluate the product for 30 " "days")); registerRadioButton->setChecked(true); QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(topLabel); layout->addWidget(registerRadioButton); layout->addWidget(evaluateRadioButton); setLayout(layout); }
Страница унаследована от QWizardPage. Мы установили title и watermark pixmap. Не устанавливая любой subTitle мы обеспечиваем, что для этой страницы не будет показан заголовок. (В Windows это обычно для мастеров - показывать растровое изображение водяного знака на первой и последней страницах, а на остальных страницах иметь заголовок.)
int IntroPage::nextId() const { if (evaluateRadioButton->isChecked()) { return LicenseWizard::Page_Evaluate; } else { return LicenseWizard::Page_Register; } }
Функция nextId() возвращает идентификатор для EvaluatePage если отмечена опция Evaluate the product for 30 days; в противном случае она возвращает идентификатор RegisterPage.
EvaluatePage немного более запутан:
class EvaluatePage : public QWizardPage { Q_OBJECT public: EvaluatePage(QWidget *parent = 0); int nextId() const; private: QLabel *nameLabel; QLabel *emailLabel; QLineEdit *nameLineEdit; QLineEdit *emailLineEdit; }; EvaluatePage::EvaluatePage(QWidget *parent) : QWizardPage(parent) { setTitle(tr("Evaluate <i>Super Product One</i>™")); setSubTitle(tr("Please fill both fields. Make sure to provide a valid " "email address (e.g., john.smith@example.com).")); nameLabel = new QLabel(tr("N&ame:")); nameLineEdit = new QLineEdit; ... registerField("evaluate.name*", nameLineEdit); registerField("evaluate.email*", emailLineEdit); ... }
Сначала мы установили title и subTitle страницы.
Затем мы создаём дочерние виджеты, создаём поля мастера, связанные с ними, и помещаем их в компоновки. Поля создаются с символом звездочка (*) после их имён. Это делает их обязательными полями, т.е., поля, которые должны быть заполнены до того как пользователь сможет нажать кнопку Next (Continue в Mac OS X). Значения полей доступны из любой другой страницы с использованием QWizardPage::field().
Сбросим количество страниц для очистки двух текстовых полей.
int EvaluatePage::nextId() const { return LicenseWizard::Page_Conclusion; }
Следующая страница - всегда ConclusionPage.
RegisterPage и DetailsPage очень похожи на EvaluatePage. Давайте перейдём непосредственно к ConclusionPage:
class ConclusionPage : public QWizardPage { Q_OBJECT public: ConclusionPage(QWidget *parent = 0); void initializePage(); int nextId() const; void setVisible(bool visible); private slots: void printButtonClicked(); private: QLabel *bottomLabel; QCheckBox *agreeCheckBox; };
Сейчас мы переопределяем QWizardPage::initializePage() и QWidget::setVisible(), в дополнение к nextId(). Мы также объявляем закрытый слот: printButtonClicked().
int IntroPage::nextId() const { if (evaluateRadioButton->isChecked()) { return LicenseWizard::Page_Evaluate; } else { return LicenseWizard::Page_Register; } }
Реализация QWizardPage::nextId() по умолчанию возвращает страницу со следующим идентификатором или -1, если текущая страница имеет наибольший идентификатор. Это поведение будет работать здесь, поскольку Page_Conclusion равно 5 и нет страниц с большим идентификатором, но чтобы не полагаться на такое тонкое поведение, мы переопределяем nextId() для возвращения -1.
void ConclusionPage::initializePage() { QString licenseText; if (wizard()->hasVisitedPage(LicenseWizard::Page_Evaluate)) { licenseText = tr("<u>Evaluation License Agreement:</u> " "You can use this software for 30 days and make one " "backup, but you are not allowed to distribute it."); } else if (wizard()->hasVisitedPage(LicenseWizard::Page_Details)) { licenseText = tr("<u>First-Time License Agreement:</u> " "You can use this software subject to the license " "you will receive by email."); } else { licenseText = tr("<u>Upgrade License Agreement:</u> " "This software is licensed under the terms of your " "current license."); } bottomLabel->setText(licenseText); }
Мы используем QWizard::hasVisitedPage() чтобы определить тип лицензионного соглашения, выбранного пользователем. Если пользователь заполнил EvaluatePage, текст лицензии ссылается на Evaluation License Agreement. Если пользователь заполнил DetailsPage, текст лицензии - First-Time License Agreement. Если пользователь предоставил ключ модернизации и пропустил DetailsPage, текст лицензии - Update License Agreement.
void ConclusionPage::setVisible(bool visible) { QWizardPage::setVisible(visible); if (visible) { wizard()->setButtonText(QWizard::CustomButton1, tr("&Print")); wizard()->setOption(QWizard::HaveCustomButton1, true); connect(wizard(), SIGNAL(customButtonClicked(int)), this, SLOT(printButtonClicked())); } else { wizard()->setOption(QWizard::HaveCustomButton1, false); disconnect(wizard(), SIGNAL(customButtonClicked(int)), this, SLOT(printButtonClicked())); } }
Мы хотим вывести на экран кнопку Print в мастере когда открыта ConclusionPage. Один способ чтобы достигнуть этого - переопределить QWidget::setVisible():
Смотрите также QWizard, Пример "Class Wizard" и Пример "Trivial Wizard".
Copyright © 2008 Nokia | Торговые марки | Qt 4.4.3 |
Попытка перевода Qt документации. Если есть желание присоединиться, или если есть замечания или пожелания, то заходите на форум: Перевод Qt документации на русский язык... Люди внесшие вклад в перевод: Команда переводчиков |