Qt应用开发(基础篇)——向导对话框 QWizard

一、前言

QWizard 类继承于QDialog,为有向导界面需求的应用环境提供了一个框架。

对话框窗口 QDialog

QWizard 向导对话框是一个拥有队列界面 的特殊对话框,向导的目的是引导用户一步一步的完成预设的流程**。** 向导常用于软件安装界面向导硬件线路安装向导拆机流程等一些复杂或者不常见的任何的场景。

QWizard 类继承于QDialog ,并在其基础上拓展了向导的功能,每个子界面由QWizardPage封装,下面的例子演示如果新建一个向导。

cpp 复制代码
#include <QApplication>
#include <QDebug>
#include <QWizardPage>
#include <QLabel>
#include <QVBoxLayout>
QWizardPage *createIntroPage()
{
     QWizardPage *page = new QWizardPage;
     page->setTitle("Introduction");

     QLabel *label = new QLabel("This wizard will help you register your copy "
                                "of Super Product Two.");
     label->setWordWrap(true);

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

     return page;
}

QWizardPage *createRegistrationPage()
{
     return new QWizardPage;
}

QWizardPage *createConclusionPage()
{
     return new QWizardPage;
}

int main(int argc, char *argv[])
{
     QCoreApplication::setAttribute(Qt::AA_UseHighDpiPixmaps);

     QApplication app(argc, argv);

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

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

     return app.exec();
}

++向导外观++

QWizard 提供了四种向导界面风格WizardStyle (ClassicStyleModernStyleMacStyleAeroStyle ),如果需要让全部平台都显示一样的风格,可以使用**setWizardStyle()**设置。

QWizard 还提供了外观选项options, 用来控制向导的外观,比如显示帮助按钮HaveHelpButton ,忽略二级标题IgnoreSubTitles 等,使用setOption() 或者**setOptions()**来设置这些外观选项。

++向导页面和元素++

QWizardPage 继承于QWdiget,是导航框架队列中的子界面,在同一时间只能显示一个页面,这和StackedWidget机制是一样的。每个子界面拥有标题title、二级标题subTitle和一组像素图,像素图的显示需要跟界面风格WizardStyle互相绑定。

  • WatermarkPixmap(由ClassicStyle和ModernStyle使用)
  • BannerPixmap(由ModernStyle使用)
  • LogoPixmap(由ClassicStyle和ModernStyle使用)
  • BackgroundPixmap (MacStyle使用)

如果设置的是ModernStyle, 下图显示了QWizard如何呈现这些属性。标题等文本支持纯文本或者富文本格式,当设置了subTitle 后,QWizard 将其显示在标题中,在这种情况下,它还使用BannerPixmapLogoPixmap 来装饰标题。WatermarkPixmap显示在左侧,在标题下方。在底部,有一排按钮允许用户浏览页面。

如果设置的是MacStyle,那么显示的风格就看起来很不一样,水印watermark 、横幅banner ,和标志像素图logo 被MacStyle忽略,如果设置了BackgroundPixmap,它将用作向导的背景。

++注册机制++

通常在向导界面中,经常会出现前面页面的选择会影响后面页面的展示和选择,为了便于在页面之间进行通信,QWizard支持一个"字段"机制,允许您在页面上注册一个字段,并从任何页面访问其值。还可以指定强制字段(即,在用户进入下一页之前必须填充的字段),下面是一个注册字段的例子。

cpp 复制代码
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,它们与三个编辑框相关联,className后面的星号(*)表示必填字段

然后我们在其他任意界面就可以通过注册的字段获取到相关联的子部件的值。

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

++创建非线性向导++

大多数向导都是线性结构,第1页接着第2页,以此类推,直到最后一页,在上面的例子中我们通过使用**addPage()**添加页面,默认按照添加的顺序显示。

有些向导更复杂,因为它们允许基于用户提供的信息的不同遍历路径,根据选择的选项,用户可以访问不同的页面。下面的例子演示如何创建非线性向导:

首先我们需要把每个界面赋予ID。

cpp 复制代码
class LicenseWizard : public QWizard
{
     ...
     enum { Page_Intro, Page_Evaluate, Page_Register, Page_Details,
            Page_Conclusion };
     ...
};

在增加页面的同时让每个页面绑定某一个ID。

cpp 复制代码
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递增做显示,所以我们需要重新实现next()方法。

cpp 复制代码
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;
     }
}

