QWizardPage、QWizard

2023-11-12

QWizardPage

一、描述

QWizard 代表一个向导。每个页面都是一个 QWizardPage。

Page 提供了五个可以重新实现以提供自定义行为的虚函数:

  • 当用户单击向导的 Next 按钮时,将调用 initializePage() 来初始化页面的内容。
  • 当用户单击向导的后退按钮时,将调用 cleanupPage() 以重置页面的内容。
  • validatePage() 在用户单击 Next Finish 时验证页面。如果用户输入了不完整或无效的信息,它通常用于显示错误消息。
  • nextId() 返回下一页的 ID。在创建非线性向导时很有用,它允许根据用户提供的信息进行不同的遍历路径。
  • 调用 isComplete() 来确定是否应启用或禁用 Next 和/或 Finish 按钮。如果重新实现 isComplete(),还要确保在完成状态更改时发出 completeChanged()。

通常,向导的 Next 按钮和 Finish 按钮是互斥的。如果 isFinalPage() 返回 true,则 Finish 可用;否则,Next 可用。默认情况下,isFinalPage() 仅在 nextId() 返回 -1 时为 true。如果想同时显示页面的 Next Final(让用户执行“提前完成”),请在该页面上调用 setFinalPage(true)。对于支持提前完成的向导,可能还需要在向导上设置 HaveNextButtonOnLastPage HaveFinishButtonOnEarlyPages 选项。

在许多向导中,页面内容可能会影响后续页面字段的默认值。为了方便页面之间的通信,QWizard 支持“字段(field)”机制,允许在页面上注册字段(例如,QLineEdit)并从任何页面访问其值。字段对整个向导是全局的,使任何单个页面都可以轻松访问另一个页面存储的信息,而无需将所有逻辑放入 QWizard 或让页面明确了解彼此。字段使用 registerField() 注册,并且可以随时使用 field() 和 setField() 访问。

二、属性成员

1、subTitle : QString

页面的副标题

副标题由 QWizard 显示,位于标题和实际页面之间。在 ClassicStyle 和 ModernStyle 中,必须使用副标题才能使标题出现。在 MacStyle 中,副标题显示为实际页面上方的文本标签。

副标题可能是纯文本或 HTML,取决于 QWizard::subTitleFormat 属性的值。

2、title : QString

页面的标题。

标题由 QWizard 显示,位于实际页面上方。所有页面都应该有一个标题。

标题可能是纯文本或 HTML,取决于 QWizard::titleFormat 属性的值。

三、成员函数

1、QWizardPage(QWidget *parent = nullptr)

构造具有给定父级的向导页面。

当使用 QWizard::addPage() 或 QWizard::setPage() 将页面插入到 QWizard 中时,父页面会自动设置为QWizard。

2、void completeChanged()

只要页面的完整状态(即 isComplete() 的值)发生变化,就会发出此信号。

如果重新实现 isComplete(),请确保在 isComplete() 的值更改时发出 completeChanged(),以确保 QWizard 更新其按钮的启用或禁用状态。

3、QString buttonText(QWizard::WizardButton which)

返回此页面上的按钮上的文本。

文本可使用 setButtonText() 或 QWizard::setButtonText() 设置。

默认情况下,按钮上的文本取决于 QWizard::wizardStyle。 例如,在 macOS 上,“下一步”按钮称为“继续”。

4、【virtual】 void cleanupPage()

当用户通过单击返回离开页面时,QWizard::cleanupPage() 调用此虚函数(除非设置了 QWizard::IndependentPages 选项)。

默认实现将页面的字段(field)重置为其原始值(原始值是在调用 initializePage() 之前它们具有的值)。

5、【protected】 QVariant field(const QString &name)

返回名为 name 的字段的值。

此功能可用于访问向导任何页面上的字段。相当于调用 wizard()->field(name)。

     【protected】 void setField(const QString &name, const QVariant &value)

设置字段的值。

此功能可用于在向导的任何页面上设置字段。相当于调用 wizard()->setField(name, value)。

6、【virtual】 void initializePage()

此虚函数由 QWizard::initializePage() 调用,以在页面显示之前准备页面,或者作为调用 QWizard::restart() 的结果,或者作为用户单击 Next 按钮的结果。(但是,如果设置了 QWizard::IndependentPages 选项,则仅在第一次显示页面时调用此函数。)

默认什么都不做。重新实现此功能,可确保页面的字段根据之前页面的字段正确初始化。

例如:

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

7、bool isCommitPage()

此页面是否提交页面。 

8、【virtual】 bool isComplete()

QWizard 调用此虚函数来确定是否应启用或禁用 Next Finish 按钮。

如果填写了所有必填字段,则默认实现返回 true;否则,它返回 false。

如果重新实现此函数,请确保在 isComplete() 的值发生变化时从其余的实现中发出 completeChanged()。这确保 QWizard 更新其按钮的启用或禁用状态。

9、bool isFinalPage()

