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

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

Прежде всего создадим стандартный 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);

 

Похожий код:

Фото аватара
Алексей Петров

Программист, разработчик с 5 летним опытом работы. Учусь на разработчика игр на Unity и разработчика VR&AR реальности (виртуальной реальности). Основные языки программирования: C#, C++.

Оцените автора
Бла, бла код
Добавить комментарий