QSystemTrayIcon in Qt Quick application
-
Hi,
I have a QML application with a system tray icon... When the Windows 7 shuts down the main window goes into the tray and prevents Windows to continue. When the application is already in a tray then Windows shuts down properly.
Please suggest something to avoid this behaviour.
Thanks.
-
It's like in this example: doc.trolltech.com/4.2/desktop-systray.html
@class QmlAppView : public QmlApplicationViewer
{
Q_OBJECT
public:
explicit QmlAppView(QWidget *parent = 0);protected:
virtual bool event(QEvent * event);private:
void createActions();
void createTrayIcon();
void setIcon();
void closeEvent(QCloseEvent *);
QSystemTrayIcon *trayIcon;
QMenu *trayIconMenu;
QAction *minimize;
QAction *open;
QAction *close;signals:
private slots:
void trayIconClicked(QSystemTrayIcon::ActivationReason);
};@@QmlAppView::QmlAppView(QWidget *parent) :
QmlApplicationViewer(parent)
{
createActions();
createTrayIcon();
setIcon();trayIcon->show();
}bool QmlAppView::event(QEvent *event)
{
if (event->type() == QEvent::RequestSoftwareInputPanel ||
event->type() == QEvent::CloseSoftwareInputPanel)
{
//qDebug() << event;
}
return QmlApplicationViewer::event(event);
}void QmlAppView::createActions()
{
minimize = new QAction(tr("Mi&nimize"), this);
connect(minimize, SIGNAL(triggered()), this, SLOT(hide()));open = new QAction(tr("&Open"), this); connect(open, SIGNAL(triggered()), this, SLOT(show())); close = new QAction(tr("&Quit"), this); connect(close, SIGNAL(triggered()), qApp, SLOT(quit()));
}
void QmlAppView::createTrayIcon()
{
trayIconMenu = new QMenu(this);trayIconMenu->addAction(open); trayIconMenu->addAction(minimize); trayIconMenu->addSeparator(); trayIconMenu->addAction(close); trayIcon = new QSystemTrayIcon(this); trayIcon->setContextMenu(trayIconMenu); connect( trayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(trayIconClicked(QSystemTrayIcon::ActivationReason)) );
}
void QmlAppView::setIcon()
{
trayIcon->setIcon(QIcon(":/qml/images/app.png"));
}void QmlAppView::trayIconClicked(QSystemTrayIcon::ActivationReason reason)
{
if(reason == QSystemTrayIcon::Trigger)
this->show();
}void QmlAppView::closeEvent(QCloseEvent *event)
{
if (trayIcon->isVisible()) {
trayIcon->showMessage(tr("Systray"),
tr("This application is still running. To quit please click this icon and select Quit"));
hide();event->ignore(); // Don't let the event propagate to the base class }
}
@ -
Yes, it is exactly like you said.
This code should work:
@void QmlAppView::closeEvent(QCloseEvent *event)
{
if (!event->spontaneous() && trayIcon->isVisible()) {
trayIcon->showMessage(tr("Systray"),
tr("This application is still running. To quit please click this icon and select Quit"));
hide();event->ignore(); }
}@
And it works, but not every time. I'm still missing something... -
It is weird, but now it works for all cases. But why?
@void QmlAppView::closeEvent(QCloseEvent *event)
{
if (trayIcon->isVisible()) {
trayIcon->showMessage(tr("Systray"),
tr("This application is still running. To quit please click this icon and select Quit"));
hide();//event->ignore(); }
}@