16-窗口、窗口控件、对话框以及相关功能类- 向导对话框QWizard

向导对话框QWizard

向导对话框 QWizard 由多页构成,可以引导客户按步骤完成某项工作

向导对话框在 ModernStyle 风格界面中,对话框的顶部是横幅(banner),横幅中有标题、子标题和logo,左侧是水印区(watermark),底部有一排按钮,右侧是向导页的内容

在MacStyle风格界面中,顶部没有 logo.左侧用背景(background)代替。

与其他对话框不同的是,向导对话框由多页构成,同一时间只能显示其中的一页,单击next按或 Back 按钮可以向后或向前显示其他页。

对话框中的页是向导页WizzrdPage.向导页有自己的布局和控件,向导会为向导页分配从0开始的ID号

向导对话框QWizard 是从QDialog类继承来的,QWizardPage 是从QWidget类继承来的,用QWizard 类和QWizardPage类创建实例对象的方法如下所示:

from PySide6.QtWidgets import QWizard,QWizardPage

QWizard(parent: Union[PySide6.QtWidgets.QWidget,NoneType]=None,flags: PySide6.QtCore.Qt.WindowType=Default(Qt.WindowFlags))-> None
QWizardPage(parent: Union[PySide6.QtWidgets.QWidget,NoneType]=None)-> None
向导对话框QWizard
向导对话框QWizard的说明

向导(在macOS上也称为助手)是一种特殊类型的输入对话框,由一系列页面组成。向导的目的是引导用户一步一步地完成流程。向导对于用户可能难以学习的复杂或不频繁的任务非常有用。
QWizard继承了QDialog并表示一个向导。每个页面都是一个QWizardPage(一个QWidget子类)。要创建自己的向导,可以直接使用这些类,也可以将它们子类化以获得更多控制。

一个微不足道的例子

以下示例说明了如何创建向导页面并将其添加到向导中。有关更高级的示例,请参阅类向导和许可证向导。

createIntroPage = QWizardPage()

    page = QWizardPage()
    page.setTitle("Introduction")
    label = QLabel("This wizard will help you register your copy"()
"of Super Product Two.")
    label.setWordWrap(True)
    layout = QVBoxLayout()
    layout.addWidget(label)
    page.setLayout(layout)
    return page
createRegistrationPage = QWizardPage()...
createConclusionPage = QWizardPage()
createConclusionPage = QWizardPage()...
if __name__ =="__main__":

向导外观

QWizard支持四种向导外观:

  • ClassicStyle
  • ModernStyle
  • MacStyle
  • AeroStyle

您可以使用setWizardStyle()显式地设置要使用的外观(例如,如果您希望在所有平台上使用相同的外观)。

image-20230218203746444

注意:AeroStyle仅在启用alpha合成的Windows Vista系统上有效。当不满足此条件时,使用ModernStyle作为回退。
除了向导样式之外,还有几个选项可以控制向导的外观。这些可以使用setOption()或setOptions()进行设置。例如,HaveHelpButton使QWizard显示帮助按钮以及其他向导按钮。
您甚至可以使用setButtonLayout()将向导按钮的顺序更改为任意顺序,并且最多可以向按钮行添加三个自定义按钮(例如,打印按钮)。这是通过使用CustomButton1、CustomButton2或CustomButton3调用setButton()或setButtonText()来设置按钮,并通过启用HaveCustomButton 1、HaveCustomButton 2或HaveCustomButton3选项来实现的。每当用户单击自定义按钮时,就会发出customButtonClicked()。例如:

wizard().setButtonText(QWizard.CustomButton1,tr("Print"))
wizard().setOption(QWizard.HaveCustomButton1,True)
connect(wizard(),QWizard.customButtonClicked,
        self.printButtonClicked)

向导页面的元素

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

  • 标题。
  • 一个子标题。
  • 一组像素图,根据向导的风格,可以使用也可以不使用:
    • 水印Pixmap(由ClassicStyle和ModernStyle使用)
    • BannerPixmap(由ModernStyle使用)
    • LogoPixmap(ClassicStyle和ModernStyle使用)
    • 背景像素图(由MacStyle使用)

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

../../_images/qtwizard-nonmacpage.png

设置子标题时,QWizard会将其显示在标题中,在这种情况下,它还会使用BannerPixmap和LogoPixmap来装饰标题。WatermarkPixmap显示在标题下方的左侧。在底部,有一排按钮,允许用户在页面中导航。
页面本身(QWizardPage小部件)占据了页眉、水印和按钮行之间的区域。通常,页面是一个QWizardPage,上面安装了QGridLayout,带有标准的子窗口小部件(QLabel s、QLineEdit s等)。
如果向导的样式是MacStyle,则页面看起来完全不同:

qtwizard-macpage.png

MacStyle会忽略水印、横幅和徽标像素图。如果设置了BackgroundPixmap,它将用作向导的背景;否则,将使用默认的"助理"图像。
标题和副标题是通过在各个页面上调用setTitle()和setSubTitle()来设置的。它们可以是纯文本或HTML(请参阅标题格式和子标题格式)。可以使用setPixmap()为整个向导全局设置像素图,也可以使用set皮克斯图()按页面设置。

