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.mzph.cn/news/73205.shtml

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

相关文章

安全运营中心(SOC)技术框架

2018年曾经画过一个安全运营体系框架&#xff0c;基本思路是在基础单点技术防护体系基础上&#xff0c;围绕着动态防御、深度分析、实时检测&#xff0c;建立安全运营大数据分析平台&#xff0c;可以算作是解决方案产品的思路。 依据这个体系框架&#xff0c;当时写了《基于主动…

Emgu调用摄像头

1&#xff0c;安装EMgu 2,调用摄像头 public FaceLoad(){InitializeComponent();try{capture new Capture();capture.Start();//摄像头开始工作capture.ImageGrabbed frameProcess;//实时获取图像}catch (NullReferenceException excpt){//MessageBox.Show(excpt.Message);}}…

Apache Doris 2.0.1 1.2.7 版本正式发布!

亲爱的社区小伙伴们&#xff0c;我们很高兴的宣布&#xff0c;2023 年 9 月 4 日 我们正式发布了 Apache Doris 2.0.1 和 Apache Doris 1.2.7 这两个版本&#xff0c;这两个版本由上百名位贡献者共同努力完成的&#xff0c;提供了更多有用的新特性&#xff0c;同时修复了若干已…

[docker]笔记-portainer的使用

1、安装完成后输入ip加端口号打开网页&#xff0c;并再相应位置输入初始密码&#xff0c;初始密码自行设置。 2、进入主页后可以看到如下图标&#xff1a; 3、选择docker环境&#xff0c;即可展示目前docker信息 可以看到目前有1个容器&#xff0c;3个卷和4个镜像&#xff0c…

Android获取 H264视频流中的SPS和PPS

代码其实很简单&#xff0c;主要是要知道H264帧数据结构。分析H264码流结构的文章一大把&#xff0c;自己网上搜索一下就知道了。 背景&#xff1a; h264aac封装mp4格式的时候&#xff0c;需要获取视频流的sps,pps。 封装mp4文件格式的大体方案 使用 MediaExtractor 和 Medi…

RT-Thread UART

UART 简介 UART&#xff08;Universal Asynchronous Receiver/Transmitter&#xff09;通用异步收发传输器&#xff0c;UART 作为异步串口通信协议的一种&#xff0c;工作原理是将传输数据的每个字符一位接一位地传输。是在应用程序开发过程中使用频率最高的数据总线。 UART …

【已解决】uniapp使用vant-ui中的tab标签页的时候,发现底下红色的切换线不见了

问题截图 解决办法 按F12查看vant-ui源码你会发现他的Tab标签页里面有个width&#xff0c;但是我们引入到uniapp之后发现width没有了&#xff08;不知道什么情况&#xff0c;可能是兼容问题吧&#xff09; 所以我们解决的办法&#xff0c;只需要在App.vue中给全局.van-tabs__l…

ARM+Codesys标准通用型控制器

整机工业级设计&#xff0c;通讯外设经过隔离保护 电源宽电压设计(9~36V DC ) 丰富的通讯接口&#xff0c;满足多种场合控制和通讯需求 四核工业级处理器&#xff0c;高性能&#xff0c;低功耗&#xff0c;高可靠性 机身无风扇设计&#xff0c;外壳小巧 搭载内核 100% 自主…

数学建模之圈养湖羊的空间利用率

数学建模之圈养湖羊的空间利用率 D题最新最全思路已出&#xff0c;欢迎后台私信咨询~~~~ 1.问题&#xff1a; 规模化的圈养养殖场通常根据牲畜的性别和生长阶段分群饲养&#xff0c;适应不同种类、不同阶段的牲畜对空间的不同要求&#xff0c;以保障牲畜安全和健康&#xff…

掌动智能国产化测试工具的重要性与优势

在信息技术领域的快速发展下&#xff0c;对于软件和硬件产品的质量和性能要求也日益提高。同时针对信创要求&#xff0c;国产化测试工具在这个过程中发挥着重要的作用&#xff0c;不仅能够提升产品的可靠性和稳定性&#xff0c;还能够降低测试成本和提高测试效率。作为国内领先…

