2016-09-15 23 views
1

메인 윈도우의 버튼을 클릭 할 때 QProgressBar를 사용하여 새 윈도우를 만들고 있지만 새 윈도우가 생성 될 때주기가 작동하는 동안 QProgressBar가 나타나지 않습니다. 그 후 QProgressBar가 나타나고 채워집니다.QProgressBar 새 창에서 작동하지 않습니다.

생성자 :

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

클래스 새 창 : : MainWindow를위한

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] 
012 새 창 호출 버튼의

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); 
    } 
} 

코드 "무거운 작업을 수행"의 사용자 클릭이,이 클릭을 관리하는 코드가 때의 GUI 스레드에서 무거운 작업을 구현하는 경우

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

: 3,516,

+0

업데이트를 위해 GUI로 제어권을 반환하지 않는 for-loop에서 채우는 경우 진행률 표시 줄이 눈에 띄게 채워지는 이유는 무엇입니까? – UnholySheep

+2

GUI에 대해 좀 더 익숙해지고 이벤트 처리 루프 등에 대해 읽어야합니다. – Hayt

답변

0

사용자 인터페이스는 일반적으로 이벤트 루프 원리에 작동 호출 된 후 다음 이벤트가 창 그리기를 트리거합니다. 이는 무거운 작업으로 인해 작업 중에 사용자 인터페이스가 멈추는 것을 의미합니다.

가 제대로 무거운 작업을 수행하려면 다음을 수행해야합니다

  • 이 작업을 수행 백그라운드 스레드를 만듭니다. 각각의 반복은 태스크의 일부 공유 메모리 (또는 동등한) 상태를 갱신합니다. QT와 같은 일부 UI 라이브러리는 대기중인 메시지를 보낼 수 있으므로 이러한 경우에 도움이됩니다.
  • 주 스레드에서 상태 업데이트시 진행률 막대를 새 값으로 설정하고 돌아갑니다.