注册和使用字段

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

def __init__(self,parent):
    super().__init__(parent)...
classNameLabel = QLabel(tr("Class name:"))
classNameLineEdit = QLineEdit()
classNameLabel.setBuddy(classNameLineEdit)
baseClassLabel = QLabel(tr("Base class:"))
baseClassLineEdit = QLineEdit()
baseClassLabel.setBuddy(baseClassLineEdit)
qobjectMacroCheckBox = QCheckBox(tr("Generate Q_OBJECT macro"))registerField("className*",classNameLineEdit)
registerField("baseClass",baseClassLineEdit)
registerField("qobjectMacro",qobjectMacroCheckBox)...

上面的代码注册了三个字段,className、baseClass和qobjectMacro,它们与三个子窗口小部件相关联。className旁边的星号(*)表示一个必填字段。

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

def initializePage(self):

    className = field("className").toString()
    headerLineEdit.setText(className.toLower()+".h")
    implementationLineEdit.setText(className.toLower()+".cpp")
    outputDirLineEdit.setText(QDir.toNativeSeparators(QDir.tempPath()))

在这里,我们调用field()来访问className字段(在ClassInfoPage中定义)的内容,并使用它来初始化OutputFilePage。字段的内容将作为QVariant返回。
当我们使用registerField()创建字段时,我们会传递一个唯一的字段名和一个小部件。我们还可以提供一个Qt属性名称和一个"更改"信号(当属性更改时发出的信号)作为第三和第四参数;然而,对于最常见的Qt小部件,如QLineEdit、QCheckBox和QComboBox,这是不必要的,因为QWizard知道要查找哪些属性。

如果在注册属性时在名称后附加星号(*),则该字段为必填字段。当页面具有必填字段时,只有在填写了所有必填字段后,“下一步"和/或"完成"按钮才会启用。
为了考虑字段"已填充”,QWizard只需检查字段的当前值是否等于原始值(调用initializePage()时的值)。对于QLineEdit和QAbstractSpinBox子类,QWizard还检查hasAcceptableInput()是否返回true,以尊重任何验证器或掩码。
QWizard的强制字段机制是为了方便起见而提供的。一个更强大(但也更麻烦)的替代方案是重新实现isComplete(),并在页面变得完整或不完整时发出completeChanged()信号。
"下一步"和/或"完成"按钮的启用/禁用状态是对用户输入执行验证的一种方式。另一种方法是重新实现validateCurrentPage()(或validatePage()),以执行最后一刻的验证(如果用户输入的信息不完整或无效,则显示错误消息)。如果函数返回true,则显示下一页(或向导结束);否则,当前页面将保持打开状态。

创建线性向导

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

def __init__(self,parent):
    super().__init__(parent)

    addPage(IntroPage())
    addPage(ClassInfoPage())
    addPage(CodeStylePage())
    addPage(OutputFilesPage())
    addPage(ConclusionPage())...

当一个页面即将显示时,QWizard调用initializePage()(它反过来调用initializePage())来用默认值填充页面。默认情况下,此函数不执行任何操作,但可以重新实现它,以基于其他页面的字段初始化页面的内容(请参阅上面的示例)。
如果用户按下Back,则会调用cleanupPage()(这反过来又调用cleanup Page())。默认实现将页面的字段重置为其原始值(调用initializePage()之前的值)。如果您希望"后退"按钮是非破坏性的,并保留用户输入的值,只需启用IndependentPages选项即可。

创建非线性向导

有些向导更为复杂,因为它们允许根据用户提供的信息提供不同的遍历路径。许可证向导示例说明了这一点。它提供了五个向导页面;根据所选择的选项,用户可以访问不同的页面。

img

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

class LicenseWizard(QWizard):            ...
enum { Page_Intro,Page_Evaluate,Page_Register,Page_Details,
       Page_Conclusion }            ...

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

def __init__(self,parent):
    super().__init__(parent)...

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

def nextId(self):
def nextId(self):

    return LicenseWizard.Page_Conclusion
def nextId(self):

    if upgradeKeyLineEdit.text().isEmpty():
        return LicenseWizard.Page_Details
    else:
        return LicenseWizard.Page_Conclusion
def nextId(self):

    return LicenseWizard.Page_Conclusion
def nextId(self):

    return -1

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

