我要做的事情
我正在尝试创建QWizardPage的一个子类,它看起来有点像这样,但有一个小的调整。当计数器变量大于0时,我想禁用下一个按钮。(从一开始就不能是0,因为有些功能需要它去x.x.x-1…0)。
我尝试过的
在构造函数中重新实现isComplete()并发出completeChanged()
bool DemoWizardPage::isComplete()
{
return ! (counter > 0); //Also tried just return false;
}
重新启用initializePage
并从此处禁用下一个按钮
void DemoWizardPage::initializePage()
{
qDebug() << "QWizardPage:: initialize page";
if (!this->isComplete())
{
qDebug() << "try to turn off next button";
wizard()->button(QWizard::NextButton)->setDisabled(true);
qDebug() << "next button enabled? "
<< wizard()->button(QWizard::NextButton)->isEnabled();
}
}
迄今为止的结果
从代码中我可以看到,当页面加载时,下一个按钮被禁用。但是,由于QWizardPrivate(取自qwizard.cpp)中的这两行,它再次被启用
bool complete = page && page->isComplete();
btn.next->setEnabled(canContinue && complete);
我很困惑为什么isComplete()在这里返回true。我的意思是,我一开始就把计数器设置为2,而且我从不减少它。(是的,每当我设置计数器时,我都会发出completeChanged()
)。
有什么想法吗?
QWizard基于QWizardPage::isComplete()自动管理Next按钮的状态,您不应该在initializePage()中自己实现该功能。没有调用isComplete()的原因是它实际上并没有覆盖QWizardPage中的QWizardPage::isCompleteconst。声明您的函数const,它将正确地覆盖原始函数。