2016-09-15 9 views
1

MainWindowのボタンをクリックしたときにQProgressBarで新しいウィンドウを作成していますが、新しいウィンドウが作成されているときに、サイクルが動作している間にQProgressBarが表示されません。その後、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(); 
}; 

クラス:

[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-loopで埋め尽くされていて、更新を行うためにGUIに制御を戻さない場合、プログレスバーは目に見えていってしまいますか? – UnholySheep

+2

GUIをもう少し理解して、イベント処理ループなどについて読むべきです。 – Hayt

答えて

0

ユーザー・インターフェースは、通常はイベントループ原理で動作します。ユーザーは「重いタスクを実行する」をクリックしたときには、GUIのスレッドであなたの重いタスクを実装する場合は、このクリックを管理するコードがある

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

呼び出され、終了すると、次のイベントがウィンドウの描画をトリガーします。それはあなたの重いタスクがタスク中にユーザーインターフェイスをフリーズすることを意味します。

正しく重いタスクを実行するには、以下を行う必要があります。

  • は、タスクを実行するバックグラウンドスレッドを作成します。各反復では、タスクの共有メモリー(または同等の)状況が更新されます。 QTのようないくつかのUIライブラリは、キューに入れられたメッセージを送信することができます。
  • メインスレッドでは、ステータスの更新時にプログレスバーを新しい値に設定して戻ります。
関連する問題