Беда с прогрессбаром в QT - PullRequest
       34

Беда с прогрессбаром в QT

1 голос
/ 18 февраля 2010

Я столкнулся с проблемой при предоставлении анимации прогрессбару в QT.

, где ошибка в следующем коде, я получаю индикатор продолжения, но он не анимируется

  QApplication a(argc, argv);

QProgressDialog *dialog = new QProgressDialog();


QProgressBar *pbar = new QProgressBar(dialog);

pbar->setMinimum(0);
pbar->setMaximum(0);
pbar->setTextVisible(false);

QDesktopWidget *desktop = QApplication::desktop();
QRect rect = desktop->geometry();

pbar->setGeometry(rect.left(),rect.top(),rect.right(),rect.bottom()-300);

pbar->show();


dialog->setBar(pbar);

dialog->showMaximized(); 
dialog->exec();   
return a.exec();

Ответы [ 3 ]

7 голосов
/ 18 февраля 2010

Я попробовал этот код на WinXP с Qt 4.5.3, и он работает как положено. Я не могу дать вам решение, но у меня есть предложение: Вам не нужно устанавливать QProgressBar в QProgressDialog, у него уже есть свой собственный.

Удаление кода для QProgressBar, приведенный ниже код делает то же самое с вашим исходным кодом на моей машине.

QApplication a(argc, argv);

QProgressDialog *dialog = new QProgressDialog();

dialog->setMinimum(0);
dialog->setMaximum(0);

dialog->showMaximized(); 
dialog->exec();   
return a.exec();
1 голос
/ 26 мая 2010

Если вы используете тему Windows Vista (QWindowsVistaStyle), то есть ошибка, которая означает, что неопределенные индикаторы выполнения не анимируются. Я написал здесь ошибку, дополненную простым патчем: http://bugreports.qt -project.org / browse / QTBUG-10984

0 голосов
/ 18 февраля 2010

Чувак, что именно вы думаете, что делает индикатор выполнения? Предполагается показать пользователю, что действие продолжается, а также текущее состояние процесса.

Ваш код

QProgressDialog *dialog = new QProgressDialog();

dialog->setMinimum(0);

dialog->setMaximum(0);

будет означать, что определенная операция начнется с состояния 0 и закончится, когда состояние (или текущее значение) достигнет значения ... 0. И вы хотите, чтобы анимация шла с этим?

См. Пример на http://doc.trolltech.com/4.6/qprogressdialog.html#details

Как правило, вы должны создать диалоговое окно прогресса с минимальным и максимальным значением

QProgressDialog *dialog = new QProgressDialog();

dialog->setMinimum(0);

dialog->setMaximum(100);

Затем обновите фактическое значение прогресса (например, по таймеру, который запускает слот выполнения), чтобы оно было представлено в индикаторе выполнения:

void Operation::perform()
{
     dialog->setValue(steps);
     //... perform one percent of the operation
     steps++;
     if (steps > dialog->maximum())
         t->stop();
}

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

Очевидно, что помечать это с помощью Symbian - это совершенно неправильно, это совсем не относится к Symbian. И при этом это не специфично для Qt 4.x, черт ... это даже не специфично для Qt, это в основном логическая проблема. ;)

...