2016-09-15 33 views
1

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

Constructor:

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] 
+0

Почему вы ожидаете, что индикатор выполнения будет заметно заполняться, если вы заполняете его в цикле for, который не возвращает управление графическому интерфейсу для его обновления? – UnholySheep

+2

Вы должны немного ознакомиться с графическими интерфейсами и прочитать о цикле обработки событий и т. Д. – Hayt

ответ

0

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

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

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

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

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