2014-11-25 4 views
1

시스템 트레이에 표시하려는 Qt 응용 프로그램이 있습니다. 원하는 동작은 사용자가 응용 프로그램의 닫기 단추를 클릭하면 해당 응용 프로그램보다 시스템 트레이에 숨겨 지지만 종료되지 않습니다.QApplication에서 aboutToQuit 신호를 연결할 수 없습니다.

main.cpp에 내 코드는 다음과 같습니다

이제
if (QSystemTrayIcon::isSystemTrayAvailable()) 
    { 
    QObject *root = engine.rootObjects().at(0); 
    QQuickWindow *window = qobject_cast<QQuickWindow *>(root); 
    QAction *showAction = new QAction(QObject::tr("Show"), window); 
    window->connect(showAction, SIGNAL(triggered()), window, SLOT(show())); 
    QAction *hideAction = new QAction(QObject::tr("Hide"), window); 
    window->connect(hideAction, SIGNAL(triggered()), window, SLOT(hide())); 
    QAction *quitAction = new QAction(QObject::tr("&Quit"), window); 
    window->connect(quitAction, SIGNAL(triggered()), qApp, SLOT(quit())); 
    QObject::connect(qApp,SIGNAL(aboutToQuit()),window,SLOT(hide())); 

    QMenu *trayIconMenu = new QMenu(); 
    trayIconMenu->addAction(showAction); 
    trayIconMenu->addAction(hideAction); 
    trayIconMenu->addSeparator(); 
    trayIconMenu->addAction(quitAction); 

    QSystemTrayIcon *trayIcon = new QSystemTrayIcon(window); 
    trayIcon->setContextMenu(trayIconMenu); 
    trayIcon->setToolTip("xxx"); 
    trayIcon->setIcon(QIcon("xxx.png")); 
    trayIcon->show(); 
    } 

은 내가 QObject::connect(qApp,SIGNAL(aboutToQuit()),window,SLOT(hide())); 라인, 즉 트레이에 응용 프로그램을 aboutToQuit 신호를 연결하고 숨길 수 아니다 올바르지 않습니다하지만 난 오류를 받고 있지 않다 등 이 외에도 모든 것이 올바르게 작동하고 있습니다. 누군가 내가 뭘 잘못하고 있으며 원하는 동작을 어떻게 달성 할 수 있는지 말해주십시오. 연결 신호가 올바른지 또는 다른 신호에 연결해야하는지 여부를 알고 싶습니다. 미리 감사드립니다.

+0

왜 당신이 연결이 작동하지 않는 생각하십니까? 리턴 코드를 점검해야합니다. 그러나 어쨌든 앱을 종료하는 데 아무 것도하지 않았습니다. –

+0

내가 종료 할 때 앱을 멈추기 위해해야 ​​할 일을 알려주시겠습니까? 사용자가 닫기 버튼을 클릭하면 시스템 트레이에 숨기를 원합니다. – bourne

+0

@Nejat의 답변보기 - 당신의 가까운 이벤트를 차단해야합니다. 마지막 창을 닫고 닫히지 않도록합니다 (대신 시스템 트레이에 숨김). 또는 마지막 창을 닫을 때 종료합니다. –

답변

2

당신은 사용할 수 있습니다

qApp()->setQuitOnLastWindowClosed(false); 

quitOnLastWindowClosed 속성은 마지막 창을 닫을 때 종료 응용 프로그램을 원인 기본적으로 사실이다. false로 설정하면 주 창을 닫을 때 응용 프로그램이 종료되지 않습니다.

또한 close 이벤트를 무시, 주요 위젯의 closeEvent을 구현할 수 있으며, 당신의 창을 숨기 :

void MainWindow::closeEvent(QCloseEvent * e) 
{ 
    e->ignore(); 
    this->hide(); 
} 
+0

@bourne 문제가 해결 되었습니까? – Nejat

+0

closeEvent (QCloseEvent * e)를 사용하여 응용 프로그램을 종료하지 못하게 할 수 있습니까? 그것은 가능한가? – prakashpun