Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: 0xFF от Март 14, 2010, 13:12



Название: QWizard, "работающая" QWizardPage
Отправлено: 0xFF от Март 14, 2010, 13:12
Как сделать, чтобы при переходе на следующую QWizardPage, на ней работал QProgressBar.
Пытался описать изменения QProgressBar в initializePage(). Не выходит. Небольшая пауза и появляется QProgressBar в конечном состоянии.


Название: Re: QWizard, "работающая" QWizardPage
Отправлено: alexman от Март 14, 2010, 21:54
Код можно?


Название: Re: QWizard, "работающая" QWizardPage
Отправлено: 0xFF от Март 15, 2010, 11:17
.h
Код:
class WIZARD : public QWizard
{
    Q_OBJECT

public:
    WIZARD(QWidget *parent = 0);
};

class One : public QWizardPage
{
    Q_OBJECT
public:
    One(QWidget *parent = 0);
    int nextId() const;
};

class Two : public QWizardPage
{
    Q_OBJECT
public:
    Two(QWidget *parent = 0);
    int nextId() const;
    void initializePage();

private:
    void test();
    QProgressBar *progBar;
};

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

.cpp
Код:
WIZARD::WIZARD(QWidget *parent)
    : QWizard(parent)
{
    setPage(0, new One);
    setPage(1, new Two);
    setPage(2, new Three);

    setStartId(0);
}

One::One(QWidget *parent)
    : QWizardPage(parent)
{}

int One::nextId() const
{
    return 1;
}

Two::Two(QWidget *parent)
    : QWizardPage(parent)
{
    progBar = new QProgressBar;
    progBar->setMaximum(3);

    QVBoxLayout *layout = new QVBoxLayout;
    layout->addWidget(progBar);
    setLayout(layout);
}

void Two::initializePage() {
    test();
}

void Two::test() {
    QTest::qWait(500);
    progBar->setValue(1);
    QTest::qWait(500);
    progBar->setValue(2);
    QTest::qWait(500);
    progBar->setValue(3);
}

int Two::nextId() const
{
    return 2;
}

Three::Three(QWidget *parent)
    : QWizardPage(parent)
{}

Собственно хотелось бы при загрузке страницы Two наблюдать изменения QProgressBar'а


Название: Re: QWizard, "работающая" QWizardPage
Отправлено: GreatSnake от Март 15, 2010, 11:40
Замените
Код
C++ (Qt)
void Two::initializePage() {
   test();
}
 
на
Код
C++ (Qt)
void Two::setVisible( bool set ) {
   QWizardPage::setVisible( set );
   if( set )
     test();
}
 


Название: Re: QWizard, "работающая" QWizardPage
Отправлено: alexman от Март 15, 2010, 11:50
В initializePage необходимо лишь проинициализировать страницу!
Если Вы хотите замутить прогресс, нужно сделать отдельный поток, который будит emit сигналы о прогрессе. Поток можно запустить по currentIdChanged( int ).


Название: Re: QWizard, "работающая" QWizardPage
Отправлено: GreatSnake от Март 15, 2010, 11:52
Цитировать
Это не работает!
Хм, объясните почему?

Цитировать
... нужно сделать отдельный поток ...
И зачем так всё усложнять?


Название: Re: QWizard, "работающая" QWizardPage
Отправлено: alexman от Март 15, 2010, 11:59
Цитировать
Это не работает!
Хм, объясните почему?
Сорри! Я уже коммент удалил!


Название: Re: QWizard, "работающая" QWizardPage
Отправлено: alexman от Март 15, 2010, 12:01
Цитировать
... нужно сделать отдельный поток ...
И зачем так всё усложнять?
В данном случае действительно нет смысла усложнять...на самом деле я общую схему описал ;)


Название: Re: QWizard, "работающая" QWizardPage
Отправлено: 0xFF от Март 15, 2010, 13:14
Код
C++ (Qt)
void Two::setVisible( bool set ) {
   QWizardPage::setVisible( set );
   if( set )
       test();
}
 
Что-то не работает, эффект тот же (
Получается после setVisible вызывается что-то еще?


Название: Re: QWizard, "работающая" QWizardPage
Отправлено: GreatSnake от Март 15, 2010, 14:00
Хм, странно...

Тогда в конструктор WIZARD-а добавь

connect( this, SIGNAL( currentIdChanged( int ) ), SLOT( showPage( int ) ) );

и в нём же пропиши слот

Код
C++ (Qt)
void WIZARD::showPage( int id )
{
   if( id == 1 )
   {
      Two* two = dynamic_cast< Two* >( page( id ) );
      two->test();
   }
}
 


Название: Re: QWizard, "работающая" QWizardPage
Отправлено: 0xFF от Март 15, 2010, 14:18
Спасибо, работает.