[SOLVED] динамическое поведение QWizard



  • Возникла надобность в средстве создания файла определенного типа по известному алгоритму типа вопрос-ответ. Решил для этой цели использовать компонент мастера QWizard. Основная идея состоит в том, что количество и тип показываемых страниц мастера на следующем этапе должны зависеть от значений, введенных на данном этапе. Принять решение, показывать ли следующую страницу и какую, требуется по нажатию кнопки "Далее". Однако, вот тут и возникла проблема. Прямого сигнала от нажатия этой кнопки я не нашел, использовал косвенные методы (перекрытие nextId(), перекрытие cleanupPage(), перекрытие initializePage(), использование сигнала currentIdChanged).
    Составил карту событий, происходящих по нажатию кнопки "Далее", она выглядит следующим образом:

    1. вызов метода nextId()
    2. вызов метода initializePage()
    3. вызов метода nextId()
    4. вызов метода nextId()
    5. отсылка сигнала currentIdChanged

    Отсюда вытекают следующие вопросы:

    1. Зачем три раза вызывается метод nextId()?
    2. Как я понял, первый вызов nextId() должен возвращать номер страницы для подготовки ее функцией initializePage(). Поэтому мои проверки необходимо сделать ДО первого вызова nextId(). Как это сделать?
    3. Может быть все-таки есть способ отловить непосредственно нажатие кнопки "Далее"?
    4. Возможно ли вообще реализовать мою задумку с помощью компонента QWizard?


  • Посмотрите пример "License Wizard Example":http://qt-project.org/doc/qt-5/qtwidgets-dialogs-licensewizard-example.html

    Первый вызов для проверки если это не последняя страница.
    Возврат -1 превращает Next в Finish.

    По третьему вызвову происходит проверка на условия и переход на следующую страницу,



  • К сожалению, судя по ответу, вы не поняли, что мне нужно. Поясню более подробно:

    а) Существует 4 варианта страниц мастера
    б) На странице 1 мастера есть поле ввода числа.
    в) После нажатия кнопки "Далее" показывается страница 2 где тоже есть поле ввода числа
    г) После нажатия кнопки "Далее" показывается страница 3 столько раз, сколько было указано на странице 2
    д) Далее повторяются пункты В и Г столько раз, сколько было указано на странице 1
    е) Самой последней показывается страница 4, после чего мастер завершает работу

    Проблема: в пунктах Б и В необходимо проверять правильность ввода числа в поле. К сожалению, мне удается отловить событие смены страницы только ПОСЛЕ того, как страница поменяется. А нужно как раз ДО этого момента, то есть фактически момент нажатия кнопки "Далее"



  • Ок теперь стало понятней. Надо подумать.
    Пока по поводу проверки в Б и В. Может быть использовать "QValidator":http://qt-project.org/doc/qt-5/qvalidator.html



  • [quote author="tankist" date="1396200120"]
    г) После нажатия кнопки "Далее" показывается страница 3 столько раз, сколько было указано на странице 2
    [/quote]

    Страница 3 показывается и потом просто повторяется после каждого нажатия Далее на странице 3 до тех пора счётчик со второй страницы больше нуля. Когда счётчик на второй странице ноль, то проверяем счётчик на первой странице и возвращаемся на вторую или идём на чертвёртую. Это так должно работать?



  • andreyc, вроде бы ваш вариант похож на правду. На всякий случай привожу пример графического алгоритма работы мастера:
    !http://i60.fastpic.ru/big/2014/0331/ac/a56e11406e94d622fb4dc1c6d54357ac.png(пример алгоритма работы мастера)!
    В квадратах - номер типа страницы. Стрелками обозначены переходы по нажатию кнопки "Далее"



  • Похоже что QWizard не позволяет оставаться на той же странице по нажатию "Далее".

    Это можно обойти если создавать и добавлять страницы динамически.
    Например в PageThree::initializePage() брать число из PageTwo и добавлять новые объекты типа PageTree.

    Так же можно добавить ещё одну кнопку и позволять нажимать только на неё и после того как счётчик обнулится разрешить "Далее" с помощью QWizardPage::isComplete().

    Или сделать свой аналог QWizard с повторами и прочим. :-)



  • Здравствуйте,

    в своём текущем проекте тоже приходится много работать с мастерами. Через creator не всё бывает удобно, но вполне сносно.

    Я вижу следующее решение вашей задачи следующим:

    Шаг 1.
    Допустим, первая страница у нас называется Intro. Мы перегружаем у неё виртуальный метод validatePage (он вызывается после каждого нажатия на "Далее" и говорит о том, можно ли перейти к следующей странице). В нём мы создаём сигнал, который отправляет в Wizard информацию о том, сколько одинаковых страниц нам нужно.

    Шаг 2.
    Создаём отдельный класс wizardPage для тех многократно повторяемых страниц. В нём создаём публичный слот или метод (тут как кому нравится), который бы принимал значение для nextId. В перегрузке nextId пишем return (полученное значение).

    Шаг 3.
    В классе повторяющейся страницы создаём метод gatherInformation и сигнал sendData в validatePage, чтобы собрать информацию со страницы и передать в wizard.

    Шаг 4.
    В wizard по сигналу из Intro делаем
    @ourWizardPage *tmpPage = new ourWizardPage();
    int newID = this->addPage(tmpPage);
    listOfSuchPages.append(tmpPage);//QList<ouqWizardPage> listOfSuchPages - удобен для доступа к страницам
    //прописываем коннект к сигналу от этой страницы@
    Затем этот Id на первом шаге отправляем в intro.
    На всех остальных шагах на предыдущую добавленную страницу.
    Не забываем, что в последнюю страницу нужно передать либо -1, если она является последней страницей всего мастера, либо id следующей страницы.

    Шаг 5.
    Пишем обработчик сигнала с данными из нашего класса страницы.

    Шаг 6.
    Перегружаем wizard::accepted. Наводим последний лоск)



  • Перекрытие метода validateCurrentPage() - это то, что нужно. Всем спасибо!


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.