crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

3 страниц V   1 2 3 >  
Ответить в данную темуНачать новую тему
> QWizard, динамическое построение списка страниц
FladeX
  опции профиля:
сообщение 10.3.2009, 23:49
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 67
Регистрация: 20.2.2009
Пользователь №: 564

Спасибо сказали: 0 раз(а)




Репутация:   0  


При помощи QWizard создана программа - набор страниц, связанных "назад"/"далее" кнопками.
Задача - при помощи чекбоксов, выводимых на первой странице, выводить или не выводить последующие страницы. Как это реализовать?

Т.е. на первой странице чекбоксы "страница 2", "страница 3", "страница 4". Если мы отмечаем "страница 2" и "страница 4", то по нажатию "далее" будет показана страница 2, а затем 4, то есть страница 3 будет пропущена.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
FladeX
  опции профиля:
сообщение 13.3.2009, 15:37
Сообщение #2


Студент
*

Группа: Участник
Сообщений: 67
Регистрация: 20.2.2009
Пользователь №: 564

Спасибо сказали: 0 раз(а)




Репутация:   0  


Какие-нибудь идеи есть?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 13.3.2009, 16:23
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Такая есть идея http://doc.trolltech.com/4.5/qwizard.html#...-linear-wizards

Сообщение отредактировал SABROG - 13.3.2009, 16:32
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
FladeX
  опции профиля:
сообщение 17.3.2009, 17:25
Сообщение #4


Студент
*

Группа: Участник
Сообщений: 67
Регистрация: 20.2.2009
Пользователь №: 564

Спасибо сказали: 0 раз(а)




Репутация:   0  


Теперь такой вопрос - как из первого листа назначить nextId() для всех остальных? Пробовал по-всякому, результата нет(

class Func01Page : public QWizardPage
{
    Q_OBJECT
public:
    Func01Page(QWidget *parent = 0);

    int nextId() const;
    int IDValue;
};

и аналогичный Func02Page.
Нужно в
int Func01Page::nextId() const
{
    return ExpertSystem::Page_Func02;
}

изменить nextId() для Func02Page. Как это сделать?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
FladeX
  опции профиля:
сообщение 19.3.2009, 15:24
Сообщение #5


Студент
*

Группа: Участник
Сообщений: 67
Регистрация: 20.2.2009
Пользователь №: 564

Спасибо сказали: 0 раз(а)




Репутация:   0  


class ExpertSystem : public QWizard
{
    Q_OBJECT

public:
    enum
    {
        Page_Intro,
        Page_Func01,
        // ...
        Page_Func27,
        Page_Outro
    };

    ExpertSystem(QWidget *parent = 0);

private slots:
    void showHelp();
};

Так и не понял, как обращаться к enum {}...
В документации нашел такую фразу:
Цитата
If you want to register an enum that is declared in another class, the enum must be fully qualified with the name of the class defining it. In addition, the class defining the enum has to inherit QObject as well as declare the enum using Q_ENUMS().

Подскажите плиз.

Сообщение отредактировал FladeX - 19.3.2009, 15:25
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 19.3.2009, 15:40
Сообщение #6


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


ExpertsSystem:: Page_Intro


В данном случае лучше, чтобы enum имел иия.
Например, так:
enum PAGES
{
Page_Intro,
Page_Func01,
// ...
};

Тогда можно будет использовать в качестве типа:
ExpertsSystem:: PAGES
.
Если же Вы имели что-то другое, то, пожалуйста, конкретнее проблему опишите! :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 19.3.2009, 15:42
Сообщение #7


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


Цитата(FladeX @ 19.3.2009, 15:24) *
Так и не понял, как обращаться к enum {}...

ну назови его
enum EPages{...};

и обращайся
в нутри класса
Page_Intro;

за пределами класса
ExpertSystem::Page_Intro;
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
FladeX
  опции профиля:
сообщение 19.3.2009, 15:55
Сообщение #8


Студент
*

Группа: Участник
Сообщений: 67
Регистрация: 20.2.2009
Пользователь №: 564

Спасибо сказали: 0 раз(а)




Репутация:   0  


На основе этого примера сделал визард. Но отличие в том, что на первой странице список чекбоксов, которые и определяют, какие страницы будут показаны, а какие нет. Собственно проблема в том, что кроме первой страницы я не могу ничего изменить...

Итак, есть класс:
код класса
class ExpertSystem : public QWizard
{
    Q_OBJECT

public:
    enum
    {
        Page_Intro,
        Page_Func01,
        // ...
        Page_Func27,
        Page_Outro
    };

    ExpertSystem(QWidget *parent = 0);

private slots:
    void showHelp();
};

Есть первая страница с чекбоксами:
первая страница
class IntroPage : public QWizardPage
{
    Q_OBJECT

public:
    IntroPage(QWidget *parent = 0);

    int nextId() const;
    int IDValue;

//private:
public:
    QCheckBox *func01;
    QCheckBox *func02;
    //..
    QCheckBox *func26;
    QCheckBox *func27;
};

Enum с страницами связан так:
конструктор
ExpertSystem::ExpertSystem(QWidget *parent)
    : QWizard(parent)
{
    setPage(Page_Intro, new IntroPage);
    setPage(Page_Func01, new Func01Page);
    setPage(Page_Func02, new Func02Page);
    //..
    setPage(Page_Func27, new Func27Page);
    setPage(Page_Outro, new OutroPage);

    setStartId(Page_Intro);
}

Как теперь изменить значение int nextId() const к примеру для Page_Func27 ? Изменять отсюда (ибо чекбоксы только на первой странице):
int IntroPage::nextId() const
{


Сообщение отредактировал FladeX - 19.3.2009, 15:57
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
FladeX
  опции профиля:
сообщение 20.3.2009, 20:47
Сообщение #9


Студент
*

Группа: Участник
Сообщений: 67
Регистрация: 20.2.2009
Пользователь №: 564

Спасибо сказали: 0 раз(а)




Репутация:   0  


Ну подскажите же эту строчку)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 21.3.2009, 10:04
Сообщение #10


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


FladeX,
по аналогии действуй
Раскрывающийся текст

int IntroPage::nextId() const
{
     if (evaluateRadioButton->isChecked()) {
         return LicenseWizard::Page_Evaluate;
     } else {
         return LicenseWizard::Page_Register;
     }
}

int EvaluatePage::nextId() const
{
     return LicenseWizard::Page_Conclusion;
}

int RegisterPage::nextId() const
{
     if (upgradeKeyLineEdit->text().isEmpty()) {
         return LicenseWizard::Page_Details;
     } else {
         return LicenseWizard::Page_Conclusion;
     }
}

int DetailsPage::nextId() const
{
     return LicenseWizard::Page_Conclusion;
}

int ConclusionPage::nextId() const
{
     return -1;
}

It would also be possible to put all the logic in one place, in a QWizard::nextId() reimplementation. For example:
 int LicenseWizard::nextId() const
{
     switch (currentId()) {
     case Page_Intro:
         if (field("intro.evaluate").toBool()) {
             return Page_Evaluate;
         } else {
             return Page_Register;
         }
     case Page_Evaluate:
         return Page_Conclusion;
     case Page_Register:
         if (field("register.upgradeKey").toString().isEmpty()) {
             return Page_Details;
         } else {
             return Page_Conclusion;
         }
     case Page_Details:
         return Page_Conclusion;
     case Page_Conclusion:
     default:
         return -1;
     }
}


получается тебя надо вернуть Page_Outro или я так чего то и не понял.

Сообщение отредактировал kwisp - 21.3.2009, 10:10
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

3 страниц V   1 2 3 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 27.9.2020, 5:49