蓝桥杯官网练习题(三角回文数)

问题描述 对于正整数 n, 如果存在正整数 k 使得n123⋯k(k(k1)/2)​, 则 n 称为三角数。例如, 66066 是一个三角数, 因为 66066123⋯363 。 如果一个整数从左到右读出所有数位上的数字, 与从右到左读出所有数位 上的数字是一样的, 则称这个数为回文数。例如, 66066 是一个回文…

2023高教社杯 国赛数学建模A题思路 - 定日镜场的优化设计

1 赛题 A 题 定日镜场的优化设计 构建以新能源为主体的新型电力系统&#xff0c; 是我国实现“碳达峰”“碳中和”目标的一项重要 措施。塔式太阳能光热发电是一种低碳环保的新型清洁能源技术[1]。 定日镜是塔式太阳能光热发电站(以下简称塔式电站)收集太阳能的基本组件&…

Windows如何设置终端代理?

说明&#xff1a;仅供学习使用&#xff0c;请勿用于非法用途&#xff0c;若有侵权&#xff0c;请联系博主删除 作者&#xff1a;zhu6201976 一、需求 由于Great Firewall of China&#xff0c;可能有些时候对我们探索科研世界增加了一些障碍。比如&#xff0c;我们经常需要通过…

常见项目管理中npm包操作总结

前言 我们在日常工作中&#xff0c;可能需要下载包、创建包、发布包等等。本篇推文将记录日常项目中关于npm包的操作。 引用包 npm仓库公开的包我们都可以通过npm install的命令进行引用下载。 而我们开发的业务公共组件需要在公司内部项目公共引用&#xff0c;而不希望公开为外…

使用 System.exit() 来优雅地终止 Spring Boot 项目

&#x1f60a; 作者&#xff1a; 一恍过去 &#x1f496; 主页&#xff1a; https://blog.csdn.net/zhuocailing3390 &#x1f38a; 社区&#xff1a; Java技术栈交流 &#x1f389; 主题&#xff1a; 使用 System.exit() 来优雅地终止 Spring Boot 项目 ⏱️ 创作时间&am…

构建普适通用的企业网络安全体系框架

在当今数字化时代&#xff0c;网络安全已成为企业保护信息资产和业务运行的重要任务。恶意攻击、数据泄露、网络病毒等威胁不断演进&#xff0c;给企业和个人带来了巨大风险。为了应对这一挑战&#xff0c;许多企业已经采取了一系列网络安全措施&#xff0c;如制定了网络安全政…

k8s service的一些特性

文章目录 Service分发负载的策略同一端口通过不同协议暴露Headless Service的负载分发策略 Service分发负载的策略 大家都知道&#xff0c;一个service可以对应多个pod&#xff0c;那么一定要有一些方法来把service接收到的请求&#xff08;负载&#xff09;转发到pod上。 一般…

CMU15445 fall 2022/spring 2023 项目环境搭建+选择合适的版本

前言 CMU15445是一门关于数据库管理系统&#xff08;DBMS&#xff09;的设计和实现的优秀课程。由数据库领域大佬Andy主讲&#xff0c;同时还有迟策大佬所设计和维护的BusTub&#xff0c;其名声在外之处更是有着极高质量的作业&#xff08;HOMEWORKS&#xff09;和项目&#x…

nodepad++ txt 转 csv

要将 Notepad 中的文本文件转换为 CSV 文件&#xff0c;您可以按照以下步骤操作&#xff1a; 打开 Notepad。打开您想要转换的文本文件。将文本文件的内容格式化为 CSV 格式。您可以使用逗号 (,) 分隔每个字段&#xff0c;并使用换行符 (\n) 分隔每行。保存文件并将其命名为以…

Java ArrayList扩容机制

来分析一下远吗吧 // 单个元素添加 public boolean add(E e) {modCount;add(e, elementData, size);return true;}// 批量add public boolean addAll(Collection<? extends E> c) {Object[] a c.toArray();modCount;int numNew a.length;if (numNew 0)return false;…