def nextId(self):

    switch(currentId()){
    elif ret == Page_Intro:
        if field("intro.evaluate").toBool():
            return Page_Evaluate
        else:
            return Page_Register

    elif ret == Page_Evaluate:
        return Page_Conclusion
    elif ret == Page_Register:
        if field("register.upgradeKey").toString().isEmpty():
            return Page_Details
        else:
            return Page_Conclusion

    elif ret == Page_Details:
        return Page_Conclusion
    elif ret == Page_Conclusion:
    else:
        return -1

要从ID最低的页面以外的另一个页面开始,请调用setStartId()。
要测试页面是否已被访问,请调用hasVisitedPage()。例如:

def initializePage(self):

    licenseText = QString()
    if wizard().hasVisitedPage(LicenseWizard.Page_Evaluate):
        licenseText = tr("<u>Evaluation License Agreement:</u>"
"You can use self software for 30 days and make one"
"backup,but you are not allowed to distribute it.")
     elif wizard().hasVisitedPage(LicenseWizard.Page_Details):
        licenseText = tr("<u>First-Time License Agreement:</u>"
"You can use self software subject to the license"
"you will receive by email.")
    else:
        licenseText = tr("<u>Upgrade License Agreement:</u>"
"This software is licensed under the terms of your"
"current license.")

    bottomLabel.setText(licenseText)
向导对话框QWizard的属性
属性描述访问功能
currentId: int此属性保存当前页面的ID。
无法直接设置此属性。要更改当前页面,请调用next()、back()或restart()。
默认情况下,此属性的值为-1,表示当前未显示任何页面。
currentId()

setCurrentId(id)

Signal currentIdChanged(id)
options: WizardOptions此属性包含影响向导外观的各种选项。
默认情况下,会设置以下选项(具体取决于平台):
Windows:帮助按钮打开右侧。
macOS:NoDefaultButton和NoCancelButton。
X11和QWS(用于嵌入式Linux的Qt):无。
options()

setOptions(options)
startId: int此属性保存第一页的ID。
如果未显式设置此属性,则此属性默认为此向导中的最低页面ID,如果尚未插入页面,则为-1。
startId()

setStartId(id)
subTitleFormat: TextFormat此属性保存页面字幕使用的文本格式。
默认格式为"自动图文集"。
subTitleFormat()

setSubTitleFormat(format)
titleFormat: TextFormat此属性保存页面标题使用的文本格式。
默认格式为"自动图文集"。
titleFormat()

setTitleFormat(format)
wizardStyle: WizardStyle此属性保留向导的外观。
默认情况下,QWizard在启用alpha合成的Windows Vista系统上使用AeroStyle,而不考虑当前的小部件样式。如果不是这种情况,默认的向导样式取决于当前的小部件样式,如下所示:如果当前小部件样式为QMacStyle,则MacStyle为默认样式;如果当前小程序样式为QWindowsStyle,则ModernStyle为默认范围;在所有其他情况下,ClassicStyle为默认。
wizardStyle()

setWizardStyle(style)
向导对话框QWizard的枚举值
  • PySide6.QtCore.Qt.TextFormat

    此枚举用于可以显示纯文本和富文本的小部件,例如QLabel。它用于决定文本字符串应该被解释为一个还是另一个。这通常是通过将其中一个枚举值传递给QTextEdit::setTextFormat()函数来完成的。

    ConstantDescription
    Qt.PlainText文本字符串被解释为纯文本字符串。
    Qt.RichText文本字符串被解释为富文本字符串。有关富文本的定义,请参阅支持的HTML子集。
    Qt.AutoText如果mightBeRichText()返回true,则文本字符串解释为Qt::RichText,否则解释为Qp::PlainText。
    Qt.MarkdownText文本字符串被解释为Markdown格式的文本。此枚举值已添加到问题5.14中。
  • PySide6.QtWidgets.QWizard.WizardStyle

    此枚举指定QWizard支持的不同外观。

    QWizard.WizardStyle描述
    QWizard.ClassicStyle经典Windows外观
    QWizard.ModernStyle现代Windows外观
    QWizard.MacStylemacOS外观
    QWizard.AeroStyleWindows Aero外观
  • PySide6.QtWidgets.QWizard.WizardPixmap

    此枚举指定可以与页面关联的像素图。

    ConstantDescription
    QWizard.WatermarkPixmapClassicStyle或ModernStyle页面左侧的高像素图
    QWizard.LogoPixmapClassicStyle或ModernStyle页眉右侧的小像素图
    QWizard.BannerPixmap占据ModernStyle页眉背景的像素图
    QWizard.BackgroundPixmap占据MacStyle向导背景的像素图
  • PySide6.QtWidgets.QWizard.WizardOption

    (继承enum.Flag)此枚举指定影响向导外观的各种选项。

    QWizard.WizardOption的取值说 明
    QWizard.IndependentPages向导页之间是相互独立的,相互间不传递数据
    QWizard.IgnoreSubTitles不显示子标题
    QWizard.ExtendedWatermarkPixmap将水印图片拓展到窗口边缘
    QWizard.NoDefaultButton不将Next按钮和Finish按钮设置成默认按钮
    QWizard.NoBackButtonOnStartPage在起始页中不显示Back按钮
    QWizard.NoBackButtonOnLastPage在最后页中不显示Back按钮
    QWizard.DisabledBackButtonOnLastPage在最后页中 Back 按钮失效
    QWizard.HaveNextButtonOnLastPage在最后页中显示失效的Next按钮
    QWizard.HaveFinishButtonOnEarlyPages在非最后页中显示失效的 Finish 按钮
    QWizard.NoCancelButton不显示Cancel 按钮
    QWizard.CancelButtonOnLeft将 Cancel 按钮放到 Back 按钮的左边
    QWizard.HaveHelpButton显示 Help 按钮
    QWizard.HelpButtonOnRight将帮助按钮放到右边
    QWizard.HaveCustomButtonl显示用户自定义的第1个按钮
    QWizard.HaveCustomButton2显示用户自定义的第2个按钮
    QWizard.HaveCustomButton3显示用户自定义的第3个按钮
    QWizard.NoCancelButtonOnLastPage在最后页中不显示Cancel 按钮
  • PySide6.QtWidgets.QWizard.WizardButton

    此枚举指定向导中的按钮。

    Qwizard.wizard Button 的取值说 明Qwizard.wizard Button 的取值说 明
    QWizard.BackButton后退按钮(在macOS上返回)QWizard.HelpButton帮助按钮(另请参阅HaveHelpButton)
    QWizard.NextButton下一步按钮(在macOS上继续)QWizard.CustomButtonl第一个用户定义的按钮(另请参阅HaveCustomButton1)
    QWizard.CommitButton"提交"按钮QWizard.CustomButton2第二个用户定义按钮(另请参阅HaveCustomButton2)
    QWizard.FinishButton完成按钮(在macOS上完成)QWizard.CustomButton3第三个用户定义按钮(另请参阅HaveCustomButton3)
    QWizard.CancelButton取消按钮(另请参阅取消按钮)QWizard.Stretch该值仅在调用setButtonLayout()时有用:
    布局中的水平伸缩器
向导对话框QWizard 常用方法
QWizard的方法及参数类型返回值的类型说明
addPage(page: QWizardPage)int添加向导页,并返回D号
setPage(id:int,page: QWizardPage)None用指定的ID号添加向导页
removePage(id: int)None移除ID是int的向导页
currentId()int获取当前向导页的ID号
currentPage()QWizardPage获取当前向导页
basVisitedPage(int)bool获取向导页是否被访问过
[slot]restart()None回到初始页
[slot]back()None显示上一页
[slot]next()None显示下一页
page(id:int)QWizardPage获取指定ID号的向导页
pageIds()ListCint]获取向导页的ID列表
setButton(which: QWizard.WizardButton,button:QAbstractButton)None添加某种用途的按钮
button(QWizard.WizardButton)QAbstractButton获取某种用途的按钮
setButtonLayout(Sequence[QWizard.WizardButton])None设置按钮的布局(相对位置)
setButtonText(QWizard.WizardButton,str)None设置按钮的文本
buttonText(which: QWizard.WizardButton)str获取按钮的文本
setField(name:str,value:Any)None设置字段的值
field(name: str)Any获取字段的值
setOption(QWizard.WizardOption,on=True)None设置向导对话框的选项
options()WizardOptions获取向导对话框的选项
testOption(QWizard.WizardOption)bool测试是否设置了某个选项
setPixmap(which: QWizard.WizardPixmap,pixmap:Union[QPixmap,Qlmage,str])None在对话框的指定区域设置图片
pixmap(which: QWizard.WizardPixmap)QPixmap获取指定位置处的图片
setSideWidget(QWidget)None在向导对话框左侧设置控件
setStartId(id:int)None用指定ID号的向导页作为起始页,默认用ID值最小的页作为起始页
startId()int获取起始页的ID号
setSubTitleFormat(format: Qt.TextFormat)None设置子标题的格式
setTitleFormat(format: Qt.TextFormat)None设置标题的格式
setWizardStyle(style:QWizard.WizardStyle)None设置向导对话框的风格
wizardStyle()WizardStyle获取向导对话框的风格
visitedIds()ListCint]获取访问过的向导页ID列表
cleanupPage(id:int)None清除内容,恢复默认值
initializePage(id:int)None初始化向导页
nextId()int获取下一页的ID号
validateCurrentPage()bool验证当前页的输入是否正确
向导对话框QWizard的信号

