У меня есть приложение 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()));
строка не верна, но я не получаю никаких ошибок и т. д.
Кроме этого, все работает правильно. Может кто-нибудь сказать мне, что я делаю неправильно и как мне добиться желаемого поведения.
Я также хотел бы знать, есть ли у меня правильный сигнал для подключения или я должен попробовать подключиться к другому сигналу.
Заранее спасибо.
Ты можешь использовать :
qApp()->setQuitOnLastWindowClosed(false);
quitOnLastWindowClosed
свойство имеет значение true по умолчанию, что приводит к закрытию приложения при закрытии последнего окна. Если установить значение false, приложение не будет закрываться при закрытии главного окна.
Вы также можете переопределить closeEvent
вашего основного виджета, игнорируйте событие close и просто скройте свое окно:
void MainWindow::closeEvent(QCloseEvent * e)
{
e->ignore();
this->hide();
}