【Qt之QWizardPage】使用

博客介绍了向导页面基类,其属性及相关虚函数,如初始化、重置、验证页面等函数的作用。还阐述了向导按钮的互斥关系及字段注册机制。同时介绍了常用方法,包括页面准备、设置按钮文本、设置提交页和最终页等,最后给出示例。

介绍

QWizardPage类是向导页面的基类。
QWizard表示一个向导。每个页面都是一个QWizardPage。当创建自己的向导时,可以直接使用QWizardPage,也可以子类化它以获得更多控制。
页面具有以下属性,由QWizard呈现:a titlea subTitlea set of pixmaps。有关详细信息,请参见向导页面元素。一旦将页面添加到向导中(使用QWizard :: addPage()QWizard :: setPage()),wizard()将返回指向相关的QWizard对象的指针。
页面提供了五个虚函数,可以重新实现以提供自定义行为:

  • initializePage()在用户单击向导的“下一步”按钮时调用以初始化页面的内容。如果您想从先前页面输入的内容中派生页面的默认值,则应该重新实现此函数。
  • cleanupPage()在用户单击向导的“返回”按钮时调用以重置页面的内容。
  • validatePage()在用户单击Next或Finish时验证页面。如果用户输入了不完整或无效的信息,通常会使用此函数显示错误消息。
  • nextId()返回下一页的ID。它在创建非线性向导时很有用,这些向导允许基于用户提供的信息进行不同的遍历路径。
  • isComplete()用于确定是否应启用或禁用“下一步”和/或“完成”按钮。如果重新实现isComplete(),还必须确保每当完成状态更改时发出completeChanged()。

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

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

常用方法

  1. virtual void initializePage(int id)
    这个虚函数由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 ()));
}

默认实现什么都不做。
2. void setButtonText(QWizard::WizardButton which, const QString &text)
将按钮上的文本设置为本页上的文本。
默认情况下,按钮上的文本依赖于QWizard::wizardStyle,但可以使用QWizard::setButtonText()为整个向导重新定义。

setButtonText(QWizard::NextButton, "hei");

在这里插入图片描述
3. void setCommitPage(bool commitPage)
如果commitPage为true,则将该页设置为提交页;否则,将其设置为普通页面。
提交页是表示不能通过单击“返回”或“取消”来撤消的操作的页面。
提交按钮取代提交页面上的Next按钮。单击此按钮只调用QWizard::next(),就像单击next一样。
直接从提交页面进入的页面会禁用后退按钮。

setCommitPage(true);

在这里插入图片描述

  1. void setFinalPage(bool finalPage)
    如果finalPage为true,则显式地将此页面设置为final。
    调用setFinalPage(true)后,isFinalPage()返回true, Finish按钮可见(如果isComplete()返回true则启用)。
    调用setFinalPage(false)后,如果nextId()返回-1,isFinalPage()返回true;否则,返回false。

示例

.h

#ifndef CLASSWIZARD_H
#define CLASSWIZARD_H

#include <QWizard>

QT_BEGIN_NAMESPACE
class QCheckBox;
class QGroupBox;
class QLabel;
class QLineEdit;
class QRadioButton;
QT_END_NAMESPACE

class ClassWizard : public QWizard
{
   
   
    Q_OBJECT

public:
    ClassWizard(QWidget *parent = 0);

    void accept() override;
};

class IntroPage : public QWizardPage
{
   
   
    Q_OBJECT

public:
    IntroPage(QWidget *parent = 0);

private:
    QLabel *label;
};

class ClassInfoPage : public QWizardPage
{
   
   
    Q_OBJECT

public:
    ClassInfoPage(QWidget *parent = 0);

private:
    QLabel *classNameLabel;
    QLabel *baseClassLabel;
    QLineEdit *classNameLineEdit;
    QLineEdit *baseClassLineEdit;
    QCheckBox *qobjectMacroCheckBox;
    QGroupBox *groupBox;
    QRadioButton *qobjectCtorRadioButton;
    QRadioButton *qwidgetCtorRadioButton;
    QRadioButton *defaultCtorRadioButton;
    QCheckBox *copyCtorCheckBox;
};

class CodeStylePage : public QWizardPage
{
   
   
    Q_OBJECT

public:
    CodeStylePage(QWidget *parent = 0);

protected:
    void initializePage() override;

private:
    QCheckBox *commentCheckBox;
    QCheckBox *protectCheckBox;
    QCheckBox *includeBaseCheckBox;
    QLabel *macroNameLabel;
    QLabel *baseIncludeLabel;
    QLineEdit *macroNameLineEdit;
    QLineEdit *baseIncludeLineEdit;
};

class OutputFilesPage : public QWizardPage
{
   
   
    Q_OBJECT

public:
    OutputFilesPage(QWidget *parent = 0);

protected:
    void initializePage() override;

private:
    QLabel *outputDirLabel;
    QLabel *headerLabel;
    QLabel *implementationLabel;
    QLineEdit *outputDirLineEdit;
    QLineEdit *headerLineEdit;
    QLineEdit *implementationLineEdit;
};

class ConclusionPage : public QWizardPage
{
   
   
    Q_OBJECT

public:
    ConclusionPage(QWidget *parent = 0);

protected:
    void initializePage() override;

private:
    QLabel *label;
};

#endif

.cpp

#include <QtWidgets>

#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::BannerPixmap, QPixmap(":/images/banner.png"));
    setPixmap(QWizard::BackgroundPixmap, QPixmap(":/images/background.png"));

    setWindowTitle(tr("Class Wizard"));
}

void ClassWizard::accept()
{
   
   
    QByteArray className = field("className").toByteArray();
    QByteArray baseClass = field("b
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FreeLikeTheWind.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值