LINUX.ORG.RU

Dynamic Non-Linear Wizards

 ,


0

0

Посмотрел тут доку по QWizard. Для решения проблемы предлагается создавать все страницы, а потом вызывать их по ID. Естественно, меня не устраивает данная ситуация. Видов страниц около 300 штук, при том, что оператор за сеанс калибровки может вызвать их в среднем около 20.

Отсюда вопрос, а есть ли в данной богатой возможностями библиотеке возможность совать страницы в QWizard динамически, т.е. в момент нажатия кнопки «Next»? А то очень не хочется клепать велосипед для такой стандартной задачи.



Последнее исправление: truetester (всего исправлений: 2)
Ответ на: комментарий от truetester

Читал примерно так же внимательно, как и ты документцию ) Методы int addPage ( QWizardPage * page ) и void removePage ( int id ) как раз позволяют добавлять/удалять страницы, которые никто тебе не запрещает создавать динамически. Ну и второй подход, о котором я уже писал

AF ★★★
()
Ответ на: комментарий от AF

Я же говорю, не читал. И это прискорбно, на самом деле. Написано по-русски: «момент нажатия кнопки „Next“. В документации есть только переопределение nextID, которая возвращает ID уже СОЗДАННОЙ и ДОБАВЛЕННОЙ страницы страницы.

Чтобы не тратить зря время, давай готовый пример, или не мешай другим, более компетентным, ответить на мой вопрос.

truetester
() автор топика
Ответ на: комментарий от truetester

Переопределяешь nextId(), внутри расчехляешся, куда тебе надо идти, создаешь новую страницу, добавляешь ее, возвращаешь на нее id.

А код только за деньги.

AF ★★★
()
Ответ на: комментарий от AF

Вот видишь. Чем попусту тратить время гораздо проще внимательно прочитать вопрос и точно ответить.

Но вернёмся к делу. Откуда ты знаешь, что nextId() дёргается именно в момент нажатия кнопки next? Это раз.

Во-вторых, не понятно, как быть, если пользователь нажмёт кнопку «назад» и поменяет данные. Удалится ли из памяти объект предыдущей страницы? Или так и будет висеть.

А код только за деньги.

Мне тебя уже жалко. Потратил столько времени и сил, а последнее предложение так и не прочитал.

truetester
() автор топика
Ответ на: комментарий от truetester

main.h

#ifndef MAIN_H
#define MAIN_H

#include <QObject>
#include <QWizard>
#include <QAbstractButton>

class MyWiz: public QWizard { Q_OBJECT
public:       void initializePage(int id);
};

class Main : public QObject { Q_OBJECT
public:       Main(QObject *parent = 0);
              ~Main();
public slots: void idChange(int id);
              void click();
private:      MyWiz *wizard;
};

#endif // MAIN_H
main.cpp
#include <QApplication>
#include <QDebug>
#include "main.h"

QWizardPage *createIntroPage(QString text) {
    qDebug()<<"createIntroPage:"<<text;
    QWizardPage *page = new QWizardPage;
    page->setTitle(text);
    return page;
}

void MyWiz::initializePage(int id) { qDebug()<<"initPage:"<<id; }

Main::Main(QObject *parent) : QObject(parent) {
    wizard = new MyWiz;
    connect(wizard,SIGNAL(currentIdChanged(int)),this,SLOT(idChange(int)));

    QAbstractButton *btn = wizard->button(QWizard::NextButton);
    disconnect(btn,SIGNAL(clicked()),wizard,SLOT(next()));
    connect(btn,SIGNAL(clicked()),SLOT(click()));
    connect(btn,SIGNAL(clicked()),wizard,SLOT(next()));

    wizard->setWindowTitle("Trivial Wizard");
    for(int i=0;i<5;i++)
        wizard->addPage(createIntroPage(QString("Page%1").arg(i)));
    wizard->show();
}
Main::~Main() { delete wizard; }

void Main::idChange(int id) { qDebug()<<"idChange"<<wizard->currentId()<<id; }
void Main::click() {
    qDebug()<<"Click"<<wizard->currentId();
    if(wizard->currentId()==1) {
        wizard->removePage(2);
        wizard->setPage(2,createIntroPage("Page2->new"));
    }
}

int main(int argc, char *argv[]) {
    QApplication a(argc, argv);
    Main obj;
    return a.exec();
}

Удалится ли из памяти объект предыдущей страницы

нет

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.