Russian Qt Forum
Апрель 20, 2024, 10:30 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Самодельный визард  (Прочитано 8565 раз)
phpCoder
Гость
« : Январь 27, 2015, 09:54 »

Добрый день.
Делаю свой визард, возникли вопросы:
1. Пользователь ввел свои данные на какой-то странице. Далее на финальной странице я хочу вывести итог (summary) того, что он навводил. Как это сделать? Где в Qwizard сохраняются введенные значения (строки, чекбоксы, радио...)?

2. На первой странице пользователь ввел данные. Далее у меня должно быть соединение с БД, загрузка данных. В зависимости от загруженных данных должна вызываться определенная страница визарда (нелинейная модель). Как это делается? Смотрел пример qt, но там визард самодостаточен и из вне данные в него не поступают для принятия решения.
Т.е. где реализовывать соединение с БД - на первой странице или на второй? Если на второй, то вдруг окажется, что вторую страницу пользователю не нужно выводить (исходя из данных БД). Получается нужно ее визуально пропустить и перейти к другой.

Есть соображения по этому поводу?
Записан
Johnik
Крякер
****
Offline Offline

Сообщений: 339


Просмотр профиля
« Ответ #1 : Январь 27, 2015, 10:12 »

1.
На разных страницах визарда регистрируем ресурсы:
Код
C++ (Qt)
void QWizardPage::​registerField(const QString & name, QWidget * widget, const char * property = 0, const char * changedSignal = 0);

зарегистрированные ресурсы использовать так:
Код
C++ (Qt)
QVariant QWizard::​field(const QString & name) const;
QVariant QWizardPage::​field(const QString & name) const;
 

2.
для нелийненых визардов хорошо в документации написано: Creating Non-Linear Wizards
---
по визардам хороший пример: исходники QtCreator'а
« Последнее редактирование: Январь 27, 2015, 10:15 от Johnik » Записан
phpCoder
Гость
« Ответ #2 : Январь 27, 2015, 12:05 »

С первым пунктом ясно.

А с БД так и не ясно. В каком месте реализовывать подкачку данных из-вне?

Это уже читал - написал в первом посте.
Записан
Johnik
Крякер
****
Offline Offline

Сообщений: 339


Просмотр профиля
« Ответ #3 : Январь 27, 2015, 12:15 »

создаете наследника QWizard, внедряете какой-нибудь интерфейс по работе с данными (он же модель), на страницах работаете с данными через модель

MVC же!
Записан
phpCoder
Гость
« Ответ #4 : Январь 27, 2015, 14:11 »

А пример можно, когда данные из вне подгружаются?
Записан
Johnik
Крякер
****
Offline Offline

Сообщений: 339


Просмотр профиля
« Ответ #5 : Январь 27, 2015, 14:49 »

wizard.h:
Код
C++ (Qt)
class Wizard : public QWizard
{
   Q_OBJECT
public:
   Wizard(QWidget* parent = NULL)
   ~Wizard();
public slots:
   void accept()
}
 
wizard.cpp:
Код
C++ (Qt)
Wizard::Wizard(QWidget* parent /* = NULL */)
: QWizard(parent)
{
   setWindowTitle(tr("Wizard"));
 
   Dao* dao = new Dao();
   addPage(new WizardPage1(dao));
   addPage(new WizardPage2(dao));
}
 
Wizard::~Wizard()
{
}
 
void Wizard::accept()
{
...
}
 

wizardpage.h:
Код
C++ (Qt)
class WizardPage : public QWizardPage
{
   Q_OBJECT
public:
   WizardPage(Dao* dao, QWidget* parent = NULL)
       : QWizardPage(parent)
       , m_dao(dao)
   {
   }
 
   Dao* dao() { return m_dao; }
private:
   Dao* m_dao;
}
 

wizardpage1.h:
Код
C++ (Qt)
class WizardPage1 : public WizardPage
{
   Q_OBJECT
public:
   WizardPage1(Dao* dao, QWidget* parent = NULL)
       : WizardPage1(dao, parent)
   {
   }
   void someMethod()
   {
      dao()->getData();
   }
}
 

как-то так...
или нужен пример того как с БД работать?
Записан
phpCoder
Гость
« Ответ #6 : Январь 27, 2015, 19:22 »

Да нет, с БД работать ясно как.

Просто не понятно где именно, в какой момент нужно вытаскивать данные из вне?
Пример:
1. На начальной странице я ввел число.
2. Далее в какой-то момент где-то (в моем методе или в qt-шном, переопределенном) вытаскивается информация из вне (с учетом введенного числа) и принимается решение - либо идем на следующую страницу, либо ее перепрыгиваем и идем сразу на третью. (+ еще то, что пришло из вне нужно записать в мета-поле.)
Записан
phpCoder
Гость
« Ответ #7 : Январь 27, 2015, 19:56 »