二、QWizard类

1、currentId

该属性表示当前页面的ID,该属性可能会没有被设置,默认为-1。

cpp 复制代码
int currentId() const

2、options

该属性表示当前对话框的一些外观显示策略,默认情况下windows系统被设置了HelpButtonOnRight,macOS系统被设置了NoDefaultButton和NoCancelButton,其他系统默认没有设置任何内容。

cpp 复制代码
QWizard::WizardOptions options() const
void setOptions(QWizard::WizardOptions options)

bool testOption(QWizard::WizardOption option) const
void setOption(QWizard::WizardOption option, bool on = true)
QWizard::WizardOption 描述
IndependentPages 页面相互独立
IgnoreSubTitles 忽略二级标题
ExtendedWatermarkPixmap 扩展显示WatermarkPixmap到窗口边缘。
NoDefaultButton 不显示Next或Finish按钮。
NoBackButtonOnStartPage 起始页面不显示Back按钮
NoBackButtonOnLastPage 尾页不显示Back按钮
DisabledBackButtonOnLastPage Back按钮在尾页显示为不可触发
HaveNextButtonOnLastPage Next按钮在尾页显示为不可触发
HaveFinishButtonOnEarlyPages Finish按钮在尾页显示为不可触发
NoCancelButton 不显示Cancel按钮
CancelButtonOnLeft 把Cancel按钮放在Back左边
HaveHelpButton 显示Help按钮
HelpButtonOnRight Help按钮放在最右边
HaveCustomButton1 显示第一个自定义按钮
HaveCustomButton2 显示第二个自定义按钮
HaveCustomButton3 显示第三个自定义按钮
NoCancelButtonOnLastPage 尾页不显示cancel按钮

3、wizardStyle

该属性表示导航的风格。

1、默认情况下,QWizard在启用alpha合成的Windows Vista系统上使用AeroStyle,不管当前的小部件样式如何。

2、上述调节不满足则默认的向导样式取决于当前小部件的样式,如果当前小部件的样式是QMacStyle,则默认为MacStyle,如果当前小部件的样式是QWindowsStyle,则默认为ModernStyle。

3、上面两点都不满足则默认为ClassicStyle。

4、如果需要全部平台都一样的风格,则使用setWizardStyle修改默认风格。

cpp 复制代码
QWizard::WizardStyle wizardStyle() const
void setWizardStyle(QWizard::WizardStyle style)

4、startId

该属性表示显示第一页的id,如果没有设置,则默认则最低页的id。

cpp 复制代码
int startId() const
void setStartId(int id)

5、subTitleFormat

该属性表示二级标题的问题格式,默认为AutoText 。如果已知内容格式,可以设置为纯文本PlainText 或者富文本RichText

cpp 复制代码
Qt::TextFormat subTitleFormat() const
void setSubTitleFormat(Qt::TextFormat format)

6、titleFormat

该属性表示标题的问题格式,默认为AutoText 。如果已知内容格式,可以设置为纯文本PlainText 或者富文本RichText

cpp 复制代码
Qt::TextFormat titleFormat() const
void setTitleFormat(Qt::TextFormat format)

4、公共方法

1)addPage

将给定的页面添加到向导中,并返回该页的ID。

cpp 复制代码
int addPage(QWizardPage *page)

2)setPage

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

cpp 复制代码
void setPage(int id, QWizardPage *page)

3)page

返回给定id的页面指针,如果id不存在,则返回空指针。

cpp 复制代码
QWizardPage *page(int id) const

4)removePage

移除给定id的页面。

cpp 复制代码
void removePage(int id)

5)pageIds

返回全部页面的id集合。

cpp 复制代码
QList<int> pageIds() const

6)currentPage

返回当前显示的页面。

cpp 复制代码
QWizardPage *currentPage() const

7)hasVisitedPage

返回给定id的页面是否已经显示过了。

cpp 复制代码
bool hasVisitedPage(int id) const

8)button

返回导航按钮。

cpp 复制代码
QAbstractButton *button(QWizard::WizardButton which) const

9)setButton

设置导航按钮。

cpp 复制代码
void setButton(QWizard::WizardButton which, QAbstractButton *button)
enum QWizard::WizardButton 描述
BackButton Back按钮,在macOS系统显示为Go Back
NextButton Next按钮,在macOS系统显示为Continue
CommitButton Commit按钮
FinishButton Finish按钮,在macOS系统显示为Done
CancelButton Cancel按钮
HelpButton Help按钮
CustomButton1 第一个自定义按钮
CustomButton2 第二个自定义按钮
CustomButton3 第三个自定义按钮

