QProgressBar в новом окне не работает

Я создаю новое окно с QProgressBar, когда я нажимаю на кнопку MainWindow, но когда создается новое окно, QProgressBar не появляется, пока работает цикл заполнения. После этого появляется QProgressBar и он заполняется.

Конструктор:

ProgressWin::ProgressWin():QWidget()
{
this->resize(273,98);
this->move(670, 430);
bar1 = new QProgressBar(this);
bar1->setGeometry(20, 31, 251, 31);
bar1->setMinimum(0);
bar1->setMaximum(10000);
this->show();
unsigned long long secr, PQ;
unsigned long long rv;
unsigned long long decr;
for(int v = 0; v <= 100000; v++) {
bar1->setValue(v);
}
}

Код кнопки, вызывающей новое окно:

void RsaMainWindow::ButtClickCrypt()
{
FileName1 = ui->LineCrypt->text();
if(FileName1.isEmpty()) {
QMessageBox::information(0, "Information", "File for Crypt wasn't chosen");
return;
}
NewWin = new ProgressWin;
}

Класс для нового окна:

class ProgressWin : public QWidget
{
QProgressBar *bar1;
public:
ProgressWin();
};

Класс для MainWindow:

[namespace Ui {
class RsaMainWindow;
}

class RsaMainWindow : public QMainWindow
{
Q_OBJECT

public:
explicit RsaMainWindow(QWidget *parent = 0);
~RsaMainWindow();

private slots:
void ButtClickViewCryp();
void ButtClickViewDecr();
void ButtClickViewKeys();
void ButtClickCrypt();
void ButtClickDecr();

private:
Ui::RsaMainWindow *ui;
QString FileName1;
QString FileName2;
QString FileName3;
ProgressWin *NewWin;

};][1]

1

Решение

Пользовательский интерфейс обычно работает по принципу цикла обработки событий:

While (not closing the app)
Wait for some event
update app according event
endWhile

Если вы реализуете свою тяжелую задачу в потоке графического интерфейса, когда пользователь нажимает «Выполнить тяжелую задачу», вызывается код, управляющий этим щелчком, и после его завершения следующее событие вызовет рисование окна. Это означает, что ваша тяжелая задача заморозит пользовательский интерфейс во время выполнения задачи.

Чтобы правильно выполнить сложную задачу, вам необходимо:

  • Создайте фоновый поток, который выполняет задачу. На каждой итерации обновляется некое состояние общей памяти (или эквивалентное) задачи. Некоторые библиотеки пользовательского интерфейса, такие как QT, позволяют отправлять сообщения в очереди, что помогает в таких случаях.
  • В главном потоке при обновлении статуса установите индикатор выполнения на новое значение и вернитесь.
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]