2014-02-03 3 views
0

У меня есть подкласс QWizard, созданный мастером формы Qt Creator. Как описано в документах, я повторно выполнил nextId() для проверки ввода и создания нелинейного мастера. Проблема в том, что nextId() вызывается дважды: один раз при входе на страницу и один раз при выходе. Мне нужна простая проверка в последнюю минуту по полям, а затем руководство пользователя через следующую страницу или отображение сообщения об ошибке и сохранение пользователя на текущей странице.Почему QWizard :: nextId() вызывается дважды?

Примечание: Я создал мастера с помощью генератора форм Qt Creator. Страницы включены в файл ui. Поэтому повторная реализация QWizardPage::nextId() не является вариантом.

Update: Вот код:

int WizardBackupDatabase::nextId() const 
{ 
    Page nextPage; 
    Page currentPageType = static_cast<Page>(currentId()); 
    qDebug() << currentId(); // This prints twice 
    switch (currentPageType) { 
    case Page::Intro: 
     nextPage = Page::DataSource; 
     break; 
    case Page::DataSource: 
     if(checkSource()) { 
      nextPage = Page::Settings; 
     } 
     else { 
      nextPage = Page::DataSource; 
     } 
     break; 
    case Page::Settings: 
     if(checkSettings()) { 
      nextPage = Page::Verify; 
     } 
     else { 
      nextPage = Page::Settings; 
     } 
     break; 
    case Page::Verify: 
     nextPage = Page::Operation; 
     break; 
    case Page::Operation: 
     return -1; 
    default: 
     return -1; 
    } 
    return static_cast<int>(nextPage); 
} 

ответ

3

К тому времени nextId называются, вы уже совершили переключение страницы. Просто нет смысла делать какие-либо проверки в этот момент.

На самом деле семантическая ошибка, заключающаяся в том, что реализация nextId выполняет любую проверку или отображает любой пользовательский интерфейс. Его можно назвать столько раз, сколько пожелает реализация, и ваш код должен справиться с этим. Подумайте только, что этот метод эквивалентен. Это метод запросов, отличный от метода size на контейнере.

Чтобы проверить входные данные, вы должны в идеале переопределить isComplete или объявить обязательные поля или переопределить validateCurrentPage.

validateCurrentPage вызывается QWizard::next. Если он возвращает true, то для запроса страницы, на которую требуется переключиться, вызывается nextId, и страницы переключаются. Частный код switchToPage вызывает nextId, чтобы убедиться, что следующая страница не является недопустимой. Это источник двойного звонка, который вы испытываете.

Ваши checkSettings звонки не относятся к nextId. Они принадлежат validateCurrentPage.

Qt исходный код conveniently available через браузер исходного кода woboq. Иногда исходный код лучше, чем любая документация. Если вы считаете, что документация неполна, я уверен, что хорошо выполненный вклад, который исправляет недостаток, будет с радостью принят :)

+0

Не можете найти что-либо, что подсказывает или возвращает ваш ответ в документации. Можете ли вы указать мне на это? – Shoe

+0

Документация @Jefffrey Qt написана определенным образом. Если функция задана для запроса того, что делать дальше, это именно то, что она должна делать, не больше и не меньше. Документация 'validateCurrentPage' точно отражает то, что хочет сделать айзер. –

Смежные вопросы