Решил описать действия необходимые для отображения иконки вашего приложения в трее системы… Пока решал, решил что стоит показать ещё как показывать/скрывать главное окно программы.
Приступим.
Прежде всего создадим стандартный 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);