Иконка приложения в трее системы на Qt

Сообщение об ошибке

Deprecated function: The each() function is deprecated. This message will be suppressed on further calls в функции menu_set_active_trail() (строка 2405 в файле /home/ih139182/public_html/includes/menu.inc).

Решил описать действия необходимые для отображения иконки вашего приложения в трее системы... Пока решал, решил что стоит показать ещё как показывать/скрывать главное окно программы.
Приступим.

Прежде всего создадим стандартный GUI проект Qt. В форму можете набросать любые виджеты, они нам роли не сыграют...
Перейдите к редактированию заголовочного файла класса главного окна. Если ни чего не меняли - mainwindow.h
В этом файле описываются класс главного окна. У меня он имел вот такое барахлишко:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
    class MainWindow;
}

class MainWindow : public QMainWindow {
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

Нам понадобится видоизменить его, чтобы достичь необходимой цели. Cкажу, что хочу сделать так, чтобы приложение скрывалось/показывалось по клику по иконке в трее. Возможно это не самый лучший вариант, но таким образом я смогу показать все необходимые аспекты дела.
Иконка создаётся при помощи класса QSystemTrayIcon.
Подключим необходимую библиотеку:

#include <QSystemTrayIcon>

Теперь добавим указатель на элемент этого класса в private секцию класса:

QSystemTrayIcon *trIcon;

Теперь перейдите в файл mainwindow.cpp и добавте строки:

trIcon = new QSystemTrayIcon();  //инициализируем объект
trIcon->setIcon(QIcon(":/img/icon.png"));  //устанавливаем иконку
trIcon->show();  //отображаем объект

в конструктор MainWindow.

Если сейчас вы скомпилируете проект, увидите иконку приложения в трее. Примерно вот так:

Теперь немного обработаем события, добавим возможность скрывать/показывать окно программы по клику по иконке.
Для этого создадим слот showHide в описание класса MainWindow в файле mainwindow.h:

private slots:
    void showHide(QSystemTrayIcon::ActivationReason);

И приступим к его реализации в файле mainwindow.cpp:

void MainWindow::showHide(QSystemTrayIcon::ActivationReason r) {
    if (r==QSystemTrayIcon::Trigger)  //если нажато левой кнопкой продолжаем
    if (!this->isVisible()) {  //если окно было не видимо - отображаем его
        this->show();
    } else {
        this->hide();  //иначе скрываем
    }
}

Теперь осталось только связать сигнал клика по иконке и слот скрытия/показа.
Сделаем это в конструкторе таким образом:

connect(trIcon,SIGNAL(activated(QSystemTrayIcon::ActivationReason)),this,SLOT(showHide(QSystemTrayIcon::ActivationReason)));

Мы используем событие активации иконки в трее - QSystemTrayIcon::ActivationReason. Оно может принять несколько значений:


QSystemTrayIcon::Unknown 0 Unknown reason
QSystemTrayIcon::Context 1 The context menu for the system tray entry was requested
QSystemTrayIcon::DoubleClick 2 The system tray entry was double clicked
QSystemTrayIcon::Trigger 3 The system tray entry was clicked
QSystemTrayIcon::MiddleClick 4 The system tray entry was clicked with the middle mouse button

В реализации же указываем, что скрывать/показывать окно будем только, если пользователь кликнул левой клавишей мыши по иконке в трее - QSystemTrayIcon::Trigger

Окомпилируйте, всё должно работать...

Вот мой проект: скачать

ps Чтобы приложение не закрывалось при закрытии последнего окна, а оставалось "висеть" в трее укажите в функции main вашего приложения:

QApplication::setQuitOnLastWindowClosed(false);

Просмотров:   10350