QWizard 调用此函数来确定是否应为此页面显示 Finish 按钮。

默认情况下,如果没有下一页,则返回 true(即 nextId() 返回 -1); 否则,返回 false。

通过显式调用 setFinalPage(true),可以让用户执行“提前完成”

10、【virtual】 int nextId()

这个虚函数由 QWizard::nextId() 调用,以找出当用户单击 Next 按钮时要显示的页面。

返回值为下一页的 ID,如果没有后续页面,则返回 -1。

默认情况下,此函数返回大于当前页面 ID 的最小 ID,如果没有这样的 ID,则返回 -1。

通过重新实现此函数,可以指定动态页面顺序。例如:

int IntroPage::nextId() const
{
    if (evaluateRadioButton->isChecked()) 
    {
        return LicenseWizard::Page_Evaluate;
    } 
    else 
    {
        return LicenseWizard::Page_Register;
    }
}

11、QPixmap pixmap(QWizard::WizardPixmap which)

        void setPixmap(QWizard::WizardPixmap which, const QPixmap &pixmap)

设置 QWizard 在显示页面时使用像素图。

也可以使用 QWizard::setPixmap() 为整个向导设置像素图,在这种情况下,它们适用于所有未指定像素图的页面。

12、void registerField(const QString &name, QWidget *widget, const char *property = nullptr, const char *changedSignal = nullptr)

创建一个名为 name 的字段,与 widget 的 property 属性关联。

创建之后,可以使用 field() 和 setField() 访问该属性。

字段对整个向导是全局的,这使得任何单个页面都可以轻松访问另一个页面存储的信息,而无需将所有逻辑放入 QWizard 或让页面明确了解彼此。

如果 name 以星号 (*) 结尾,则该字段为必填字段。当页面具有必填字段时,只有在填写了所有必填字段后,才会启用 Next Finish 按钮。这需要指定一个 changedSignal,告诉 QWizard 重新检查强制字段存储的值。

常见的 Qt 小部件其子类无需指定属性或 changedSignal。下面是这些小部件:

可以使用 QWizard::setDefaultProperty() 将条目添加到此表或覆盖现有条目。

13、void setButtonText(QWizard::WizardButton which, const QString &text)

设置按钮上的文本。

14、void setCommitPage(bool commitPage)

如果 commitPage 为 true,则将此页面设置为提交页面;否则,将其设置为普通页面。

提交页面是表示无法通过单击“返回”或“取消”来撤消的操作的页面。

提交按钮替换提交页面上的 Next 按钮。

15、void setFinalPage(bool finalPage)

如果 finalPage 为 true,则显式将此页面设置为最终页面。

16、【virtual】bool validatePage()

当用户单击 Next Finish 以执行信息验证时,QWizard::validateCurrentPage() 调用此虚函数。 如果返回 true,则显示下一页(或向导结束); 否则,当前页面保持不变。

默认实现返回 true。

如果可能,禁用 Next Finish 按钮(通过指定必填字段或重新实现 isComplete())通常比重新实现 validatePage() 更好。

17、QWizard *wizard()

返回与此页面关联的向导。


QWizard

一、描述

向导是一种特殊类型的输入对话框,由一系列页面组成。向导的目的是引导用户逐步完成一个过程。

QWizard 继承 QDialog 并表示一个向导。每个页面都是一个 QWizardPage

1.1、一个简单的例子

以下示例说明了如何创建向导页面并将它们添加到向导。

#include <QApplication>
#include <QWizardPage>
#include <QLabel>
#include <QVBoxLayout>
#include <QLineEdit>

QWizardPage *createIntroPage()
{
    QWizardPage *page = new QWizardPage;
    page->setTitle("介绍");

    QLabel *label = new QLabel("此向导将帮助您注册产品");
    label->setWordWrap(true);

    QVBoxLayout *layout = new QVBoxLayout;
    layout->addWidget(label);
    page->setLayout(layout);

    return page;
}

QWizardPage *createRegistrationPage()
{
    QWizardPage *page = new QWizardPage;
    page->setTitle("注册");

    QLabel *label = new QLabel("注册码:");
    QLineEdit * lineEdit = new QLineEdit();

    QHBoxLayout *layout = new QHBoxLayout;
    layout->addWidget(label);
    layout->addWidget(lineEdit);
    page->setLayout(layout);

    return page;
}

QWizardPage *createConclusionPage()
{
    QWizardPage *page = new QWizardPage;
    page->setTitle("完成");

    QLabel *label = new QLabel("注册完成");
    QVBoxLayout *layout = new QVBoxLayout;
    layout->addWidget(label);
    page->setLayout(layout);

    return page;
}

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QWizard wizard;
    wizard.addPage(createIntroPage());
    wizard.addPage(createRegistrationPage());
    wizard.addPage(createConclusionPage());

    wizard.setWindowTitle("Trivial Wizard");
    wizard.show();

    return app.exec();
}

1.2、向导的外观和感觉

