2012-05-25 4 views
4

QDialog가 있는데 show(), exec() 및 open()의 차이점에 대해 많이 읽었습니다. 불행히도 런타임에 대화 상자의 양식을 변경하는 해결 된 해결책을 찾지 못했습니다. 응용 프로그램이 있고 거기에서 내 QDialog가 시작되었습니다. 이 대화 상자에 전환 버튼이 있습니다. 버튼을 클릭하면 QDialog가 양식을 변경해야 응용 프로그램과 상호 작용할 수 있습니다. 단, 토글 버튼이 선택되어있을 때 항상 발생하지 않아야합니다.런타임시 QDialog의 양식을 어떻게 변경합니까?

가능성은 있습니까? setModal (true/false) 설정으로 문제를 해결할 수 없습니다. 모달을 시작하고 버튼을 토글하고 모달이 아닌 모달로 설정할 수 있지만 모달로 돌아갈 수는 없습니다. 여기

일부 코드 :

대화 시작 : 메인 창에서

다음 ToggleModalDialog

void ToggleModalDialog::changeModality(bool checkState) 
{ 
    if(checkState) 
    { 
     this->setWindowModality(Qt::NonModal); 
     ui->changeModalityButton->setChecked(true); 
     this->setModal(false); 
    } 
    else 
    { 
     this->setWindowModality(Qt::ApplicationModal); 
     ui->changeModalityButton->setChecked(true); 
    } 

감사에서의 전환 슬롯에

_dialog = new ToggleModalDialog(this, id, this); 
_dialog->setWindowModality(Qt::ApplicationModal); 
_dialog->open(); 

여기를 전진!

답변

8

QDialog::setModal(bool) 또는 setWindowModality(Qt::ApplicationModal) 중 하나를 사용할 수 있습니다. 그러나 setWindowModality()의 문서는

Changing this property while the window is visible has no effect; 
you must hide() the widget first, then show() it again. 

그래서 코드를 다음과 같이한다이다 추가 뭔가 .. ..라고

void ToggleModalDialog::changeModality(bool checkState) 
{ 
    if(checkState) 
    { 
     this->setWindowModality(Qt::NonModal); 
     ui->changeModalityButton->setChecked(true); 
    } 
    else 
    { 
     this->setWindowModality(Qt::ApplicationModal); 
     ui->changeModalityButton->setChecked(true); 
    } 

    this->hide(); 
    this->show(); 
} 
관련 문제