Более того, если из БД придет ответ, что записей нет, то нужно остаться на текущей странице (ну что пользователь мог исправить введенные данные).
Записан
Johnik
Крякер
****
Offline Offline

Сообщений: 339


Просмотр профиля
« Ответ #8 : Январь 28, 2015, 08:11 »

принимается решение - либо идем на следующую страницу, либо ее перепрыгиваем и идем сразу на третью
вы ходили по ссылке, что я давал? (Creating Non-Linear Wizards)
там четко сказано, как это делать, в классах страниц визарда перегрузить метод:
Код
C++ (Qt)
int QWizardPage::​nextId() const
Более того, если из БД придет ответ, что записей нет, то нужно остаться на текущей странице (ну что пользователь мог исправить введенные данные).
Код
C++ (Qt)
bool QWizardPage::​isComplete() const

почитайте документацию всё-таки.
Записан
phpCoder
Гость
« Ответ #9 : Январь 28, 2015, 09:39 »

вы ходили по ссылке, что я давал? (Creating Non-Linear Wizards)
там четко сказано, как это делать, в классах страниц визарда перегрузить метод:
Код
C++ (Qt)
int QWizardPage::​nextId() const
Более того, если из БД придет ответ, что записей нет, то нужно остаться на текущей странице (ну что пользователь мог исправить введенные данные).
Код
C++ (Qt)
bool QWizardPage::​isComplete() const

почитайте документацию всё-таки.
Да в какой момент скачивать данные из вне, елы палы, почитайте предыдущие посты всё-таки.
В nextId не скачаешь данные, этот метод вызывается несколько раз при создании визарда и не сохранишь, т.к. конст. Чтобы он направлял куда, нужно СПЕРВА скачать данные!

Повторяю, в документации НЕТ примеров со скачкой данных из вне. Все визарды в примерах САМОДОСТАТОЧНЫ.
« Последнее редактирование: Январь 28, 2015, 09:46 от phpCoder » Записан
Johnik
Крякер
****
Offline Offline

Сообщений: 339


Просмотр профиля
« Ответ #10 : Январь 28, 2015, 09:51 »

елы палы, почитайте предыдущие посты всё-таки.
вы сами почитайте предыдущие посты.
я вам уже рекомендовал использовать принципы MVC
пишете модель (не путать с ItemModel из Qt), настраиваете в диалоге визардов(представление) взаимодействие с моделью, при изменении данных в представлении подгружаете необходимые данные, и настраиваете флажки, а в константных методах используете эти флажки
Записан
phpCoder
Гость
« Ответ #11 : Январь 28, 2015, 10:37 »

Какая-то модель... Почесать левой рукой правое ухо.

Пользователь ввел данные, нажал далее. Теперь нужно отловить это нажатие. В слоте для этого сигнала сделать запрос к БД, получить выборку, проверить ее на адекватность и установить нужный ИД следующей страницы (или оставить прежний). После этого уже пусть вызывается nextId() и прочая муть с ее неадекватной логикой.

Я так понимаю, Вы много раз делали визарды. Поделитесь проектом?
Записан
Johnik
Крякер
****
Offline Offline

Сообщений: 339


Просмотр профиля
« Ответ #12 : Январь 28, 2015, 11:14 »

Я так понимаю, Вы много раз делали визарды. Поделитесь проектом?
Визардов сделал мало, но разбирался как происходит работа с ними. Изучал работу визардов по исходникам QtCreator. Много работаю с UI.

Какая-то модель... Почесать левой рукой правое ухо.
У меня вся логика разделена на модули, поэтому между модулями пуляю только интерфейсы моделей, даже простых, так проще.

Пользователь ввел данные, нажал далее. Теперь нужно отловить это нажатие. В слоте для этого сигнала сделать запрос к БД, получить выборку, проверить ее на адекватность и установить нужный ИД следующей страницы (или оставить прежний). После этого уже пусть вызывается nextId() и прочая муть с ее неадекватной логикой.
Да, примерно так.
Записан
phpCoder
Гость
« Ответ #13 : Январь 28, 2015, 14:52 »

Как это сделать?

Мне посоветовали переопределить метод QWizardPage::validatePage, но проблема в том, что он никогда не вызывается. Все остальные вызываются, а этот нет. Не понятно почему. Тривиальный проект визарда прикрепил к сообщению.
Записан
Johnik
Крякер
****
Offline Offline

Сообщений: 339


Просмотр профиля
« Ответ #14 : Январь 28, 2015, 15:01 »

бегло глянув ваш код:

должно быть:
Код
C++ (Qt)
bool QWizardPage::validatePage();
у вас в коде:
Код
C++ (Qt)
bool FirstPage::validatePage() const;
« Последнее редактирование: Январь 28, 2015, 15:03 от Johnik » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.266 секунд. Запросов: 22.