Как отключить следующую кнопку в QWizard

Что я пытаюсь сделать

Я пытаюсь создать подкласс QWizardPage, который выглядит примерно так, но имеет небольшую настройку. Я хочу отключить следующую кнопку, когда переменная счетчика больше 0. (Она не может быть 0 с самого начала из-за некоторых функций, которые требуют, чтобы она переходила 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();
  }
}

Результаты на данный момент

Из пошагового кода я вижу, что следующая кнопка отключена при загрузке страницы. Но затем он снова включается из-за этих 2 строк в QWizardPrivate (взято из qwizard.cpp)

 bool complete = page && page->isComplete();
 btn.next->setEnabled(canContinue && complete);

Я весьма озадачен тем, почему isComplete() возвращает true здесь. Я имею в виду, что я установил свой счетчик на 2 в начале и никогда не уменьшал его. (И да, я испускаю completeChanged() всякий раз, когда устанавливаю счетчик).

Любые идеи?


person Arnab Datta    schedule 17.07.2013    source источник


Ответы (1)


QWizard автоматически управляет состоянием кнопки Next на основе QWizardPage::isComplete(), вам не следует реализовывать эту функциональность самостоятельно в initializePage(). Причина, по которой ваш isComplete() не вызывается, заключается в том, что он фактически не перезаписывает QWizardPage::isComplete const из QWizardPage. Объявите свою функцию const, и она правильно перезапишет исходную функцию.

person Foobar    schedule 17.07.2013