我要做什么

我正在尝试创建QWizardPage的子类,看起来像这样,但是有一些细微的调整。我想在计数器变量大于0时禁用下一个按钮。(由于某些功能要求它去x..x-1 ... 0,所以从一开始就不能为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()自动管理“下一步”按钮的状态,您不应该自己在initializePage()中实现该功能。未调用isComplete()的原因是它实际上并未覆盖QWizardPage中的QWizardPage::isComplete const 。声明您的函数 const ,它将正确覆盖原始函数。

10-01 16:38