2012-10-29 2 views
1

내 응용 프로그램에 QMessageBox을 통해 사용자가 편집을 유지하거나 변경하려는 모든 변경 사항을 취소할지 묻는 대화 상자가 있습니다. 이 대화 상자를 전체 응용 프로그램의 모달이되게하고 싶습니다.모달 QMessageBox가 기본 Windows 대화 상자처럼 작동하지 않습니다.

나는 이것이 QMessageBox의 표준 동작입니다 어딘가에 읽고, 그래서 내가 좋아하는 뭔가를 명시 적으로 설정 필요 없다 : (

mbox.setWindowModality(Qt::ApplicationModal); 

나는 그것이 OS에서 다르게 다른 모달 대화 상자에서 동작하는 이유를 궁금해 필자의 경우 Windows 7). 한편으로는 기능이 좋아야합니다. 즉, 응용 프로그램의 다른 모든 입력 메소드는 사용자가 대화에 응답 할 때까지 차단됩니다. 그러나 사용자가 응용 프로그램의 다른 창을 클릭하면 '깜박'하지 않습니다. Qt가 네이티브 Windows 대화 상자처럼 동작하도록 할 수있는 방법이 있습니까?

미리 감사드립니다. 당신은 내가이 '깜박'로 무슨 뜻인지 모르는 경우


* 는 : 윈도우 OS에 그냥 메모장, 텍스트를 입력하고 닫습니다하려고합니다. 저장, 폐기 또는 편집을 요청하는 대화 상자가 나타납니다. 이제 편집기 창에서 어딘가를 클릭하십시오 -> 대화 상자의 테두리와 제목 표시 줄이 몇 번 깜박이거나 깜박입니다.

+0

특히 Windows에 대해 이야기하고 있습니까? Win atm에서 테스트 할 수는 없지만 우분투에서는 작동해야합니다. – SingerOfTheFall

+0

@SingerOfTheFall : 예.이 질문에서 Windows 컨텍스트에서만 얘기하고 있습니다. 말했듯이 필자는 제대로 작동하지만 시각적 인 동작은 OS의 다른 대화 상자에서와 동일하지 않습니다. 그것은 단지 광학적인 '문제'일 뿐이며 공통된 표정과 느낌으로 인해 궁금합니다. –

답변

4

문제가 발생합니다.

QMessageBox box(this); 
box.setStandardButtons(QMessageBox::Close); 
box.exec(); 

을하지만이되지 않습니다 : 이것은 나를 위해 잘 작동

QMessageBox box; 
box.setStandardButtons(QMessageBox::Close); 
box.exec(); 

이 ... 의미가 그것의 부모가 클릭 된 것을 알고하지 않으면 메시지 상자가 깜박이지 수 있습니다.

+0

대단히 감사합니다. 그것이 이유였으며 완전히 의미가 있습니다. 이제 잘됩니다. –

1

만 창 당신이해야 #include <windows.h>에서 응용 프로그램을 배포하고 MessageBoxA API를 사용하려는 경우 내 마음에 와서 간단한 솔루션입니다. 메시지 상자에 부모가없는 경우

은 Windows에서 나를 위해 좋은 작품 외에도 것을

및 우분투

if (QMessageBox::question(this,"Close?","Close this dialog?",QMessageBox::Yes,QMessageBox::No) == QMessageBox::Yes) 
{ 
    this->close(); 
} 
+2

죄송 합니다만,''windows.h''는 실제로 옵션이 아닙니다. plattform과 독립적이어야합니다. 또한, Qt가 결국 QMessageBox 클래스를 제공하는 이유이기도합니다. Qt GUI 요소는 대개 어떤 OS에서든 네이티브 OS 요소처럼 보이는 아주 좋은 일을하기 때문에 궁금했습니다. 그러나 사실상 모달 메시지 상자는 이상하지 않습니다. –

+0

간단한 '#ifdef Q_OS_WIN32'와'#ifndef Q_OS_WIN32'를 사용하면 플랫폼 독립성을 쉽게 달성 할 수 있습니다. – Anthony

+2

@Anthony : 기술적으로 가능하다는 것을 알고 있지만,이''# ifdef''를 정확히 수행하는 것을 피하기 위해 Qt와 같은 프레임 워크를 사용해야하는 이유는 무엇입니까? 나는 Qt가 윈도우의 모양과 느낌을 기대하는 모달을 수행 할 수 있음을 안다. 나는''QDialog''를 만들고''setModal (true);''을 설정하면 그렇게한다. 내 질문은 남아있다 : ​​네이티브 Windows API 호출을하지 않고도''QMessageBox''에서 어떻게 동일한 효과를 얻을 수 있습니까? –

관련 문제