2

我正在尝试做的事情

我正在尝试创建一个看起来有点像这样的 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()(是的,每当我设置计数器时,我都会发出 a )。

有任何想法吗?

4

1 回答 1

2

QWizard 根据 QWizardPage::isComplete() 自动管理 Next 按钮的状态,您不应该在 initializePage() 中自己实现该功能。你的 isComplete() 没有被调用的原因是它实际上并没有从 QWizardPage 覆盖 QWizardPage::isComplete const。声明您的函数const,它将正确覆盖原始函数。

于 2013-07-17T09:05:32.240 回答