向导对话框 QWizard 的信号如表所示:

QWizard的信号说 明
currentIdChanged(ID)当前页发生变化时发送信号,参数是新页的ID
customButtonCIicked(which)单击自定义按钮时发送信号,参数 which 可能是 CustomButtonl、 CustomButton2 或 CustomButton3
helpRequested()单击 Help 按钮时发送信号
pageAdded(ID)添加向导页时发送信号,参数是新页的ID
pageRemoved(ID)移除向导页时发送信号,参数是被移除页的ID
向导页QWizardPage
from PySide6.QtWidgets import QWizardPage

QWizardPage(parent: Union[PySide6.QtWidgets.QWidget,NoneType] = None)-> None
向导页QWizardPage说明

QWizard代表一个向导。每个页面都是一个QWizardPage。当您创建自己的向导时,您可以直接使用QWizardPage,也可以将其子类化以获得更多控制。
页面具有以下属性,这些属性由QWizard呈现:标题、子标题和一组像素图。有关详细信息,请参阅向导页面的元素。将页面添加到向导后(使用addPage()或setPage()),wizard()将返回一个指向关联QWizard对象的指针。
页面提供了五个虚拟函数,这些函数可以重新实现以提供自定义行为:

  • 当用户单击向导的"下一步"按钮时,会调用initializePage()来初始化页面的内容。如果您想从用户在前几页上输入的内容派生页面的默认值,这是要重新实现的函数。
  • 当用户单击向导的"后退"按钮时,会调用cleanupPage()来重置页面的内容。
  • validatePage()在用户单击"下一步"或"完成"时验证页面。如果用户输入的信息不完整或无效,它通常用于显示错误消息。
  • nextId()返回下一页的ID。它在创建非线性向导时很有用,该向导允许根据用户提供的信息提供不同的遍历路径。
  • 调用isComplete()来确定是应启用还是禁用"下一步"和/或"完成"按钮。如果重新实现isComplete(),也要确保在完整状态更改时发出completeChanged()。

