C++/Qt/QSystemTrayIcon

Материал из C\C++ эксперт
Перейти к: навигация, поиск

System tray icon

<source lang="cpp"> /****************************************************************************

    • 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$
                                                                                                                                                        • /
  1. ifndef WINDOW_H
  2. define WINDOW_H
  3. include <QSystemTrayIcon>
  4. 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;

};

  1. endif


  1. include <QtGui>
  2. 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 Quit 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);

}


  1. include <QtGui>
  2. 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();

}


 </source>