2013-03-19 1 views
3

Qt GUI 응용 프로그램에 유틸리티 클래스가 있습니다. 그러나 내 편의 클래스에서 QMessageBox::critical(), warning() 등을 호출하려고했습니다. 클래스는 QWidget이 아니므로 this을 부모로 전달할 수 없습니다. 그러나, 내 클래스는 QObject에서 서브 클래스 화되었으므로 신호 및 슬롯과 같은 것을 실행할 수 있습니다. 그래서이 문제를 해결하려면 (가능한 경우) Static API 대신 속성 API를 살펴보아야합니까?QMessageBox 호출 방법 QWidget 하위 클래스 외부의 정적 API

클래스 선언 :

class NetworkManager : public QObject 

그리고 여기에 실패 정적 API 호출의 예 : 나는, 프로퍼티 기반 API 메시지 상자를 구축한다면

QMessageBox::critical(this, tr("Network"), tr("Unable to connect to host.\n"), 
QMessageBox:Ok | QMessageBox:Discard); 

을 그래서, 그것은 것 어떻게 든 QObject에 전화 할 수 있습니까? Property Based API를 실제로 사용하지는 않았지만 문서에서 이벤트 루프 (즉, exec())를 사용하는 것으로 보입니다.

+0

'nullptr '을 전달할 수 있다고 생각 했습니까? 대화 상자는 어쨌든 정적 편의 메소드에 대한 어플리케이션 모달로 고정됩니다. – cmannett85

+0

그건 실제로 재미있는 생각입니다. 10 개 이상의 메시지 상자를 다시 작성하는 데 익숙하지 않은 API를 사용하는 것보다 훨씬 쉽습니다. P – ContingencyCoder

답변

5

그냥 첫 번째 매개 변수에 대한 NULL을 전달합니다

QMessageBox::critical(NULL, QObject::tr("Error"), QObject::tr("...")); 
2

nullptr를 전달하는 것보다 더 좋은 방법은 이미 네트워크 매니저 인스턴스의 부모가는 QWidget이라고 가정 (사용하고있는 QObject를 트리를 사용하는 것입니다하며 조정 이 위쪽으로 캐스팅 할 수없는 경우 QObject를 트리

QMessageBox::critical(qobject_cast<QWidget *> (parent()), "Title", "Message"); 

우리는 <> 대신 C 또는 C++ 스타일의 캐스트의 qobject_cast 사용)처럼 보이는 무엇에 따라 부모의 수는 because it adds a little protection and will return 0입니다 QWidget *.

당신은 최상위 창 (는 QWidget)보다는 실제로 NetworkManager 클래스의 QObject를 나무에서 높은 위로 나타난 창 위에 중심으로 QMessageBox이 나타납니다 nullptr를 사용하는 경우. 이것은 여러 모니터, 많은 윈도우가 열려있는 사람, 여러 모니터에 걸쳐있는 단일 응용 프로그램의 여러 윈도우 등을 실제로 괴롭 히고 있습니다.

+0

아주 좋은 생각입니다. 그러나 NetworkManager는 기본적으로 MainWindow에서 사용되므로 nullptr을 사용하는 것이 좋습니다. 나는 이것을 미래에도 생각할 것이다. – ContingencyCoder

관련 문제