Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 无法连接来自QApplication的约ToQuit信号_C++_Qt_Qt5_Signals Slots_Qapplication - Fatal编程技术网

C++ 无法连接来自QApplication的约ToQuit信号

C++ 无法连接来自QApplication的约ToQuit信号,c++,qt,qt5,signals-slots,qapplication,C++,Qt,Qt5,Signals Slots,Qapplication,我想在系统托盘中显示一个Qt应用程序。 我期望的行为是,如果用户单击应用程序的关闭按钮,则该应用程序会隐藏在系统托盘中,但不会退出 我在main.cpp中的代码是: if (QSystemTrayIcon::isSystemTrayAvailable()) { QObject *root = engine.rootObjects().at(0); QQuickWindow *window = qobject_cast<QQuickWindow *>(root);

我想在系统托盘中显示一个Qt应用程序。 我期望的行为是,如果用户单击应用程序的关闭按钮,则该应用程序会隐藏在系统托盘中,但不会退出

我在
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();
   }
if(QSystemTrayIcon::isSystemTrayAvailable())
{
QObject*root=engine.rootObjects(),位于(0);
QQuickWindow*window=qobject_cast(根);
QAction*showAction=新QAction(QObject::tr(“显示”),窗口);
窗口->连接(显示动作、信号(已触发())、窗口、插槽(显示());
QAction*hideAction=新QAction(QObject::tr(“隐藏”),窗口);
窗口->连接(隐藏动作、信号(触发())、窗口、插槽(隐藏());
QAction*quitAction=新QAction(QObject::tr(“&Quit”),窗口);
窗口->连接(退出操作、信号(触发())、qApp、插槽(退出());
连接(qApp,信号(aboutToQuit()),窗口,插槽(hide());
QMenu*trayIconMenu=新QMenu();
trayIconMenu->addAction(显示动作);
trayIconMenu->addAction(隐藏动作);
trayIconMenu->addSeparator();
trayIconMenu->addAction(退出操作);
QSystemTrayIcon*trayIcon=新QSystemTrayIcon(窗口);
trayIcon->setContextMenu(trayIconMenu);
trayIcon->setToolTip(“xxx”);
trayIcon->setIcon(QIcon(“xxx.png”);
trayIcon->show();
}
现在我无法连接关于退出的
信号并将应用程序隐藏在托盘中,即
连接(qApp,信号(aboutToQuit()),窗口,插槽(hide())行不正确,但我没有收到任何错误等。
除此之外,一切都正常工作。有人能告诉我我做错了什么,我怎样才能达到我想要的行为吗。
我还想知道我是否有正确的信号连接,或者我是否应该尝试连接到其他信号。
提前感谢。

您可以使用:

qApp()->setQuitOnLastWindowClosed(false);
quitOnLastWindowClosed
属性默认为true,这会导致应用程序在最后一个窗口关闭时退出。通过将其设置为false,应用程序不会在关闭主窗口时终止

您还可以重新实现主窗口小部件的
closeEvent
,忽略关闭事件并隐藏窗口:

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

为什么你认为连接不起作用?你应该检查返回码。但是,你没有做任何事情来阻止应用程序退出。你能告诉我我需要做什么来阻止应用程序退出,我只想在用户单击关闭按钮时将其隐藏在系统托盘中查看@Nejat的答案-你应该在上一个窗口截获关闭事件并防止其关闭(改为隐藏到系统托盘),或在上次窗口关闭时禁用退出。如何使用closeEvent(QCloseEvent*e)停止应用程序退出?是否可能?