Разработаем простую Qt-программу, которая использует иконку в системном трее. Для этого воспользуемся классом QSystemTrayIcon
. Приложение будет состоять из двух частей: виджета с одной кнопкой Show message
и иконки в системном трее.
Особенности реализации:
Exit
, который завершает работу приложения;Заголовочный файл mainwidget.h
:
#ifndef MAINWIDGET_H
#define MAINWIDGET_H
#include <QWidget>
#include <QSystemTrayIcon>
namespace Ui {
class MainWidget;
}
class MainWidget : public QWidget {
Q_OBJECT
public:
explicit MainWidget( QWidget* parent = 0 );
~MainWidget();
void closeEvent( QCloseEvent* event );
private slots:
void onTrayIconActivated( QSystemTrayIcon::ActivationReason reason );
void onShowMessageInTray();
private:
Ui::MainWidget* ui;
QSystemTrayIcon* m_trayIcon;
};
#endif // MAINWIDGET_H
Указатель на QSystemTrayIcon
мы объявляем полем класса главного виджета. Для реагирования на щелчки мышью по иконке в системном трее мы подготовили слот onTrayIconActivated()
. Обработчиком щелчка по кнопке на виджете становится слот onShowMessageInTray()
.
Чтобы приложение не завершало работу при закрытии главного виджета, мы переопределяем обработчик события closeEvent()
.
Реализация mainwidget.cpp
:
#include "mainwidget.h"
#include "ui_mainwidget.h"
#include <QIcon>
#include <QMenu>
#include <QCloseEvent>
MainWidget::MainWidget( QWidget* parent ) :
QWidget( parent ),
ui( new Ui::MainWidget ) {
ui->setupUi( this );
connect( ui->bnShowMsg, SIGNAL( clicked( bool ) ), SLOT( onShowMessageInTray() ) );
m_trayIcon = new QSystemTrayIcon( QIcon( ":/images/tray_icon.ico" ), this );
connect(
m_trayIcon,
SIGNAL( activated( QSystemTrayIcon::ActivationReason ) ),
SLOT( onTrayIconActivated( QSystemTrayIcon::ActivationReason ) )
);
QMenu* menu = new QMenu;
QAction* exitAction = menu->addAction( "Exit" );
connect( exitAction, SIGNAL( triggered( bool ) ), qApp, SLOT( quit() ) );
m_trayIcon->setContextMenu( menu );
m_trayIcon->show();
}
MainWidget::~MainWidget() {
delete ui;
}
void MainWidget::closeEvent( QCloseEvent* event ) {
hide();
event->ignore();
}
void MainWidget::onTrayIconActivated( QSystemTrayIcon::ActivationReason reason ) {
switch( reason ) {
case QSystemTrayIcon::Trigger:
setVisible( !isVisible() );
break;
default:
break;
}
}
void MainWidget::onShowMessageInTray() {
m_trayIcon->showMessage( "Message title", "Message text", QSystemTrayIcon::Information );
}
Инициализация иконки в трее осуществляется в конструкторе MainWidget
. Она состоит из нескольких частей: установка изображения (tray_icon.ico
, помещенного в ресурсы), задание родителя (для избежания утечек памяти), привязка сигнала activated()
к слоту-обработчику и добавление контекстного меню.
Оставшаяся часть реализации достаточно тривиальна, поэтому в дополнительных пояснениях не нуждается.
Скачать пример использования QSystemTrayIcon в Qt-приложении
А возможно сделать радио плеер в Qt 4.8 ?
Здравствуйте. Спасибо за комментарий.
Класс QRadioTuner не входит в стандартный комплект Qt 4.8. Если нет зависимостей от сторонних библиотек, то лучше перейти на Qt 5 (имеется практически полная обратная совместимость). Если же есть ограничения на использование именно Qt 4.8, то можно задействовать библиотеки 3-ей стороны.
С наступающим =)
Спасибо =) Всех читателей с наступающим!
Anonymous
Спасибо полезная статья =)