QWizard 支持四种向导外观:

  • ClassicStyle
  • ModernStyle
  • MacStyle
  • AeroStyle

1.3、向导页面的元素

向导由一系列 QWizardPages 组成。在任何时候,只显示一页。一个页面具有以下属性:

  1. 标题(title
  2. 副标题(subTitle
  3. 一组像素图,是否会起作用取决于向导的风格(QWizard::WizardPixmap

enum QWizard::WizardPixmap

  • WatermarkPixmapClassicStyle ModernStyle 页面左侧的高像素图
  • LogoPixmapClassicStyle ModernStyle 页面标题右侧的小像素图
  • BannerPixmap:占据 ModernStyle 页眉背景的像素图
  • BackgroundPixmap:占据 MacStyle 向导背景的像素图

下图显示了 QWizard 如何呈现这些属性,假设它们都存在并且使用了 ModernStyle

如果向导的样式是 MacStyle,则页面看起来完全不同:

1.4、注册和使用字段

在许多向导中,页面内容可能会影响后续页面字段的默认值。为了方便页面之间的通信,QWizard 支持“字段”机制,允许在页面上注册字段并从任何页面访问其值。还可以指定必填字段(即,在用户进入下一页之前必须填写的字段)。

调用 QWizardPage::registerField() 注册字段。例如:

ClassInfoPage::ClassInfoPage(QWidget *parent)
    : QWizardPage(parent)
{
    ...
    classNameLabel = new QLabel(tr("&Class name:"));
    classNameLineEdit = new QLineEdit;
    classNameLabel->setBuddy(classNameLineEdit);

    baseClassLabel = new QLabel(tr("B&ase class:"));
    baseClassLineEdit = new QLineEdit;
    baseClassLabel->setBuddy(baseClassLineEdit);

    qobjectMacroCheckBox = new QCheckBox(tr("Generate Q_OBJECT &macro"));

    registerField("className*", classNameLineEdit);
    registerField("baseClass", baseClassLineEdit);
    registerField("qobjectMacro", qobjectMacroCheckBox);
    ...
}

上面的代码注册了三个字段,className、baseClass和qobjectMacro,分别与三个子 widget 相关联。className 旁边的星号 (*) 表示必填字段

任何页面的字段都可以从任何其他页面访问。 例如:

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

调用 QWizardPage::field() 来访问 className 字段的内容。

当页面具有必填字段时,只有在填写了所有必填字段后,才会启用下一步和/或完成按钮。

QWizard 只需检查该字段的当前值是否不等于原始值(它在调用 initializePage() 时具有的值)。对于 QLineEditQAbstractSpinBox 子类,QWizard 还检查 hasAcceptableInput() 是否返回 true,以支持任何验证器或掩码。

QWizard 提供了的强制字段机制。一个更强大(但也更麻烦)的替代方法是重新实现 QWizardPage::isComplete() 并在页面变得完整或不完整时发出 QWizardPage::completeChanged() 信号。

Next 和/或 Finish 按钮的启用/禁用状态是对用户输入执行验证的一种方式。另一种方法是重新实现 validateCurrentPage()(或 QWizardPage::validatePage())以执行验证(如果用户输入了不完整或无效的信息,则显示错误消息)。如果函数返回 true,则显示 Next(或向导结束);否则,当前页面保持不变。

1.5、创建线性向导

大多数向导具有线性结构,第 1 页后跟第 2 页,以此类推,直到最后一页。使用 QWizard,通过实例化 QWizardPages 并使用 addPage() 插入它们来创建线性向导。默认情况下,页面按添加顺序显示。例如:

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

当一个页面即将显示时,QWizard 调用 initializePage()(它又调用 QWizardPage::initializePage())来用默认值填充页面。默认情况下,此函数什么都不做,但可以重新实现它以根据其他页面的字段初始化页面的内容。

如果用户按下 Back,则调用 cleanupPage()(它又调用 QWizardPage::cleanupPage())。默认实现将页面的字段重置为其原始值(在调用 initializePage() 之前它们具有的值)。如果希望后退按钮是非破坏性的并保留用户输入的值,只需启用 IndependentPages 选项。

1.6、创建非线性向导

一些向导更复杂,因为它们允许基于用户提供的信息的不同遍历路径。

在复杂的向导中,页面由 ID 标识。这些 ID 通常使用枚举定义。 例如:

class LicenseWizard : public QWizard
{
    ...
    enum { Page_Intro, 
           Page_Evaluate, 
           Page_Register, 
           Page_Details,
           Page_Conclusion };
    ...
};

页面是使用 setPage() 插入的,它接受一个 ID 和一个 QWizardPage(或子类)的实例:

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);
    ...
}

默认情况下,页面按 ID 递增顺序显示。为了提供取决于用户选择的选项的动态顺序,必须重新实现 QWizardPage::nextId()。 例如:

int IntroPage::nextId() const
{
    if (evaluateRadioButton->isChecked()) {
        return LicenseWizard::Page_Evaluate;
    } else {
        return LicenseWizard::Page_Register;
    }
}

int EvaluatePage::nextId() const
{
    return LicenseWizard::Page_Conclusion;
}

int RegisterPage::nextId() const
{
    if (upgradeKeyLineEdit->text().isEmpty()) {
        return LicenseWizard::Page_Details;
    } else {
        return LicenseWizard::Page_Conclusion;
    }
}

int DetailsPage::nextId() const
{
    return LicenseWizard::Page_Conclusion;
}

int ConclusionPage::nextId() const
{
    return -1;
}

也可以将所有逻辑放在一个地方,在 QWizard::nextId() 重新实现中。例如:

int LicenseWizard::nextId() const
{
    switch (currentId()) {
    case Page_Intro:
        if (field("intro.evaluate").toBool()) {
            return Page_Evaluate;
        } else {
            return Page_Register;
        }
    case Page_Evaluate:
        return Page_Conclusion;
    case Page_Register:
        if (field("register.upgradeKey").toString().isEmpty()) {
            return Page_Details;
        } else {
            return Page_Conclusion;
        }
    case Page_Details:
        return Page_Conclusion;
    case Page_Conclusion:
    default:
        return -1;
    }
}

要从具有最低 ID 的页面以外的另一个页面开始,请调用 setStartId()。

要测试页面是否已被访问,请调用 hasVisitedPage()。例如:

void ConclusionPage::initializePage()
{
    QString licenseText;

    if (wizard()->hasVisitedPage(LicenseWizard::Page_Evaluate)) {
        licenseText = tr("<u>评估许可协议:</u> "
                         "您可以使用此软件 30 天并进行一次备份,但不允许分发它。");
    } else if (wizard()->hasVisitedPage(LicenseWizard::Page_Details)) {
        licenseText = tr("<u>首次许可协议:</u> "
                         "您可以根据您将通过电子邮件收到的许可证来使用此软件。");
    } else {
        licenseText = tr("<u>升级许可协议:</u> "
                         "本软件根据您当前的许可条款获得许可。");
    }
    bottomLabel->setText(licenseText);
}

二、类型成员

1、enum QWizard::WizardButton:此枚举指定向导中的按钮:

  • BackButton:返回
  • NextButton:下一个
  • CommitButton:提交
  • FinishButton:完成
  • CancelButton:取消
  • HelpButton:帮助
  • CustomButton1:第一个用户定义按钮
  • CustomButton2:第二个用户自定义按钮
  • CustomButton3:第三个用户自定义按钮
  • Stretch:按钮布局中的水平拉伸,仅在调用 setButtonLayout() 时有用

2、enum QWizard::WizardOption:此枚举指定影响向导外观的各种选项:

  • IndependentPages:页面相互独立(即,它们不从彼此派生值)
  • IgnoreSubTitles:不显示子标题
  • ExtendedWatermarkPixmap:将 WatermarkPixmap 一直延伸到窗口边缘
  • NoDefaultButton:不要将 Next Finish 按钮设为对话框的默认按钮
  • NoBackButtonOnStartPage:不要在起始页上显示 Back 按钮
  • NoBackButtonOnLastPage:不要在最后一页显示 Back 按钮
  • DisabledBackButtonOnLastPage:禁用最后一页的 Back 按钮
  • HaveNextButtonOnLastPage:在最后一页上显示(禁用)Next 按钮
  • HaveFinishButtonOnEarlyPages:在非最终页面上显示(禁用)Finish 按钮
  • NoCancelButton:不显示取消按钮
  • CancelButtonOnLeft:将取消按钮放在 Back 的左侧(而不是 Finish Next 的右侧)
  • HaveHelpButton:显示帮助按钮
  • HelpButtonOnRight:将帮助按钮放在按钮布局的最右侧(而不是最左侧)
  • HaveCustomButton1:显示第一个用户定义按钮(CustomButton1
  • HaveCustomButton2:显示第二个用户定义按钮(CustomButton2
  • HaveCustomButton3:显示第三个用户定义按钮(CustomButton3
  • NoCancelButtonOnLastPage:不要在最后一页显示取消按钮

3、enum QWizard::WizardPixmap:此枚举指定可以与页面关联的像素图:

  • WatermarkPixmapClassicStyle ModernStyle 页面左侧的高像素图
  • LogoPixmapClassicStyleModernStyle 页面标题右侧的小像素图
  • BannerPixmap:占据 ModernStyle 页眉背景的像素图
  • BackgroundPixmap:占据 MacStyle 向导背景的像素图

4、enum QWizard::WizardStyle:此枚举指定了 QWizard 支持的不同外观:

  • ClassicStyle:经典 Windows 外观
  • ModernStyle:现代 Windows 外观
  • MacStyle:macOS 外观
  • AeroStyle:Windows Aero 外观

三、属性成员

1、【只读】currentId : const int

当前页面的ID。

2、options : WizardOptions

影响向导外观的各种选项。

3、startId : int

第一页的 ID。

如果未明确设置此属性,则默认为该向导中的最低页面 ID,如果尚未插入页面,则为 -1。

4、subTitleFormat : Qt::TextFormat

子标题使用的文本格式。默认为 Qt::AutoText

  • Qt::PlainText:纯文本字符串。
  • Qt::RichText:富文本字符串。
  • Qt::AutoText:自动检测。
  • Qt::MarkdownText:Markdown 格式的文本。

5、titleFormat : Qt::TextFormat

标题使用的文本格式。默认为 Qt::AutoText

6、wizardStyle : WizardStyle

向导的外观。

四、成员函数

1、void back()

返回上一页。相当于按下 Back 按钮。

      void next()

前进到下一页。

这相当于按下 Next Commit 按钮。 

2、【信号】void currentIdChanged(int id)

此信号在当前页面更改时发出,参数为新的当前 id。

3、【信号】void customButtonClicked(int which)

当用户单击自定义按钮时会发出此信号。可以是 CustomButton1CustomButton2 CustomButton3

4、【信号】void helpRequested()

当用户单击帮助按钮时会发出此信号。

默认情况下,不显示帮助按钮。调用 setOption(HaveHelpButton, true) 可显示。

LicenseWizard::LicenseWizard(QWidget *parent)
    : QWizard(parent)
{
    ...
    setOption(HaveHelpButton, true);
    connect(this, &QWizard::helpRequested, this, &LicenseWizard::showHelp);
    ...
}

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.");
    }

    QMessageBox::information(this, tr("License Wizard Help"), message);
}

5、【信号】void pageAdded(int id)

每当向向导添加页面时都会发出此信号。页面的 id 作为参数传递。

     【信号】void pageRemoved(int id)

每当从向导中删除页面时都会发出此信号。页面的 id 作为参数传递。 

6、void restart()

在开始页面重新启动向导。显示向导时会自动调用此函数。

7、int addPage(QWizardPage *page)

添加页面到向导,并返回页面的 ID。该 ID 保证大于 QWizard 中的任何其他 ID。

8、QAbstractButton * button(QWizard::WizardButton which)

返回与角色 which 对应的按钮。

      void setButton(QWizard::WizardButton which, QAbstractButton *button)

设置按钮对应角色的按钮。

要向向导添加额外的按钮(例如,打印按钮),可以使用 CustomButton1 CustomButton3 调用 setButton(),并使用 HaveCustomButton1 HaveCustomButton3 选项使按钮可见。

      void setButtonLayout(const QList<QWizard::WizardButton> &layout)

将按钮显示的顺序设置为 layout。

默认布局取决于设置的选项(例如,是否 HelpButtonOnRight)。 如果需要比已经提供的选项更多地控制按钮的布局,则可以调用此函数。

可以使用 Stretch 在布局中指定水平拉伸。

MyWizard::MyWizard(QWidget *parent)
    : QWizard(parent)
{
    ...
    QList<QWizard::WizardButton> layout;
    layout << QWizard::Stretch << QWizard::BackButton << QWizard::CancelButton
           << QWizard::NextButton << QWizard::FinishButton;
    setButtonLayout(layout);
    ...
}

9、QString buttonText(QWizard::WizardButton which)

返回按钮上的文本。如果使用 setButtonText() 设置了文本,则返回该文本。

默认按钮上的文本取决于 wizardStyle。例如 在 macOS 上,“下一步”按钮称为“继续”。

      void setButtonText(QWizard::WizardButton which, const QString &text)

设置按钮上的文本。

也可以使用 QWizardPage::setButtonText() 在每页的基础上设置按钮文本。

10、void cleanupPage(int id)

这个虚函数被 QWizard 调用以在用户通过单击 Back 离开它之前清理页面 id(除非设置了 IndependentPages 选项)。

默认实现在 page(id) 上调用 QWizardPage::cleanupPage()。

 11、QWizardPage * currentPage()

返回指向当前页面的指针,如果没有当前页面(例如,在显示向导之前),则返回 nullptr。

这相当于调用 page(currentId())。

12、QVariant field(const QString &name)

返回名为 name 的字段的值。此功能可用于访问向导任何页面上的字段。

13、bool hasVisitedPage(int id)

返回页面历史记录是否包含页面 id。按 Back 将当前页面再次标记为“未访问”。

14、void initializePage(int id)

这个虚函数被 QWizard 调用以在页面 id 显示之前准备页面 id,或者作为调用 restart() 的结果,或者作为用户单击 Next 的结果。(但是,如果设置了 IndependentPages 选项,则仅在第一次显示页面时调用此函数。)

通过重新实现此功能,可以确保页面的字段根据之前页面的字段正确初始化。

默认实现在 page(id) 上调用 QWizardPage::initializePage()。

15、int nextId()

QWizard 调用这个虚函数来找出当用户单击 Next 按钮时要显示的页面。

返回值为下一页的 ID,如果没有后续页面,则返回 -1。

默认实现在 currentPage() 上调用 QWizardPage::nextId()。

通过重新实现此函数,可以指定动态页面顺序。

16、QWizardPage *page(int id)

返回具有给定 id 的页面。

17、QList<int> pageIds()

返回页面 ID 列表。

18、QPixmap pixmap(QWizard::WizardPixmap which)

返回为角色 which 设置的像素图。

19、void removePage(int id)

删除具有给定 id 的页面。

注意:删除页面可能会影响 startId 属性的值。

20、void setDefaultProperty(const char *className, const char *property, const char *changedSignal)

将 className 的默认属性设置为 property,并将关联的更改信号设置为 changedSignal。

当 className (或其子类之一)的实例传递给 QWizardPage::registerField() 并且未指定任何属性时,使用默认属性。

21、void setField(const QString &name, const QVariant &value)

将名为 name 的字段的值设置为 value。此功能可用于在向导的任何页面上设置字段。

22、void setOption(QWizard::WizardOption option, bool on = true)

如果 on 为true,则将给定选项设置为启用;否则,清除给定的选项。

       bool testOption(QWizard::WizardOption option)

是否启用了相应选项。

23、void setPage(int id, QWizardPage *page)

将给定页面添加到具有给定 ID 的向导。

24、void setPixmap(QWizard::WizardPixmap which, const QPixmap &pixmap)

设置角色的像素图设置为像素图。

也可以使用 QWizardPage::setPixmap() 为特定页面设置像素图。

25、void setSideWidget(QWidget *widget) / QWidget * sideWidget()

设置显示在向导的侧面小部件。对于使用 WatermarkPixmapClassicStyle ModernStyle)的样式,侧面小部件显示在水印顶部,对于其他样式,侧面小部件显示在向导的左侧。

默认情况下,不存在任何侧面小部件。

26、bool validateCurrentPage()

当用户单击 NextFinish 以执行验证时,QWizard 会调用此虚拟函数。如果返回 true,则显示下一页(或向导结束); 否则,当前页面保持不变。

默认实现在 currentPage() 上调用 QWizardPage::validatePage()。

如果可能,禁用 Next Finish 按钮(通过指定必填字段或通过重新实现 QWizardPage::isComplete())通常比重新实现 validateCurrentPage() 更好。

27、QList<int> visitedIds()

按照页面被访问的顺序返回已访问页面的 ID 列表。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QWizardPage、QWizard 的相关文章

  • 如何使用 qt 库中的调试符号为 qt 5.5 创建开发 shell

    我有一个开发外壳buildInputs条目包括qt55 qtbase 这很好用 今天 我在 qt 库中发生了段错误 我想要带有调试符号的 qt 库 我看了一下nixpkgs pkgs development libraries qt 5 5
  • QT C++ QRegularExpression 多个匹配

    我想使用正则表达式从 QString html 中提取信息 我明确想使用正则表达式 无解析器解决方案 和类Q正则表达式 http qt project org doc qt 5 0 qtcore qregularexpression htm
  • 在 Windows 上以 QML 播放 RTSP 视频

    我正在尝试将 QML 中的 RTSP 流播放到视频标签中 如下所示 Repeater model 8 Video Layout fillWidth true Layout fillHeight true fillMode VideoOutp
  • 构建qt程序时未定义的符号:找不到qt_version_tag

    我正在学习Qt5 6 我正在使用 Ubuntu 14 4 当我链接我的程序时 出现以下错误 undefined reference to qt version tag 在 CMakeLists txt 中 link libraries Qt
  • 在 QML 中控制纹理 3D 对象的不透明度

    我对 QML 中的 Qt 3D 有点陌生 我正在尝试控制 Qt 3D 的不透明度textured3D 对象 我正在使用简单qml3d https github com tripolskypetr simpleqml3d测试项目来做到这一点
  • 我如何告诉 QTableWidget 结束编辑单元格?

    我正在显示一个弹出菜单来选择 QTableWidget 中的某些值 最下面的项目是 修改列表 条目 当我选择它时 应自动出现一个新窗口 并且 QComboBox 应消失 并且单元格返回到 Qt DisplayRole 状态 现在 Qt 拥有
  • Qt:关闭期间线程仍在运行时 qthread 被销毁

    我有一堂课 class centralDataPool public QObject Q OBJECT public centralDataPool QObject parent 0 centralDataPool commMonitor
  • 更改 Qt 中的语言环境

    我尝试使用 QLocale 和 setDefault 函数更改区域设置 但似乎不起作用 以下是使用 C 本地化库和 QLocale 更改语言环境的示例 对于 C 本地化库 它似乎可以工作 但对于 QLocale setDefault 函数调
  • Qt 码头调整大小事件

    有没有办法在 Qt 中捕捉码头的调整大小事件 我需要能够检测到扩展坞何时调整大小 而不仅仅是其位置或 功能 发生变化时 看起来 QDockWidget 没有 调整大小 信号 如果您不希望子类化以仅获得调整大小事件控件 您可以安装事件过滤器
  • Qmake 不支持源目录下的构建目录

    我创建了一个可以在 OS X 上编译和运行的应用程序 我现在想开始让它在 Windows 上运行 首先 我将项目复制到 Windows 机器上并尝试编译 但收到此错误 警告 Qmake不支持源目录下的构建目录 有任何想法吗 将影子构建目录设
  • 如何在Qt中更快地读取数据?

    Qt读取数据库比C 慢吗 我想我错过了一些东西 为了比较阅读速度 我在 Qt 中编写了以下内容 QElapsedTimer t t start int count 0 QString cs Driver SQL Server Server
  • 如何使用样式表删除 QWizard 中的水平线?

    我正在研究一个样式表QWizard我想删除按钮上方的水平线 我已经发布了一个最小的例子here https stackoverflow com q 52538669 8570451 这个问题是由scopchanov从最小的例子中解决的 但是
  • 使用 QPrinter 打印第 x 页(共 y 页)

    我使用 qt 从 html 代码生成 pdf 文件 QTextDocument document new QTextDocument document gt setHtml htmlContent QPrinter printer QPri
  • 使用样式表时的 QTabWidget tabPosition

    我目前正在使用样式表来设计应用程序的主题 这是我用于 QTabWidget 的样式表 QTabBar et QTabWidget QTabBar tab background qlineargradient spread pad x1 0
  • 带 Qt 的菜单栏/系统托盘应用程序

    我是 Qt PyQt 的新手 我正在尝试制作一个应用程序 其功能将从菜单栏 系统托盘执行 这里展示了一个完美的例子 我找不到关于如何做到这一点的好资源 有人可以建议吗 Thanks 我认为您正在寻找与QMenu and QMainWindo
  • Qt 5.5 QOpenGLWidget 链接错误未链接任何 openGL 调用

    我尝试使用 Qt 5 5 1 构建一个简单的 OpenGL 应用程序 一切都很好 直到我尝试使用 glClearColor 等 openGL 本机函数调用 该小部件实际上编译并产生黑屏 但在我尝试使用任何 openGL 本机函数后 它甚至不
  • 另一个宏中的 Q_PROPERTY 宏

    如何放置Q PROPERTY另一个宏里面 辅助宏 define SimpleAllinOne member type public void Set member type arg member m member arg member ty
  • 如何将 QByteArray 转换为十六进制字符串?

    我有打击QByteArray QByteArray ba ba 0 0x01 ba 1 0x10 ba 2 0x00 ba 3 0x07 我真的不知道如何将此 QByteArray 转换为结果字符串 其中包含 01100007 我将使用 Q
  • 获取 QPushButton 在 2D 数组 QPushButton 上的索引

    我有一个二维数组QPushButton 当用户单击按钮时如何获取按钮的索引 例如当用户单击按钮时a 2 3 它会显示 2 3 该示例如下所示 Qt 4 5 使用对象名称 您可以为按钮指定唯一的对象名称 理想情况下 名称应该是有效的 C 标识
  • PyQt - 如何从给定的小部件获取顶级父级?

    给定的小部件如何访问它最旧的父级 即顶级小部件 我需要 showMinimized it 现在我正在使用 self parent parent parent showMinimized 但这似乎不是最好的方法 如果它移动了 我需要手动更改父

随机推荐

  • Ubuntu16.04 完全卸载cuda

    sudo apt get purge remove cuda
  • 解决GO语言编译程序在openwrt(mipsle架构)上运行提示Illegal instruction问题

    RT 最近在研究openwrt mipsle架构 上运行go语言编译出来的程序 一运行就报 Illegal instruction 这样的错误 百度和Google搜索了一遍 得出两种解决方案 PS 更新一遍 当时写这个文档的时候没有发现Go
  • JavaScript(6)-字符串的定义和使用,字符串的属性和方法及Math

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 字符串的定义和使用 1 字符串的定义 2 new String 和String 的区别 二 字符串的属性和方法 1 字符串的属性 2 字符串的方法 函数
  • 软件测试DAY02

    黑盒测试定义 黑盒测试相对于白盒测试而言 并不关心被测对象的内部实现 而是针对被测对象提供的外部功能与规格来设计测试用例进行的测试 黑盒测试分类 功能测试 性能测试 可用性测试 可靠性测试 安全性测试 客服务性测试 组网解决方案测试 常见黑
  • 贝叶斯分类算法及其matlab代码

    贝叶斯分类是一类分类算法的总称 这类算法均以贝叶斯定理为基础 故统称为贝叶斯分类 贝叶斯分类是一类利用概率统计知识进行分类的算法 其分类原理是贝叶斯定理 贝叶斯定理是由18世纪概率论和决策论的早期研究者Thomas Bayes发明的 故用其
  • Error:(x, xx) java: 找不到符号符号:类 xxx位置:程序包 xxx.xxx,只能通过mvn idea:module重新构建.iml文件

    程序运行时报找不到包类错误 折腾了一整天 最后只找到了临时解决办法 删除项目 项目名称 iml文件 通过 mvn idea module命令重新生成一个 iml文件 至此只能临时解决项目运行问题 当修改pom文件或者重新使用maven命令c
  • 【小蓓学AD20】如何修改原理图右下角的标题栏

    第一步 在原理图页面双击边缘 在右边可看到如图1所示界面 图1 取消勾选Title Block 第二步 单击Template 进入如图2所示页面 点击按钮 在下拉框里选择你的模板路径 对图3的弹出框不做修改 单击 确定 图2 图3 完成效果
  • 机器学习--决策树(10)

    一 基本概念 1 1 是什么 分类决策树模型是一种描述对实例进行分类的树形结构 相当于if then结构 决策树由节点和有向边构成 节点有两种 一种是内部节点 表示一个特征或者属性 另一种是叶子节点 表示一个决策结果 1 2 优缺点 优点
  • Fedora的启动方式(命令行启动)

    Linux有6种不同的运行级别 默认的情况下Fedora安装完成后是从X Window启动的 X Window占用系统资源很大 所以对于我们仅仅想使用命令行模式的人来说 界面那么大 耗费资源太多有些浪费 那如何让Fedora从命令行启动而不
  • 卷麻了,00后测试用例写的比我还好,简直无地自容......

    经常看到无论是刚入职场的新人 还是工作了一段时间的老人 都会对编写测试用例感到困扰 例如 如何编写测试用例 作为一个测试新人 刚开始接触测试 对于怎么写测试用例很是头疼 无法接触需求 只能站在用户角度去做测试 但是这样情况会导致不能全方位测
  • parallel scavenge 与parnew 区别:

    Parallel Scavenge收集器是一个新生代收集器 它也是使用复制算法的收集器 又是并行的多线程收集器 看上去和ParNew都一样 那它有什么特别之处呢 Parallel Scavenge收集器的特点是它的关注点与其他收集器不同 C
  • 一款盲盒的交友软件叫什么(微信恋爱脱单交友盲盒小程序制作开发介绍)

    盲盒的交友软件一般叫做叫 盲盒脱单神器 月老交友盲盒或者是叫做一元交友等名称都是运营商自己随便起的 微信恋爱脱单交友盲盒小程序 一般情况是以H5网页的形式进行使用 做成微信小程序的形式需要相关资质 主要功能有 幻灯片 放入盒子 随机匹配 星
  • git clone指定分支拉代码、版本回退、log/reflog对比

    指定分支clone代码 1 git clone 不指定分支 默认就是master git clone http 10 1 1 11 service tmall service git 2 git clone 指定分支 git clone b
  • 【2022/2023年硕士研究生408计算机学科考试大纲原文】+【2009-2021年408统考真题+解析PDF】

    文章目录 2009 2021年408统考真题 解析 PDF版 I 考试性质 II 考查目标 III 试形式和试卷结构 一 试卷满分及考试时间 二 答题方式 三 试卷内容结构 四 试卷题型结构 IV 考查内容 数据结构 一 线性表 二 栈 队
  • CAS 5.3自定义 登录

    自定义认证校验策略 我们知道CAS为我们提供了多种认证数据源 我们可以选择JDBC File JSON等多种方式 但是如果我想在自己的认证方式中可以根据提交的信息实现不同数据源选择 这种方式就需要我们去实现自定义认证 自定义策略主要通过现实
  • 网页中插入图片的代码

    本文转载至 http www luke99 com celuechuangyi 2011 05 6912 html 如何在网页中插入图片呢 只要有图片的地址 就可以通过代码设置而放入我们的网页的 代码具体如下 img src 其中蓝色部分为
  • 牛客网题集——Min Value(逻辑)

    Min Value 牛客网测试平台 题意 一个由 N 个数组成的序列 a1 a2 a3 an 1 an 从中任选两个数 ai 和 aj 使得 ai aj 的绝对值最小 并且计算出 i j 的值 其中 i j 输入描述 输入第一行包含一个正整
  • 调用高德地图展示车辆行驶轨迹

    如何在页面中使用高德地图并分页展示多段历史轨迹 引入高德地图的JavaScript API 打开index html key 后面的内容是你自己在高德上申请 的key 引入高德组件 配置webpack 找到webpack base conf
  • 【Java日期时间】@JsonFormat与@DateTimeFormat注解的区分和使用

    目录标题 JsonFormat与 DateTimeFormat注解的区分和使用 1 背景 2 JsonFormat代码示例 步骤 注意 3 DateTimeFormat代码示例 步骤 注意 总结 JsonFormat与 DateTimeFo
  • QWizardPage、QWizard

    QWizardPage 一 描述 QWizard 代表一个向导 每个页面都是一个 QWizardPage Page 提供了五个可以重新实现以提供自定义行为的虚函数 当用户单击向导的 Next 按钮时 将调用 initializePage 来