通常,向导的"下一步"按钮和"完成"按钮是互斥的。如果isFinalPage()返回true,则Finish可用;否则,Next可用。默认情况下,只有当nextId()返回-1时,isFinalPage()才为true。如果您想同时显示页面的Next和Final(让用户执行"提前完成"),请在该页面上调用setFinalPage(true)。对于支持早期完成的向导,您可能还需要在向导上设置HaveNextButtonOnLastPage和HaveFinishButtonOnEarlyPages选项。
在许多向导中,页面的内容可能会影响后面页面字段的默认值。为了方便页面之间的通信,QWizard支持"字段"机制,允许您在页面上注册字段(例如QLineEdit),并从任何页面访问其值。字段对整个向导来说是全局的,使任何一个页面都可以轻松访问另一个页面存储的信息,而不必将所有逻辑都放在QWizard中,也不必让页面明确地了解彼此。字段是使用registerField()注册的,并且可以随时使用field()和setField()访问。

向导页QWizardPage的属性
属性描述功能访问
subTitle: str此属性保留页面的副标题。
字幕由QWizard显示,位于标题和实际页面之间。字幕是可选的。在ClassicStyle和ModernStyle中,必须使用字幕才能显示标题。在MacStyle中,字幕显示为实际页面上方的文本标签。
根据subTitleFormat属性的值,副标题可以是纯文本或HTML。
默认情况下,此属性包含一个空字符串。
subTitle()

setSubTitle(subTitle)
title: str此属性保留页面的标题。
标题由QWizard显示,位于实际页面上方。所有页面都应该有一个标题。
标题可以是纯文本或HTML,具体取决于titleFormat属性的值。
默认情况下,此属性包含一个空字符串。
title()

setTitle(title)
向导页QWizardPage的常用方法
QWizardPage的方法及参数类型返回值的类型说 明
setButtonText(QWizard.WizardButton,str)None设置某种用途按钮的文字
buttonText(which: QWizard.WizardButton)str获取指定用途的按钮的文本
setCommitPage(commitPage:bool)None设置成提交页
isCommitPage()bool获取是否是提交页
setFinalPage(bool)None设置成最后页
isFinalPage()bool获取是否是最后页
setPixmap(which: QWizard.WizardPixmap,pixmap:QPixmap)None在指定区域设置图片
pixmap(which: QWizard.WizardPixmap)QPixmap获取指定区域的图片
setSubTitle(subTitle:str)None设置子标题
setTitle(title:str)None设置标题
subTitle()str获取子标题
title()Str获取标题
registerField(name: str,widget: QWidget,property: str=None,changedSignal: str=None)None创建字段
setField(name: str,value: Any)None设置字段的值
field(name:str)Any获取字段的值
setDefaultProperty(classNane: str,property: str,changedSignal:str)None设置某类控件的某个属性与某个信号相 关联
validatePage()bool验证向导页中的输入内容
wizard()QWizard获取向导页所在的向导对话框
cleanupPage()None清除页面的内容,恢复默认值
initializePage()None用于初始化向导页
isComplete()bool获取是否完成输人,以便激活Next 按钮或 Finish 按钮
validatePage()bool验证向导页中的内容,若为True则显示下 一页
nextId()int获取下一页的ID号
向导页QWizardPage的信号

向导页 QWizardPage 只有一个信号completeChanged()

每当页面的完整状态(即isComplete()的值)发生变化时,就会发出此信号。
如果重新实现isComplete(),请确保在isComplete的值发生变化时发出completeChanged(),以确保QWizard更新其按钮的启用或禁用状态。

