无法连接来自 QApplication 的 aboutToQuit 信号

Posted

技术标签:

【中文标题】无法连接来自 QApplication 的 aboutToQuit 信号【英文标题】:Not able to connect aboutToQuit signal from QApplication 【发布时间】:2014-11-25 23:59:08 【问题描述】:

我有一个想要在系统托盘中显示的 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();
   

现在我无法连接aboutToQuit 信号并将应用程序隐藏在托盘中,即 QObject::connect(qApp,SIGNAL(aboutToQuit()),window,SLOT(hide())); 行不正确,但我没有收到任何错误等。 除此之外,一切正常。有人可以告诉我我做错了什么以及如何实现我想要的行为。 我还想知道我是否有正确的信号来连接,或者我是否应该尝试连接到其他信号。 提前致谢。

【问题讨论】:

为什么您认为连接不起作用?您应该检查返回码。但是,您并没有采取任何措施来阻止应用退出。 你能告诉我我需要做什么来阻止应用程序退出,我只是希望它在用户单击关闭按钮时隐藏在系统托盘中 【参考方案1】:

你可以使用:

qApp()->setQuitOnLastWindowClosed(false);

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

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

void MainWindow::closeEvent(QCloseEvent * e)

    e->ignore();
    this->hide();

【讨论】:

如何使用 closeEvent(QCloseEvent * e) 阻止应用程序退出?有可能吗?

以上是关于无法连接来自 QApplication 的 aboutToQuit 信号的主要内容,如果未能解决你的问题,请参考以下文章

电脑一键重装糸统出现write protect error reading drive C Abo

如何在PySide / PyQt中连接QApplication()和QWidget()对象?

QApplication无显示

没有 QApplication 无法创建 QWidget

无法打开源文件QtWidgets/QApplication

PyQT Python 错误 - 无法在没有 QApplication 的情况下创建 QWidget