Mega Code Archive

 
Categories / C++ / Qt
 

System tray icon

/**************************************************************************** ** ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial Usage ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Commercial License Agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Nokia. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file.  Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain additional ** rights.  These rights are described in the Nokia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file.  Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** If you have questions regarding the use of this file, please contact ** Nokia at qt-info@nokia.com. ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef WINDOW_H #define WINDOW_H #include <QSystemTrayIcon> #include <QDialog> QT_BEGIN_NAMESPACE class QAction; class QCheckBox; class QComboBox; class QGroupBox; class QLabel; class QLineEdit; class QMenu; class QPushButton; class QSpinBox; class QTextEdit; QT_END_NAMESPACE class Window : public QDialog {     Q_OBJECT public:     Window();     void setVisible(bool visible); protected:     void closeEvent(QCloseEvent *event); private slots:     void setIcon(int index);     void iconActivated(QSystemTrayIcon::ActivationReason reason);     void showMessage();     void messageClicked(); private:     void createIconGroupBox();     void createMessageGroupBox();     void createActions();     void createTrayIcon();     QGroupBox *iconGroupBox;     QLabel *iconLabel;     QComboBox *iconComboBox;     QCheckBox *showIconCheckBox;     QGroupBox *messageGroupBox;     QLabel *typeLabel;     QLabel *durationLabel;     QLabel *durationWarningLabel;     QLabel *titleLabel;     QLabel *bodyLabel;     QComboBox *typeComboBox;     QSpinBox *durationSpinBox;     QLineEdit *titleEdit;     QTextEdit *bodyEdit;     QPushButton *showMessageButton;     QAction *minimizeAction;     QAction *maximizeAction;     QAction *restoreAction;     QAction *quitAction;     QSystemTrayIcon *trayIcon;     QMenu *trayIconMenu; }; #endif #include <QtGui> #include "window.h" Window::Window() {     createIconGroupBox();     createMessageGroupBox();     iconLabel->setMinimumWidth(durationLabel->sizeHint().width());     createActions();     createTrayIcon();     connect(showMessageButton, SIGNAL(clicked()), this, SLOT(showMessage()));     connect(showIconCheckBox, SIGNAL(toggled(bool)),             trayIcon, SLOT(setVisible(bool)));     connect(iconComboBox, SIGNAL(currentIndexChanged(int)),             this, SLOT(setIcon(int)));     connect(trayIcon, SIGNAL(messageClicked()), this, SLOT(messageClicked()));     connect(trayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)),             this, SLOT(iconActivated(QSystemTrayIcon::ActivationReason)));     QVBoxLayout *mainLayout = new QVBoxLayout;     mainLayout->addWidget(iconGroupBox);     mainLayout->addWidget(messageGroupBox);     setLayout(mainLayout);     iconComboBox->setCurrentIndex(1);     trayIcon->show();     setWindowTitle(tr("Systray"));     resize(400, 300); } void Window::setVisible(bool visible) {     minimizeAction->setEnabled(visible);     maximizeAction->setEnabled(!isMaximized());     restoreAction->setEnabled(isMaximized() || !visible);     QDialog::setVisible(visible); } void Window::closeEvent(QCloseEvent *event) {     if (trayIcon->isVisible()) {         QMessageBox::information(this, tr("Systray"),                                  tr("The program will keep running in the "                                     "system tray. To terminate the program, "                                     "choose <b>Quit</b> in the context menu "                                     "of the system tray entry."));         hide();         event->ignore();     } } void Window::setIcon(int index) {     QIcon icon = iconComboBox->itemIcon(index);     trayIcon->setIcon(icon);     setWindowIcon(icon);     trayIcon->setToolTip(iconComboBox->itemText(index)); } void Window::iconActivated(QSystemTrayIcon::ActivationReason reason) {     switch (reason) {     case QSystemTrayIcon::Trigger:     case QSystemTrayIcon::DoubleClick:         iconComboBox->setCurrentIndex((iconComboBox->currentIndex() + 1)                                       % iconComboBox->count());         break;     case QSystemTrayIcon::MiddleClick:         showMessage();         break;     default:         ;     } } void Window::showMessage() {     QSystemTrayIcon::MessageIcon icon = QSystemTrayIcon::MessageIcon(             typeComboBox->itemData(typeComboBox->currentIndex()).toInt());     trayIcon->showMessage(titleEdit->text(), bodyEdit->toPlainText(), icon,                           durationSpinBox->value() * 1000); } void Window::messageClicked() {     QMessageBox::information(0, tr("Systray"),                              tr("Sorry, I already gave what help I could.\n"                                 "Maybe you should try asking a human?")); } void Window::createIconGroupBox() {     iconGroupBox = new QGroupBox(tr("Tray Icon"));     iconLabel = new QLabel("Icon:");     iconComboBox = new QComboBox;     iconComboBox->addItem(QIcon(":/images/bad.svg"), tr("Bad"));     iconComboBox->addItem(QIcon(":/images/heart.svg"), tr("Heart"));     iconComboBox->addItem(QIcon(":/images/trash.svg"), tr("Trash"));     showIconCheckBox = new QCheckBox(tr("Show icon"));     showIconCheckBox->setChecked(true);     QHBoxLayout *iconLayout = new QHBoxLayout;     iconLayout->addWidget(iconLabel);     iconLayout->addWidget(iconComboBox);     iconLayout->addStretch();     iconLayout->addWidget(showIconCheckBox);     iconGroupBox->setLayout(iconLayout); } void Window::createMessageGroupBox() {     messageGroupBox = new QGroupBox(tr("Balloon Message"));     typeLabel = new QLabel(tr("Type:"));     typeComboBox = new QComboBox;     typeComboBox->addItem(tr("None"), QSystemTrayIcon::NoIcon);     typeComboBox->addItem(style()->standardIcon(             QStyle::SP_MessageBoxInformation), tr("Information"),             QSystemTrayIcon::Information);     typeComboBox->addItem(style()->standardIcon(             QStyle::SP_MessageBoxWarning), tr("Warning"),             QSystemTrayIcon::Warning);     typeComboBox->addItem(style()->standardIcon(             QStyle::SP_MessageBoxCritical), tr("Critical"),             QSystemTrayIcon::Critical);     typeComboBox->setCurrentIndex(1);     durationLabel = new QLabel(tr("Duration:"));     durationSpinBox = new QSpinBox;     durationSpinBox->setRange(5, 60);     durationSpinBox->setSuffix(" s");     durationSpinBox->setValue(15);     durationWarningLabel = new QLabel(tr("(some systems might ignore this "                                          "hint)"));     durationWarningLabel->setIndent(10);     titleLabel = new QLabel(tr("Title:"));     titleEdit = new QLineEdit(tr("Cannot connect to network"));     bodyLabel = new QLabel(tr("Body:"));     bodyEdit = new QTextEdit;     bodyEdit->setPlainText(tr("Don't believe me. Honestly, I don't have a "                               "clue.\nClick this balloon for details."));     showMessageButton = new QPushButton(tr("Show Message"));     showMessageButton->setDefault(true);     QGridLayout *messageLayout = new QGridLayout;     messageLayout->addWidget(typeLabel, 0, 0);     messageLayout->addWidget(typeComboBox, 0, 1, 1, 2);     messageLayout->addWidget(durationLabel, 1, 0);     messageLayout->addWidget(durationSpinBox, 1, 1);     messageLayout->addWidget(durationWarningLabel, 1, 2, 1, 3);     messageLayout->addWidget(titleLabel, 2, 0);     messageLayout->addWidget(titleEdit, 2, 1, 1, 4);     messageLayout->addWidget(bodyLabel, 3, 0);     messageLayout->addWidget(bodyEdit, 3, 1, 2, 4);     messageLayout->addWidget(showMessageButton, 5, 4);     messageLayout->setColumnStretch(3, 1);     messageLayout->setRowStretch(4, 1);     messageGroupBox->setLayout(messageLayout); } void Window::createActions() {     minimizeAction = new QAction(tr("Mi&nimize"), this);     connect(minimizeAction, SIGNAL(triggered()), this, SLOT(hide()));     maximizeAction = new QAction(tr("Ma&ximize"), this);     connect(maximizeAction, SIGNAL(triggered()), this, SLOT(showMaximized()));     restoreAction = new QAction(tr("&Restore"), this);     connect(restoreAction, SIGNAL(triggered()), this, SLOT(showNormal()));     quitAction = new QAction(tr("&Quit"), this);     connect(quitAction, SIGNAL(triggered()), qApp, SLOT(quit())); } void Window::createTrayIcon() {     trayIconMenu = new QMenu(this);     trayIconMenu->addAction(minimizeAction);     trayIconMenu->addAction(maximizeAction);     trayIconMenu->addAction(restoreAction);     trayIconMenu->addSeparator();     trayIconMenu->addAction(quitAction);     trayIcon = new QSystemTrayIcon(this);     trayIcon->setContextMenu(trayIconMenu); } #include <QtGui> #include "window.h" int main(int argc, char *argv[]) {     Q_INIT_RESOURCE(systray);     QApplication app(argc, argv);     if (!QSystemTrayIcon::isSystemTrayAvailable()) {         QMessageBox::critical(0, QObject::tr("Systray"),                               QObject::tr("I couldn't detect any system tray "                                           "on this system."));         return 1;     }     QApplication::setQuitOnLastWindowClosed(false);     Window window;     window.show();     return app.exec(); }