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

一、前言

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

        对话框窗口 QDialog

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

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

#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支持一个“字段”机制,允许您在页面上注册一个字段,并从任何页面访问其值。还可以指定强制字段(即,在用户进入下一页之前必须填充的字段),下面是一个注册字段的例子。

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后面的星号(*)表示必填字段

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

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。

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

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

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()方法。

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。

int currentId() const

2、options

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

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按钮
DisabledBackButtonOnLastPageBack按钮在尾页显示为不可触发
HaveNextButtonOnLastPageNext按钮在尾页显示为不可触发
HaveFinishButtonOnEarlyPagesFinish按钮在尾页显示为不可触发
NoCancelButton不显示Cancel按钮
CancelButtonOnLeft把Cancel按钮放在Back左边
HaveHelpButton显示Help按钮
HelpButtonOnRightHelp按钮放在最右边
HaveCustomButton1显示第一个自定义按钮
HaveCustomButton2显示第二个自定义按钮
HaveCustomButton3显示第三个自定义按钮
NoCancelButtonOnLastPage尾页不显示cancel按钮

3、wizardStyle

        该属性表示导航的风格。

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

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

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

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

QWizard::WizardStyle wizardStyle() const
void setWizardStyle(QWizard::WizardStyle style)

4、startId

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

int startId() const
void setStartId(int id)

5、subTitleFormat

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

Qt::TextFormat subTitleFormat() const
void setSubTitleFormat(Qt::TextFormat format)

6、titleFormat

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

Qt::TextFormat titleFormat() const
void setTitleFormat(Qt::TextFormat format)

4、公共方法

1)addPage

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

int addPage(QWizardPage *page)

2)setPage

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

void setPage(int id, QWizardPage *page)

3)page

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

QWizardPage *page(int id) const

4)removePage

        移除给定id的页面。

void removePage(int id)

5)pageIds

        返回全部页面的id集合。

QList<int> pageIds() const

6)currentPage

        返回当前显示的页面。

QWizardPage *currentPage() const

 7)hasVisitedPage

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

bool hasVisitedPage(int id) const

8)button

        返回导航按钮。

QAbstractButton *button(QWizard::WizardButton which) const

9)setButton

        设置导航按钮。

void setButton(QWizard::WizardButton which, QAbstractButton *button)
enum QWizard::WizardButton描述
BackButtonBack按钮,在macOS系统显示为Go Back
NextButtonNext按钮,在macOS系统显示为Continue
CommitButtonCommit按钮
FinishButtonFinish按钮,在macOS系统显示为Done
CancelButtonCancel按钮
HelpButtonHelp按钮
CustomButton1第一个自定义按钮
CustomButton2第二个自定义按钮
CustomButton3第三个自定义按钮

10)buttonText

        返回某按钮的文本。

QString buttonText(QWizard::WizardButton which) const

11)setButtonText

        设置某按钮的文本。

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

12)setButtonLayout

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

void setButtonLayout(const QList<QWizard::WizardButton> &layout)
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

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

QPixmap pixmap(QWizard::WizardPixmap which) const

14)setPixmap

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

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

15)sideWidget

        返回侧边小部件指针。

QWidget *sideWidget() const

16)setPixmap

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

void setSideWidget(QWidget *widget)

5、公共槽函数

1)back

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

void back()

2)next

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

void next()

3)restart

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

void restart()

6、信号

1)currentIdChanged

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

void currentIdChanged(int id)

 2)customButtonClicked

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

void customButtonClicked(int which)

 3)helpRequested

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

void helpRequested()

 4)pageAdded

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

void pageAdded(int id)

 5)pageRemoved

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

void pageRemoved(int id)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/127680.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

界面控件DevExpress WPF(v23.2)下半年发展路线图

本文主要概述了DevExpress官方在下半年&#xff08;v23.2&#xff09;中一些与DevExpress WPF相关的开发计划。 通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 DevExpress …

一起学数据结构(5)——栈和队列

1. 栈的相关定义及特点&#xff1a; 1. 栈的相关定义&#xff1a; 在正式介绍栈的定义之前&#xff0c;首先来回顾一下关于线性表的定义&#xff1a; 线性表是具有相同数据类型的个数据元素的有限序列&#xff0c;其中为表长。当时&#xff0c;可以把线性表看作一个空表&…

SwiftUI 内功加持:“曳光弹“实现自定义样式进度条(ProgressView)

概览 虽然 SwiftUI 已为我们内置了很多常用视图&#xff0c;不过有时我们还是需要根据实际来进一步美化显示或增加功能。 如上图所示&#xff0c;在本篇博文中我们将结合敏捷哲学中一个超级实用的开发技巧&#xff1a;曳光弹&#xff0c;来一步一个脚印循序渐进的实现 Progres…

redisson分布式锁

RLock官网解释 基于Redis的Java分布式可重入锁对象&#xff0c;实现了锁接口。 如果获得锁的Redisson实例崩溃&#xff0c;那么这种锁可能永远挂起在获得状态。为了避免这种情况&#xff0c;Redisson维护了锁看门狗&#xff0c;它在锁持有者Redisson实例活着的时候延长锁过期时…

逻辑回归(Logistic Regression)

1.分类问题 在分类问题中&#xff0c;你要预测的变量 y是离散的值&#xff0c;我们将学习一种叫做逻辑回归 (Logistic Regression) 的算法&#xff0c;这是目前最流行使用最广泛的一种学习算法。 在分类问题中&#xff0c;我们尝试预测的是结果是否属于某一个类&#xff08;例…

MultipartFile是什么

