2017-12-20 2 views
1

QTimer에서 시간 제한을 사용하여 QDialog를 닫으려고합니다.시간 초과 후 exec()로 표시된 QDialog를 닫고 종료하는 방법은 무엇입니까?

지금까지 내가이 일을 시도 :

QDialog dlg; 
.. 
.. 
myTimer.start(60000); // 60 s 
connect(&myTimer, SIGNAL(timeout()), 
     &dlg, SLOT(close()))); 

dlg.exec(); 
qWarning() << "---timer expired or key pressed--"; 

그러나 타임 아웃 트리거와 close 슬롯이 eventloop이 종료되지 않은 실행될 때. reject 슬롯과 동일한 문제가 발생합니다. done 슬롯에는 예상되는 동작이 있어야하지만 여분의 인수 (int r)가 필요하므로 timeout() 신호에 직접 연결할 수 없습니다.

물론, 나는 누락 된 인수를 제공하기 위해 timeout 신호를 "중계"할 수 있지만 더 직접적인 방법이 있습니까?

감사합니다.

+0

done()을 슬롯으로 사용하는 방법 : "대화 상자를 닫고 결과 코드를 r로 설정합니다.이 대화 상자가 exec()와 함께 표시되면 done()은 로컬 이벤트 루프를 끝내고 exec() r을 반환합니다. " –

+0

힙에서 대화 상자를 만들고'dlg-> exec()'를 사용하여 이벤트 루프를 차단하지 마십시오. – vahancho

+0

'이벤트 루프가 종료되지 않았다'는 것은 무엇을 의미합니까? 대화 상자가 닫히지 않았습니까? –

답변

2

dlg.exec(); 동시성인가, 그는 대답을 수락하거나 거절합니다.) (

Dialog::dialog(...) { 
    //constructor 
    QTimer::singleShot(60000, this, SLOT(close())); 
} 

또는 dialog.exec 사용하지 않는다 :

void MainWindow::btnClicked() { 
    Dialog *dialog = new Dialog(); 
    dialog.exec(); 
    qDebug() << "test"; 
    // while dialog not destroyed (rejected, accepted) Print will not happen never. 
} 

한 가지 방법 당신은 당신의 대화 클래스에서 QTimer을 사용할 수 있습니다 사용 dialog.show(); 당신이 원하는 경우 대화는 당신이 사용할 수있는 양상하자 :

나는 (대화 Executing (실행 중)하기 전에, 즉 로컬 QTimer의 인스턴스) 대화 상자를 자신의 타이머를 제공하는 것이 좋습니다
void MainWindow::btnClicked() { 
    Dialog *dialog = new Dialog(); 
    dialog->setModal(true); 
    dialog->show(); 
    qDebug() << "test"; //The "test" will be printed, and you can use QTimer :)) 
} 
2

다음으로

QTimer dlg_timer; 
dlg_timer.start(60000); // 60 s 
connect(&dlg_timer, SIGNAL(timeout()), &dlg, SLOT(close())); 
dlg.exec(); 
dlg_timer.stop(); 

을 그들의 말에 OP가 두려워서, 타이머 타임 아웃 신호가 다른 슬롯에 연결되었거나, 다이얼로그 닫기와 연결되기 전에, 그리고 그 슬롯에 QTimer::disconnect()이 호출되면, 다이얼로그 닫힘 슬롯은 절대로 호출되지 않을 것입니다.

관련 문제