向导对话框QWizar和向导页QWizardPage主要方法介绍
  • 向导对话框属性

    • currentId:int - 当前页面的ID

      无法直接设置此属性。要更改当前页面,请调用next()、back()或restart()。
      默认情况下,此属性的值为-1,表示当前未显示任何页面。

    • options:PySide6.QtWidgets.QWizard.WizardStyle - 影响向导外观的各种选项

      此属性包含影响向导外观的各种选项。枚举值见下
      默认情况下,会设置以下选项(具体取决于平台):

      • Windows: HelpButtonOnRight .
      • macOS: NoDefaultButton and NoCancelButton .
      • X11 and QWS(Qt for Embedded Linux): none.
    • startId:int - 第一页的ID

      此属性保存第一页的ID。
      如果未显式设置此属性,则此属性默认为此向导中的最低页面ID,如果尚未插入页面,则为-1。

    • subTitleFormat:PySide6.QtCore.Qt.TextFormat - 页面字幕使用的文本格式

      此属性保存页面字幕使用的文本格式。TextFormat 枚举值见下方
      默认格式为"AutoText"。

    • titleFormat:PySide6.QtCore.Qt.TextFormat - 页面标题使用的文本格式

      此属性保存页面标题使用的文本格式。TextFormat 枚举值见下方
      默认格式为"AutoText"。

  • 向导对话框的风格

    • 用setWizardStyle(style: QWizard.WizardStyle)方法设置,其中参数 style是QWizard,WizardStyle 的枚举值,可以取:

      QWizard.WizardStyle描述
      QWizard.ClassicStyle经典Windows外观
      QWizard.ModernStyle现代Windows外观
      QWizard.MacStylemacOS外观
      QWizard.AeroStyleWindows Aero外观
  • 添加向导页

    • 用向导对话框的 addPage(page:QWizardPage)方法可以添加向导页,并返回向导页的ID号
    • 也可用setPage(id;int,page:QWizardPage)方法用指定的ID号添加向导页。
  • 向导对话框的标题和子标题

    • 向导页的 setTitle(title; str)方法和 setSubTitle(subTitle: str)方法设置标题和子标题

    • 虽然由向导页设置标题和子标题,但是它们会显示在向导对话框的横幅中。

    • 标题和子标题的格式由向导对话框的setTitleFormat(format:Qt.TextFormat)法和 setSubTitleFormat(format:Qt.TextFormat)方法设置,其中参数 format 的取值是 QtTextFormat 举值可以取:

      PySide6.QtCore.Qt.TextFormat

      此枚举用于可以显示纯文本和富文本的小部件,例如QLabel。它用于决定文本字符串应该被解释为一个还是另一个。这通常是通过将其中一个枚举值传递给QTextEdit::setTextFormat()函数来完成的。

      ConstantDescription
      Qt.PlainText文本字符串被解释为纯文本字符串。
      Qt.RichText文本字符串被解释为富文本字符串。有关富文本的定义,请参阅支持的HTML子集。
      Qt.AutoText如果mightBeRichText()返回true,则文本字符串解释为Qt::RichText,否则解释为Qp::PlainText。
      Qt.MarkdownText文本字符串被解释为Markdown格式的文本。此枚举值已添加到问题5.14中。
  • 向导对话框的选项由 setOption(QWizard,WizardOption,on=True)方法设置中QWizard.WizardOption 参数是枚举类型,其可以取的值如表所示:

    QWizard.WizardOption的取值说 明
    QWizard.IndependentPages向导页之间是相互独立的,相互间不传递数据
    QWizard.IgnoreSubTitles不显示子标题
    QWizard.ExtendedWatermarkPixmap将水印图片拓展到窗口边缘
    QWizard.NoDefaultButton不将Next按钮和Finish按钮设置成默认按钮
    QWizard.NoBackButtonOnStartPage在起始页中不显示Back按钮
    QWizard.NoBackButtonOnLastPage在最后页中不显示Back按钮
    QWizard.DisabledBackButtonOnLastPage在最后页中 Back 按钮失效
    QWizard.HaveNextButtonOnLastPage在最后页中显示失效的Next按钮
    QWizard.HaveFinishButtonOnEarlyPages在非最后页中显示失效的 Finish 按钮
    QWizard.NoCancelButton不显示Cancel 按钮
    QWizard.CancelButtonOnLeft将 Cancel 按钮放到 Back 按钮的左边
    QWizard.HaveHelpButton显示 Help 按钮
    QWizard.HelpButtonOnRight将帮助按钮放到右边
    QWizard.HaveCustomButtonl显示用户自定义的第1个按钮
    QWizard.HaveCustomButton2显示用户自定义的第2个按钮
    QWizard.HaveCustomButton3显示用户自定义的第3个按钮
    QWizard.NoCancelButtonOnLastPage在最后页中不显示Cancel 按钮
  • 显示的图片

    • 向导对话框和向导页都可以用setPixmap(which:QWizard.WizardPixmappixmap:QPixmap)方法设置向导对话框中显示的图片

    • 用向导对话框设置的图片作用于所有页,用向导页设置的图片只作用于向导页所在的页面,其中参 which的取值是QWizard,WizardPixmap 的校举值,用于设置图片放置的位置,可以取:

      PySide6.QtWidgets.QWizard.WizardPixmap此枚举指定可以与页面关联的像素图。

      ConstantDescription
      QWizard.WatermarkPixmapClassicStyle或ModernStyle页面左侧的高像素图
      QWizard.LogoPixmapClassicStyle或ModernStyle页眉右侧的小像素图
      QWizard.BannerPixmap占据ModernStyle页眉背景的像素图
      QWizard.BackgroundPixmap占据MacStyle向导背景的像素图
  • 往对话框中添加按钮

    • 用setButton(which: QWizard,WizardButton,button:QAbstractButton)方法往对话框中添加某种用途的按钮,其中参数 which 的取值是 QWizard.WizardButton的枚举值,用于指定按钮的用途。QWizard.WizardButton 的取值如表所示。

      Qwizard.wizard Button 的取值说 明Qwizard.wizard Button 的取值说 明
      QWizard.BackButtonBack 按钮QWizard.HelpButtonHelp 按钮
      QWizard.NextButtonNext 按钮QWizard.CustomButtonl用户自定义第1个按钮
      QWizard.CommitButtonCommit 按钮QWizard.CustomButton2用户自定义第2个按钮
      QWizard.FinishButtonFinish按钮QWizard.CustomButton3用户自定义第3个按钮
      QWizard.CancelButtonCancel按钮QWizard.Stretch布局中的水平伸缩器
    • 对话框中最多可以添加3个自定义的按钮,要使自定义按钮可见,还需要用setOption()方法把自定义按钮显示出米。通常情况下 Next 按钮和 Finish 按钮是互斥的

  • 提交页

    • 用向导页的 setCommitPage(bool)方法可以把向导页设置成提交页,提交页上用Commit 按钮替换 Next 按钮,且不能用Back 或 Cancel 按钮来撤销。
    • 单击 Commit 按钮后,下一页的 Back 按钮失效。用isCommit()方法可以获取该页是否是提交页
  • 把向导页设置成最后页

    • 用向导页的 setFinalPage(bool)方法可以把向导页设置成最后页,最后页上用Finish 按钮替换 Next 按钮,此时用nextld()方法取下一页的ID 时返回-1
  • 多个向导页之间的数据通信

    • 向导对话框中的多个向导页之间的数据不能自动进行通信

    • 要实现向导页之间的数据传递,可以将向导页上的控件属性定义成字段,并可以将控件属性与某信号关联这样当属性值发生变化时发送信号,也可以通过字段设置或获取控件的属性值,字段对于向导对话框来说是全局性的。字段的定义通过 registerField(name: str,widget:QWidget,property:str=None,changedSignal: str=None)函数来实现,其中

      • name 是字段名称
      • widget 是向导页上的控件
      • property 是字段的属性
      • changedSignal是与字段属性相关的信号。

      定义好字段后,可以利用setField(name:str,value:Any)方法和 field(name:str)方法设置和获取字段的值。

      用setDefaultProperty(className: str,property: str,changedSignal: str)方法可以设置某类控件的某个属性与某个信号相关联。PySide6 对大多数控件能自动将某个属性与某个信号相关联,如表所示。

      控件属性关联的信号
      QAbstractButtoncheckedtoggled(bool)
      QAbstractSlidervaluevalueChanged(int)
      QComboBoxcurrentIndexcurrentIndexChanged(int)
      QDateTimeEditdateTimedateTimeChanged(QDatetime)
      QLLineEdittexttextChanged(str)
      QListWidgetcurrentRowcurrentRowChanged(int)
      QSpinBoxvaluevalueChanged(int)
  • 当isComplete()函数的返回值为 True 时,会激活 Next 按钮或 Finish 按钮

    可以重写该函数,用户在页面上输入信息后,当满足一定条件时改变 isComplete()的返回值,以便激活 Next 按钮或 Finish 按钮。

    如果重写 isComplete()函数,一定要确保completeChange()信号也能发送

  • 用户单击 Next 按钮或 Finish 按后,需要验证页面上输人的内容是否合法

    • 这时会调用向导对话框的 validateCurrentPage()函数和向导页的 validatePage()函数通常需要重写这两个函数以便完成对输人内容的验证,如果返回 True 则显示下一页
  • 单击 Next 按钮后,在显示下一页之前,会调用向导页的 initializePage()函数。可以重写该函数,以便根据前面的向导页的内容初始化本向导页的内容。

  • 单击 Back 按钮后,在显示前一页之前,会调用向导页的 cleanupPage()函数。可以重写该函数,以保证向导页能恢复默认值。

  • 根据 nextId()函数的返回值,决定要显示的下一页,如果没有后续页,则返回-1。单击 next 按钮和 back 按都会调用nextId()函数如果重写该函数会根据已经输入和选择的内容让 nextId()返回相应页的ID号,从而控制页面显示的顺序

