在QWizard中对 Next(Finish)按键的控制

来源:互联网 发布:跳舞毯软件免费下载 编辑:程序博客网 时间:2024/05/17 02:25

在QWizard中,需要对向导结束之后的动作进行控制,于是想定义一下 Finish 按键的clicked() 槽,居然没有找见。

我在设计界面的时候使用的是Qt Designer, 生成下一个向导页是自带三个按键(back、next和cancel)的,甚至没有生成自己的QWizardPage子类,

 —在自己定义的myQWizard中,是没有定义这三个按键的。

 —于是去找对应的 "ui_myqwizard.h" 文件,其中使用到了QWizardPage生成指定的向导页,但是没有三个按键的定义,奇了个怪了,继续!

 —使用了Qt的帮助文档,调出了“QWizardPage Class Reference”,仔细查找了两遍,居然还是没有。


最终在QWizard中发现了以下定义:

enum QWizard::WizardButton 

------------------------------------------------------------------------------------------------------------------------------------

Constant ValueDescription

QWizard::BackButton 0The Back button (Go Back on Mac OS X)
QWizard::NextButton 1The Next button (Continue on Mac OS X)
QWizard::CommitButton 2The Commit button
QWizard::FinishButton 3The Finish button (Done on Mac OS X)
QWizard::CancelButton 4The Cancel button (see also NoCancelButton)
QWizard::HelpButton 5The Help button (see also HaveHelpButton)
QWizard::CustomButton1 6The first user-defined button (see also HaveCustomButton1)
QWizard::CustomButton2 7The second user-defined button (see also HaveCustomButton2)
QWizard::CustomButton3 8The third user-defined button (see also HaveCustomButton3)

-------------------------------------------------------------------------------------------------------------------------------------

应该是通过枚举值可以直接对按键进行操作,但是对于其行为如clicked()等的定义,被限制了。

这样可以保证Qt自己的向导机制不被破坏吧,毕竟定义了按键行为的人,不可能全部都负责人的实现其默认的功能。


另外,有以下收获:

void QWizardPage::registerField ( const QString & name, QWidget * widget, const char * property = 0, const char * changedSignal = 0 )    [protected]

根据 给定组件(参数"widget")的给定属性(参数"property") 生成一个 以参数”name“命名 的 field,以后就可以使用 函数field() 和 setField() 来操作这一属性了。

这一特性是针对 【指定的组件】,需要组件的名称,本来嘛,这个功能 是针对 在向导页的用户交互内容所涉及的组件,特别是可以使用以"*"作为 name的结束,

指定 该 field 是必填内容,通过设置 Next(Finish)按键的可用和不可用来实现对用户输入内容的检查。这不是我们想要的功能。


bool QWizardPage::validatePage ()   [virtual]
这是一个可以被覆盖的虚函数,当用户点击Next(Finish)按键时,被 QWizard::validateCurrentPage() 调用,实现."last-minute validation"(临终检查...#_#)。如果返回值为true,则显示下一页(或者想到结束),否则驻停在当前页。默认实现返回true。相对于覆盖validatePage()函数, 尽可能通过Next(Finish)按键不可用来实现控制 是更好的风格。 


最终的解决方案有如下:


在自定义类myWizard中重实现QWizard中的虚函数 :bool QWizardPage::validatePage ()   [virtual] 


bool myWizard::validateCurrentPage (){    if(-1 == currentPage()->nextId())    {        Controller *pThectler = Controller::getInstance();        pThectler->subStractCTP();    };    return true;}