Russian Qt Forum

Qt => Общие вопросы => Тема начата: phpCoder от Январь 27, 2015, 09:54



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

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

Есть соображения по этому поводу?


Название: Re: Самодельный визард
Отправлено: Johnik от Январь 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 (http://doc.qt.io/qt-5/qwizard.html#creating-non-linear-wizards)
---
по визардам хороший пример: исходники QtCreator'а


Название: Re: Самодельный визард
Отправлено: phpCoder от Январь 27, 2015, 12:05
С первым пунктом ясно.

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

Это уже читал - написал в первом посте.


Название: Re: Самодельный визард
Отправлено: Johnik от Январь 27, 2015, 12:15
создаете наследника QWizard, внедряете какой-нибудь интерфейс по работе с данными (он же модель), на страницах работаете с данными через модель

MVC же!


Название: Re: Самодельный визард
Отправлено: phpCoder от Январь 27, 2015, 14:11
А пример можно, когда данные из вне подгружаются?


Название: Re: Самодельный визард
Отправлено: Johnik от Январь 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();
   }
}
 

как-то так...
или нужен пример того как с БД работать?


Название: Re: Самодельный визард
Отправлено: phpCoder от Январь 27, 2015, 19:22
Да нет, с БД работать ясно как.

Просто не понятно где именно, в какой момент нужно вытаскивать данные из вне?
Пример:
1. На начальной странице я ввел число.
2. Далее в какой-то момент где-то (в моем методе или в qt-шном, переопределенном) вытаскивается информация из вне (с учетом введенного числа) и принимается решение - либо идем на следующую страницу, либо ее перепрыгиваем и идем сразу на третью. (+ еще то, что пришло из вне нужно записать в мета-поле.)


Название: Re: Самодельный визард
Отправлено: phpCoder от Январь 27, 2015, 19:56
Более того, если из БД придет ответ, что записей нет, то нужно остаться на текущей странице (ну что пользователь мог исправить введенные данные).


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

почитайте документацию всё-таки.


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

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

Повторяю, в документации НЕТ примеров со скачкой данных из вне. Все визарды в примерах САМОДОСТАТОЧНЫ.


Название: Re: Самодельный визард
Отправлено: Johnik от Январь 28, 2015, 09:51
елы палы, почитайте предыдущие посты всё-таки.
вы сами почитайте предыдущие посты.
я вам уже рекомендовал использовать принципы MVC
пишете модель (не путать с ItemModel из Qt), настраиваете в диалоге визардов(представление) взаимодействие с моделью, при изменении данных в представлении подгружаете необходимые данные, и настраиваете флажки, а в константных методах используете эти флажки


Название: Re: Самодельный визард
Отправлено: phpCoder от Январь 28, 2015, 10:37
Какая-то модель... Почесать левой рукой правое ухо.

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

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


Название: Re: Самодельный визард
Отправлено: Johnik от Январь 28, 2015, 11:14
Я так понимаю, Вы много раз делали визарды. Поделитесь проектом?
Визардов сделал мало, но разбирался как происходит работа с ними. Изучал работу визардов по исходникам QtCreator. Много работаю с UI.

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

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


Название: Re: Самодельный визард
Отправлено: phpCoder от Январь 28, 2015, 14:52
Как это сделать?

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


Название: Re: Самодельный визард
Отправлено: Johnik от Январь 28, 2015, 15:01
бегло глянув ваш код:

должно быть:
Код
C++ (Qt)
bool QWizardPage::validatePage();
у вас в коде:
Код
C++ (Qt)
bool FirstPage::validatePage() const;