Иконка приложения в трее системы на 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);

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

Комментарии

чт, 11/22/2012 - 14:10

спасибо

чт, 11/22/2012 - 14:10

а как вывобить сообщение из трея?

чт, 11/22/2012 - 14:10

заметил забавный глюк хотя может это что то не так делаю

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

но это не работает под ubuntu


 

сб, 11/09/2013 - 23:11
Олег

работает проверил... ubuntu 12.04 Qt5.1

вт, 02/25/2014 - 02:07
Михаил

Под убунтой 13.10 точно не работает, икони попросту нет, и тогда программу нужно закрывать из системного монитора. Глюк Каноникал и их новой убунты.

Добавить комментарий

Plain text

  • HTML-теги не обрабатываются и показываются как обычный текст
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Строки и параграфы переносятся автоматически.
CAPTCHA
Введи эти символы. Ато роботы одолели!