2016-11-03 4 views
1

QMainWindowQQuickWidget이 포함되어 있습니다.
은 앱의 상태 (초기화 여부)에 따라 두 가지 qml (splash.qmlmain.qml)을 표시합니다.왜 Qt :: SplashScreen 플래그를 설정하면 닫는 것을 막을 수 있습니까?

은 내가 splash.qml가 표시 될 때 내 방 창문이 스플래시 스크린 모드로 원하는, 그래서 내가 그랬어 : 초기화가 수행되며 다른 QML 파일이로드 될 때

MainWindow::MainWindow(QMainWindow * parent) :QMainWindow(parent) 
{ 
    QApplication::setAttribute(Qt::AA_DontCreateNativeWidgetSiblings); 

    mDefaultFlags = windowFlags(); 
    setAttribute(Qt::WA_DeleteOnClose, true); 
    setWindowFlags(Qt::SplashScreen); 

    mQuickWidget = new QQuickWidget(this); 
    //... 
    setCentralWidget(mQuickWidget); 

    mQuickWidget->show(); 
} 

QML은 슬롯을 트리거합니다. 그때되는 SplashScreen에서 돌아가 기본 값으로 플래그를 재설정 :

void MainWindow::UpdateWindowAfterInit() 
{ 
    setWindowFlags(mDefaultFlags); 
    show(); 
} 

모든 예상대로 간다,하지만 난 내 응용 프로그램을 닫으려고 할 때 돈 나는 경우가 잘 닫습니다 반면 그것은 main()의 끝에 도달하지 Qt::SplashScreen 플래그를 적용하십시오.

내 응용 프로그램을 종료하려면 어떻게해야합니까?

+1

사용해보십시오'Qt는 :: FramelessWindowHint' 대신'Qt는 :: SplashScreen' 플래그. 이것은 QT의 버그 일 수 있습니다. – Steeve

답변

1

우선 무엇이 예상대로 작동하지 않는지 이해하려고합시다. QWidget::closedocumentation보고

, 우리는 다음과 같은 한 (중점 광산) :

QApplication::lastWindowClosed() 신호가 방출 될 때 Qt::WA_QuitOnClose에 마지막으로 볼 수 주 창 (부모를 가지지 즉 창) 속성 세트가 닫힙니다. 기본적으로이 속성은 스플래시 화면과 같은 임시 창을 제외한 모든 위젯, 도구 창 및 팝업 메뉴에 대해 설정됩니다. 다른 측면에서

, 우리는 Qt::WA_QuitOnClose이 있습니다

는 속성 세트의 마지막 위젯이 closeEvent()을 수락 할 때 Qt는 응용 프로그램을 종료 만든다. 이 동작은 QApplication::quitOnLastWindowClosed 속성을 사용하여 수정할 수 있습니다. 기본적으로이 속성은 Qt::Window 유형의 모든 위젯에 대해 설정됩니다.

따라서 용의자는 플래그를 변경하면 설정 한 속성 또는 설정 한 것으로 간주되는 속성이 실제로 재설정된다는 것입니다.

  • HeresetWindowFlags의 실제 구현 : 코드를보고

    , 우리는 다음과 같은 있습니다. 이전 유형이 인 경우 (즉, Qt::Window 플래그가 설정되어 있고 그 경우) 함수 adjustQuitOnCloseAttribute이 호출됨을 알 수 있습니다.

  • HereadjustQuitOnCloseAttribute의 실제 구현이 발생합니다 :

    // ... 
    
    if (type != Qt::Widget && type != Qt::Window && type != Qt::Dialog) 
        q->setAttribute(Qt::WA_QuitOnClose, false); 
    
    // ... 
    

    이는 깃발 Qt::SplashScreen을 설정할 때이 속성 Qt::WA_QuitOnClosefalse로 설정을 의미합니다.

마지막으로, 우리는 Qt::WA_DeleteOnClose에 대해 다음 한 :

는 위젯이 close 이벤트를 수락했습니다의 Qt (QWidget::closeEvent() 참조)이 위젯을 삭제 만듭니다. 당신은 더 이상 Qt::WA_QuitOnClose 설정이없는 경우

이 창은 더 이상 close 이벤트도지지 않습니다 그것은 파괴되지 않는다.

더 중요한 것은 닫히지 않았습니다. 즉, 응용 프로그램에서 관찰 한 것입니다. 이것은 Qt의 버그가 아니며, 문서화 된 의도 된 동작입니다.


이제 우리는 문제를 해결하기 위해 무엇을해야하는지 파악할 수 있습니다.

아마도 올바른 플래그와 속성을 올바른 순서로 설정하면 문제를 해결할 수 있습니다.
나는 그것에 대해 확실하지 않다,하지만 당신은 그것을 시도를 제공 할 수 있습니다 :

setWindowFlags(Qt::SplashScreen); 
setAttribute(Qt::WA_QuitOnClose, true); 
setAttribute(Qt::WA_DeleteOnClose, true); 
+0

실제로 Qt :: WA_QuitOnClose 속성을 true로 설정하면 문제가 해결됩니다. 감사합니다. – grunk

+0

@grunk 그것이 작동한다는 것을 알고 기쁩니다. 이유에 대한 통찰력을 줄뿐만 아니라 예상했던대로 작동하지 않는 이유를 더 잘 이해하려고 노력했습니다. 도움이되기를 바랍니다. ;-) – skypjack

+0

qt 지원에 대한 Btw 응답 : "이것은 문제의 원인이며 실제로는 이 이미이 문제를 처리 했어야 Qt의 버그입니다. 여기에서이 패치를 온라인으로 추적 할 수 있습니다 :" https ://codereview.qt-project.org/176665 – grunk