10)buttonText

返回某按钮的文本。

cpp 复制代码
QString buttonText(QWizard::WizardButton which) const

11)setButtonText

设置某按钮的文本。

cpp 复制代码
void setButtonText(QWizard::WizardButton which, const QString &text)

12)setButtonLayout

设置按钮显示到llayout的顺序,layout是一个WizardButtons列表。默认布局取决于所设置的选项(例如,是否HelpButtonOnRight)。如果您需要对按钮布局进行比现有选项更多的控制,可以调用此函数。可以使用Stretch在布局中指定水平拉伸。

cpp 复制代码
void setButtonLayout(const QList<QWizard::WizardButton> &layout)
cpp 复制代码
MyWizard::MyWizard(QWidget *parent)
     : QWizard(parent)
{
     QList<QWizard::WizardButton> layout;
     layout << QWizard::Stretch << QWizard::BackButton << QWizard::CancelButton
            << QWizard::NextButton << QWizard::FinishButton;
     setButtonLayout(layout);
}

13)pixmap

返回指定导航图像的图像格式。

cpp 复制代码
QPixmap pixmap(QWizard::WizardPixmap which) const

14)setPixmap

设置指定导航图像的图像格式。

cpp 复制代码
void setPixmap(QWizard::WizardPixmap which, const QPixmap &pixmap)
QWizard::WizardPixmap 描述
WatermarkPixmap 位于ClassicStyl或ModernStyle风格页面左侧的高像素图
LogoPixmap 位于ClassicStyl或ModernStyle风格页面标题右侧的小像素图
BannerPixmap 占据ModernStyle风格页面标题背景的像素图
BackgroundPixmap 占用MacStyle向导背景的像素图

15)sideWidget

返回侧边小部件指针。

cpp 复制代码
QWidget *sideWidget() const

16)setPixmap

设置侧边小部件。对于使用WatermarkPixmap (ClassicStyle和ModernStyle)的样式,侧边小部件显示在水印的顶部,对于其他样式或当水印没有提供时,侧边小部件显示在向导的左侧。

cpp 复制代码
void setSideWidget(QWidget *widget)

5、公共槽函数

1)back

回到前一页,这相当于按下后退按钮。

cpp 复制代码
void back()

2)next

跳转到下一页,这相当于按下Next或Commit按钮。

cpp 复制代码
void next()

3)restart

在起始页重新启动向导,在显示向导时自动调用此函数。

cpp 复制代码
void restart()

6、信号

1)currentIdChanged

这个信号在当前页发生变化时发出,带有新的当前id。

cpp 复制代码
void currentIdChanged(int id)

2)customButtonClicked

当用户单击自定义按钮时发出该信号。

cpp 复制代码
void customButtonClicked(int which)

3)helpRequested

当用户单击Help按钮时发出此信号。

cpp 复制代码
void helpRequested()

4)pageAdded

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

cpp 复制代码
void pageAdded(int id)

5)pageRemoved

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

cpp 复制代码
void pageRemoved(int id)
相关推荐
烦躁的大鼻嘎7 分钟前
模拟算法实例讲解:从理论到实践的编程之旅
数据结构·c++·算法·leetcode
IU宝11 分钟前
C/C++内存管理
java·c语言·c++
fhvyxyci12 分钟前
【C++之STL】摸清 string 的模拟实现(下)
开发语言·c++·string
C++忠实粉丝24 分钟前
计算机网络socket编程(4)_TCP socket API 详解
网络·数据结构·c++·网络协议·tcp/ip·计算机网络·算法
古月居GYH35 分钟前
在C++上实现反射用法
java·开发语言·c++
Betty’s Sweet38 分钟前
[C++]:IO流
c++·文件·fstream·sstream·iostream
敲上瘾1 小时前
操作系统的理解
linux·运维·服务器·c++·大模型·操作系统·aigc
不会写代码的ys1 小时前
【类与对象】--对象之舞,类之华章,共绘C++之美
c++
兵哥工控1 小时前
MFC工控项目实例三十二模拟量校正值添加修改删除
c++·mfc
长弓聊编程1 小时前
Linux系统使用valgrind分析C++程序内存资源使用情况
linux·c++