Multipart是一种file的类型 在我们进行文件上传时所发出的请求&#xff0c;我们页面对请求格式有明确的要求: 1.post提交表单方式 2.编码格式enctype必须是muitipart/form-data&#xff0c;这种格式适合传输数据量大的二进制数据文件 3.类型必须是file类 流程举例&#xf…

软件测试报告有什么用?

报告类型 不同的报告类型有不同的报告用途&#xff0c;以下分类别进行分析 1、登记测试报告 可以用于软件产品的增值税即征即退、软件企业的双软评估以及计算机系统集成资质的材料 2、鉴定\确认测试报告 可以用用于政府项目申报、高新认证、项目结题、创新产品认定、各类政…

Excel怎么批量生成文件夹

Excel怎么批量生成文件夹的链接: https://jingyan.baidu.com/article/ea24bc398d9dcb9b63b3312f.html

C 风格文件输入/输出---直接输入/输出---(std::fread)---(std::fwrite)

C 标准库的 C I/O 子集实现 C 风格流输入/输出操作。 <cstdio> 头文件提供通用文件支持并提供有窄和多字节字符输入/输出能力的函数&#xff0c;而 <cwchar>头文件提供有宽字符输入/输出能力的函数。 从直接输入/输出 文件读取 std::fread 从给定输入流 stream …

MMDetection实验记录踩坑记录

AP值始终为0 在实验MMDetection的DAB-DETR模型进行实验时&#xff0c;AP值始终上不去。 可以看到&#xff0c;在第22个epoch时的AP值仅为0.002 因为在此之前已经运行过YOLOX,Faster-RCNN等模型&#xff0c;所以数据集的设置肯定是没有问题的&#xff0c;而博主也只是修改了DAB…

Qt包含文件不存在问题解决 QNetworkAccessManager

这里用到了Qt的网络模块&#xff0c;在.pro中添加了 QT network 但是添加 #include <QNetworkAccessManager> 会报错说找不到&#xff0c;可以通过在项目上右键执行qmake后&#xff0c;直接#include <QNetworkAccessManager>就不会报错了&#xff1a;

java获取jenkins发布版本信息

一.需求&#xff1a; 系统cicd发布时首页需要展示jenkins发布的版本和优化内容 二.思路: 1.jenkins创建用户和秘钥 2.找到对应构建任务信息的api 3.RestTemplate发起http请求 三.实现&#xff1a; 1.创建用户和token 2.查找jenkins API 创建 Job POST http://localhost…

Flask狼书笔记 | 06_电子邮件

文章目录 6 电子邮件6.1 使用Flask-Mail发送6.2 使用事务邮件服务SendGrid6.3 电子邮件进阶6.4 小结 6 电子邮件 Web中&#xff0c;我们常在用户注册账户时发送确认邮件&#xff0c;或是推送信息。邮件必要的字段包含发信方(sender)&#xff0c;收信方(to)&#xff0c;邮件主题…

【vue2第十四章】 插槽(普通插槽、具名插槽、作用域插槽语法)

插槽 插槽是什么&#xff1f; 在 Vue 2 中&#xff0c;插槽&#xff08;slot&#xff09;是一种用于定义组件内部内容分发的机制。它允许你将组件中的一部分内容替换为用户自定义的内容&#xff0c;并在组件内部进行渲染。 通过在组件模板中使用 <slot></slot> 标…

常见IO模型(非常详细)

背景知识 常⽤5中⽹络IO模型 阻塞IO&#xff08;Blocking IO&#xff09;⾮阻塞IO&#xff08;Non-Blocking IO&#xff09;多路复⽤IO&#xff08;IO Multiplexing&#xff09;信号驱动IO&#xff08;Signal Driven IO&#xff09;异步IO&#xff08;Asynchronous IO&#x…

纯css实现奥运五环、3D平移、旋转、扭曲

文章目录 前言效果图htmlcss 前言 1、不是真正的五环&#xff0c;因为通过形变得来。 2、不同电脑显示器的像素不同&#xff0c;显现的效果不同。 3、不推荐使用此方法。 4、主要通过旋转加平移的方式实现。 效果图 html <div class"olympic_rings"><span …

我眼中的《视觉测量技术基础》

为什么会写这篇博客&#xff1a; 首先给大家说几点&#xff1a;看我的自我介绍对于学习这本书没有任何帮助&#xff0c;如果你是为了急切的想找一个视觉测量的解决方案那可以跳过自我介绍往下看或者换一篇博客看看&#xff0c;如果你是刚入门想学习计算机视觉的同学&#xff0…

【HTML/CSS】入门导学篇

本文属于HTML/CSS专栏文章&#xff0c;适合WEB前端开发入门学习&#xff0c;如果有所帮助请一键三连支持&#xff0c;对博主系列文章感兴趣点击下方专栏了解详细。 本文内容出自B站pink老师的前端入门教程&#xff0c;感谢pink老师&#xff01;&#xff01;&#xff01; 视频链…

【C++】封装map和set(红黑树实现)

前言&#xff1a; 前面&#xff0c;我们学习了set和map的用法&#xff0c;这两个容器可以完成查找&#xff0c;排序等操作&#xff0c;后来我们在学习过二叉搜索树的基础上又学习了两种特殊的二叉搜索树——AVL树和红黑树&#xff0c;他们俩可以是效率进一步提高&#xff0c;其…

Spring Security OAuth2 远程命令执行漏洞

文章目录 一、搭建环境二、漏洞验证三、准备payload四、执行payload五、变形payload 一、搭建环境 cd vulhub/spring/CVE-2016-4977/ docker-compose up -d 二、漏洞验证 访问 http://192.168.10.171:8080/oauth/authorize?response_type${233*233}&client_idacme&s…