向导对话框QWizard 和向导页QWizardPage 的应用实例

下面的程序建立由3个向导页构成的导航对话框,通过单击菜单显示出对话框,用于人学生基本信息、联系方式和考试成绩。

其中第 1个向导页输人姓名和学号,在这个向导页中重写了 isComplete()函数和 validatePage()函数,当姓名和学号中都输人了内容时isComplete()的返回值是True。

这时"下一步"按钮会激活单击"下一步"按钮时,会验学号中输人的内容是否为数字如果是则 validatePage()的返回值是True,显示下一个导航页;

如果不是会弹出警告信息对话框,validatePage()的返回值是 False,不会显示下一个导页。其他向导页也可作类似的处理。在最后一页中单击"完成"按钮,通过字段获取输人的值,并输出到界面上。

image-20230218221901369

import sys
from PySide6.QtWidgets import(QApplication,QWidget,QMenuBar,QPlainTextEdit,QVBoxLayout,QWizard,QWizardPage,QMessageBox,QPushButton,QLineEdit,QFormLayout)


class QWizardPage_1(QWizardPage):  # 第1个向导页类
    def __init__(self,parent=None):
        super().__init__(parent)
        form=QFormLayout(self)
        self.line_name=QLineEdit()
        self.line_number=QLineEdit()
        form.addRow("姓名:",self.line_name)
        form.addRow("学号:",self.line_number)

        self.setTitle("学生成绩输入系统")
        self.setSubTitle("基本信息")

        self.line_name.textChanged.connect(self.isComplete)
        self.line_number.textChanged.connect(self.isComplete)
        self.line_name.textChanged.connect(self.completeChanged_emit)
        self.line_number.textChanged.connect(self.completeChanged_emit)

        self.registerField("name",self.line_name)# 创建字段创建字段#重写isComplete()函数
        self.registerField("number",self.line_number)

    def isComplete(self):  # 重写isComplete()函数
        if self.line_name.text()!=""and self.line_number.text()!="":
            return True
        else:
            return False

    def completeChanged_emit(self):  # 重写isComplete()函数后,需要重新发送信号
        self.completeChanged.emit()

    def validatePage(self):  # 重写validatePage()函数
        if self.line_number.text().isdigit():  # 确保学号中输人的是数字
            return True
        else:
            QMessageBox.warning(self,"警告","输人有误,请检查输人的信息")
            return False


