Сворачивание Qt Qml приложения в System Tray

2017/06/21

В новой версии Qt 5.9.0 появилась поддержка system tray. До этого приходилось использовать QSystemTrayIcon из состава виджетов. Теперь все намного проще. Ниже небольшой пример. При нажатии на кнопку закрытия приложения, приложение будет светнуто в system tray - в общем стандартное поведение. Так же, при запуске должно появится системное уведомление.

import QtQuick 2.7
import QtQuick.Controls 2.0
import QtQuick.Layouts 1.3
import Qt.labs.platform 1.0

ApplicationWindow {
    property string appTitle: "Example"

    id: window
    visible: true
    width: 640
    height: 480
    title: qsTr(appTitle)

    SystemTrayIcon {
        visible: true
        iconSource: "qrc:/favicon.ico"
        tooltip: appTitle

        menu: Menu {
            MenuItem {
                text: qsTr("Quit")
                onTriggered: Qt.quit()
            }
        }

        onMessageClicked: console.log("Message clicked")
        Component.onCompleted: {
            console.log(supportsMessages)
            showMessage("Message title", "Something important came up. Click this to know more.")
        }

        onActivated: {
            console.log(reason)
            if(reason !== SystemTrayIcon.Context) {
                window.show()
                window.raise()
                window.requestActivate()
            }
        }
    }

    onClosing: {
        close.accepted = false
        window.hide()
    }

}

Ну и теперь пару ложек дегтя. В функции вывода системного сообщения есть параметр - время показа этого сообщения, но в windows 10 его значение не влияет. Так же в qml api нет возможности задать тип системного сообщения. Например, в той же windows 10 по умолчанию тип - INFO, и его ни как не поменять. А если нужно сообщить пользователю об ошибке? И последнее, в сигнале Activated параметр reason undefined. Из - за этого мне не удалось реализовать сценарий, если пользователь кликает левой кнопкой мыши по иконке приложения в системном трее, приложение разворачивается, правой - открывается контекстное меню.

Category: Qt Tagged: Qt