class QWizardPage_2(QWizardPage):  # 第2个向导页类
    def __init__(self,parent=None):
        super().__init__(parent)

        form=QFormLayout(self)
        self.line_telephone=QLineEdit()
        self.line_address=QLineEdit()
        form.addRow("电话:",self.line_telephone)
        form.addRow("地址:",self.line_address)

        self.setTitle("学生成绩输人系统")
        self.setSubTitle("联系方式")
        self.registerField("telephone",self.line_telephone)
        self.registerField("address",self.line_address)


class QWizardPage_3(QWizardPage):
    def __init__(self,parent=None):
        super().__init__(parent)
        form=QFormLayout(self)
        self.line_chinese=QLineEdit()
        self.line_math=QLineEdit()
        self.line_english=QLineEdit()

        form.addRow("语文:",self.line_chinese)
        form.addRow("数学:",self.line_math)
        form.addRow("英语:",self.line_english)

        self.setTitle("学生成绩输入系统")
        self.setSubTitle("考试成绩")

        self.registerField("chinese",self.line_chinese)# 创建字段
        self.registerField("math",self.line_math)# 创建字段
        self.registerField("english",self.line_english)# 创建字段


class QWizard_studentnumber(QWizard):  # 向导对话框

    def __init__(self,parent=None):
        super().__init__(parent)

        self.setWizardStyle(QWizard.WizardStyle.ModernStyle)
        self.addPage(QWizardPage_1(self))# 添加向导页
        self.addPage(QWizardPage_2(self))# 添加向导页
        self.addPage(QWizardPage_3(self))# 添加向导页

        self.btn_back=QPushButton("上一步")
        self.btn_next=QPushButton("下一步")
        self.btn_finish=QPushButton("完成")

        self.setButton(QWizard.WizardButton.BackButton,self.btn_back)# 添加按钮
        self.setButton(QWizard.WizardButton.FinishButton,self.btn_finish)
        self.setButton(QWizard.WizardButton.NextButton,self.btn_next)# 添加按钮

        self.setButtonLayout([self.WizardButton.Stretch,self.WizardButton.BackButton,self.WizardButton.NextButton,self.WizardButton.FinishButton])


class MyWindow(QWidget):
    def __init__(self,parent=None):
        super().__init__(parent)
        self.widget_setupUi()# 建立主界面
        self.wizard=QWizard_studentnumber(self)# 实例化向导对话框
        self.wizard.btn_finish.clicked.connect(self.btn_finish_clicked)# 完成按钮信号与槽的连接

    def widget_setupUi(self):  # 建立主程序界面
        menuBar=QMenuBar(self)# 定义菜单栏
        file_menu=menuBar.addMenu("文件(&F)")# 定义文件菜单
        action_enter=file_menu.addAction("进入")
        action_enter.triggered.connect(self.action_enter_triggered)# 动作的信号与槽函数的连接
        self.plainText=QPlainTextEdit(self)# 显示数据控件

        v=QVBoxLayout(self)# 主界面的布局
        v.addWidget(menuBar)
        v.addWidget(self.plainText)

    def action_enter_triggered(self):
        self.wizard.setStartId(0)
        self.wizard.restart()
        self.wizard.open()

    def btn_finish_clicked(self):  # 单击最后一页的"完成"按钮,输人的数据在plainText中显示
        template="姓名:{}   学号:{}  电话:{}  地址:{}  语文:{}  数学:{}  英语:{}"
        string=template.format(self.wizard.field("name"),self.wizard.field("number"),self.wizard.field("telephone"),self.wizard.field("address"),self.wizard.field("chinese"),self.wizard.field("math"),self.wizard.field("english"))# 获取字段值,格式化输出文本
        self.plainText.appendPlainText(string)


if __name__=='__main__':
    app=QApplication(sys.argv)
    window=MyWindow()
    window.show()
    sys.exit(app.exec())# 动作的槽函数
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

士别三日,当挖目相待

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

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

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

打赏作者

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

抵扣说明:

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

余额充值