From 502673ab3a22938c5284b17c9abbb73d848c0005 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Fri, 9 Mar 2012 09:40:57 +0100 Subject: [PATCH] Re-add the Systray example. Remove its dependency on QtSvg by converting the icons to (optimized) png files. Change-Id: If63257938dc816d7ab76a3042b9ac88ef3d51b07 Reviewed-by: Friedemann Kleint --- examples/desktop/desktop.pro | 2 +- examples/desktop/systray/images/bad.png | Bin 0 -> 2496 bytes examples/desktop/systray/images/heart.png | Bin 0 -> 25780 bytes examples/desktop/systray/images/trash.png | Bin 0 -> 12128 bytes examples/desktop/systray/main.cpp | 63 +++++++ examples/desktop/systray/systray.pro | 14 ++ examples/desktop/systray/systray.qrc | 7 + examples/desktop/systray/window.cpp | 270 ++++++++++++++++++++++++++++++ examples/desktop/systray/window.h | 112 +++++++++++++ 9 files changed, 467 insertions(+), 1 deletion(-) create mode 100644 examples/desktop/systray/images/bad.png create mode 100644 examples/desktop/systray/images/heart.png create mode 100644 examples/desktop/systray/images/trash.png create mode 100644 examples/desktop/systray/main.cpp create mode 100644 examples/desktop/systray/systray.pro create mode 100644 examples/desktop/systray/systray.qrc create mode 100644 examples/desktop/systray/window.cpp create mode 100644 examples/desktop/systray/window.h diff --git a/examples/desktop/desktop.pro b/examples/desktop/desktop.pro index fc23208..adfa51f 100644 --- a/examples/desktop/desktop.pro +++ b/examples/desktop/desktop.pro @@ -1,6 +1,6 @@ TEMPLATE = subdirs CONFIG += ordered -SUBDIRS = screenshot +SUBDIRS = screenshot systray # install target.path = $$[QT_INSTALL_EXAMPLES]/qtbase/desktop diff --git a/examples/desktop/systray/images/bad.png b/examples/desktop/systray/images/bad.png new file mode 100644 index 0000000000000000000000000000000000000000..c8701a241a458d257e2e71c3d1af06007927fb86 GIT binary patch literal 2496 zcmZ`*cQ_S_8-A@EBxGb|ud^)M5P!1g#**la`B%_oOp(0tiX^3klA>AVs zHx<>vEpci1xqscie(&>s@B4h?&+mJl@2riL87I3iI{;4d0g~OO7jH%bfoW3{+MRSa zjUmL&%ouggMCUgXHtGS_kj>#g{|yFXg)0%8Mb=QVr3vdK6B}VCktAnz17IArv2ZZi zZ2dnlFo2N(OpIV=1Pc?kY?2wQ%pkCUjRovmz`=^Gtl%VI8v$Hw;ARI8JGOIxmjirT z!OsZ+PVCqQ!EF%Yf-pBkxFO1eojefR4sl*c@IsOgQhbo+hl~JZ1t7Nr@;jg)h+RV1 zEd)hjC<#MZ1S+CX6$No8)OO-GF{q0}LmZkC(2{_*By^;pD+N7i?2*P^8R*NxKoM8c^E5TzXC|RV6qFQyJ4mXvJws|!CV;@DzH?6l`5=NVMBzi8tl|y{~H|D;j94{ zO}J{pO$&##;jWFtIyj;O4_$cb!AlR`dvHu2eg^P2!0~-JVTb@jP>c|0gdk&_+z;x0 z1d|YAf>2Y0nIhZ_r_B&aMid#*2NAPLbHth>&I0ikNU%hrC6cU=Y>gCaq}m|O7U_04 zXO9efWIN)#6LOq!(FJ*~xa5j_HxwR1kvocy;OY@v^FWCQNo-kKZ=T@sPx7S zA5{6^rY~;$q1GRFj-&nr?w&wH02%|(L_u>PS_07;g!@#qQSl%c4}L9V=)|ykvNRT<3&8i67Vtse|gGVB035pznTaAxwH;v&L}L+>ErO*}CWeY_TJgj2t3f(TmqS@*MfPYj67s20GZZ zGyieMgyjimpUrTuyBmLVmrTFLfX2YV!TymKcAKivuzj%K;;zI60?FQR#d3wgw8-oI z)p*I5h3^h8oLV53JQx}(UX3e?e6xD(YjH@G$3B(+;5@eTbX)p*M*CFFDW0jWnV?;* zKHeoa4Fy!XMyhtdrHW>EK6z4fSg?*bYxY-VSmsQ>vBN9-6pHJkJ%t^PDJ>g=7t~3V z9jUh*t_XEFo(T(zTX@V~HKQDN?L>&wX%vBk3*xKU5_33%5mVax$U|ZgEMb096 zaa!P9V_-d1TRixH%fk_#@n=!AGz0IHlz>B`XD~c8e|L)(gcr~$o zo-0@iMeH z!D>EXS4);vv7}g{mPekl?R8PTnqtNv`P|=msFo>o5zd4DE<$RPDx^=c_3erD^exI7 ztqI%<-ag(6_0O~E0h}lNZ47uO<23IF@;mr+hPxz-318T}Pwr&PO7`YQk&i+<*}e@u zN!@d<*>KNc-C?uWYf?kqDdsP#iJEuI_bjVx230SobJzS`RtYS+&^9WNI-+qnHFV>gAX*=9Cmea&M0{XLsw9m-z?88 zYs@>lT{CH7FPZqpveb*}&#uWbhm-d6F}2W~B&4fm;;1c^TZkODeT9h=rdC#Dsn6GhfyzA7aY~i)p9$F&T-L2;O8l@-ZF41c#g)y>f&Nlv@^=!XdJ6 zYsQ_f6g6vP^w>7k@(OAtXC&9qj_?<@41evmsSo59rN}l?u3Ej~L1qlm##U_Pw7n>AA_r%SmXesH8o|t4Y z^;!Axy~H!k*XwmiN7MtBnBSsLe&QmYOtbi0-q96WZJI7@*OHj+=$Ri`9=aq)?BOT#_4cb?XLvIzpySaynx&erVUQ9=yQCR@ zJc5!i*=?`n?ay|nw;`6r)*)U#wobBw^s<`oWq+$~n&;1_8R_)cGN~Q?`|4u#cl)-P(H*>5nTy~<}eaLe1o8P+2;WsCI4!L$8t9~mo zYneOnkRI|WCy-g__Ibi>{=%k$y5+5=PrJPvb)~pZ`o1Vs{4Csicjvh2^-n?_=hf8$ zjthikx(yDyE{&~|ds!Ra=r6}KZJ`~hBKVC+8q|!Qrb+&zAq_$mLcS!S@aW@iO$WLsmeVj2D{ww*m`+wNj|C6Jr(ml>B*wgsm Omx^p+MXEFQO!^xC;V-$kf%K1|ZNK^z9!J0r1Jg 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 H-GBUl5R*?B literal 0 HcmV?d00001 diff --git a/examples/desktop/systray/images/trash.png b/examples/desktop/systray/images/trash.png new file mode 100644 index 0000000000000000000000000000000000000000..4c24db926d6fedc7cfe2b92a9b62c8aecd25f8be GIT binary patch literal 12128 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 literal 0 HcmV?d00001 diff --git a/examples/desktop/systray/main.cpp b/examples/desktop/systray/main.cpp new file mode 100644 index 0000000..6695113 --- /dev/null +++ b/examples/desktop/systray/main.cpp @@ -0,0 +1,63 @@ +/**************************************************************************** +** +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor +** the names of its contributors may be used to endorse or promote +** products derived from this software without specific prior written +** permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include + +#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(); +} diff --git a/examples/desktop/systray/systray.pro b/examples/desktop/systray/systray.pro new file mode 100644 index 0000000..5fdcf1f --- /dev/null +++ b/examples/desktop/systray/systray.pro @@ -0,0 +1,14 @@ +HEADERS = window.h +SOURCES = main.cpp \ + window.cpp +RESOURCES = systray.qrc + +QT += widgets + +# install +target.path = $$[QT_INSTALL_EXAMPLES]/qtbase/desktop/systray +sources.files = $$SOURCES $$HEADERS $$RESOURCES $$FORMS systray.pro +sources.path = $$[QT_INSTALL_EXAMPLES]/qtbase/desktop/systray +INSTALLS += target sources + +simulator: warning(This example might not fully work on Simulator platform) diff --git a/examples/desktop/systray/systray.qrc b/examples/desktop/systray/systray.qrc new file mode 100644 index 0000000..a8b6535 --- /dev/null +++ b/examples/desktop/systray/systray.qrc @@ -0,0 +1,7 @@ + + + images/bad.png + images/heart.png + images/trash.png + + diff --git a/examples/desktop/systray/window.cpp b/examples/desktop/systray/window.cpp new file mode 100644 index 0000000..73dc910 --- /dev/null +++ b/examples/desktop/systray/window.cpp @@ -0,0 +1,270 @@ +/**************************************************************************** +** +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor +** the names of its contributors may be used to endorse or promote +** products derived from this software without specific prior written +** permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "window.h" +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +//! [0] +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); +} +//! [0] + +//! [1] +void Window::setVisible(bool visible) +{ + minimizeAction->setEnabled(visible); + maximizeAction->setEnabled(!isMaximized()); + restoreAction->setEnabled(isMaximized() || !visible); + QDialog::setVisible(visible); +} +//! [1] + +//! [2] +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(); + } +} +//! [2] + +//! [3] +void Window::setIcon(int index) +{ + QIcon icon = iconComboBox->itemIcon(index); + trayIcon->setIcon(icon); + setWindowIcon(icon); + + trayIcon->setToolTip(iconComboBox->itemText(index)); +} +//! [3] + +//! [4] +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: + ; + } +} +//! [4] + +//! [5] +void Window::showMessage() +{ + QSystemTrayIcon::MessageIcon icon = QSystemTrayIcon::MessageIcon( + typeComboBox->itemData(typeComboBox->currentIndex()).toInt()); + trayIcon->showMessage(titleEdit->text(), bodyEdit->toPlainText(), icon, + durationSpinBox->value() * 1000); +} +//! [5] + +//! [6] +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?")); +} +//! [6] + +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); +} diff --git a/examples/desktop/systray/window.h b/examples/desktop/systray/window.h new file mode 100644 index 0000000..80b7a20 --- /dev/null +++ b/examples/desktop/systray/window.h @@ -0,0 +1,112 @@ +/**************************************************************************** +** +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor +** the names of its contributors may be used to endorse or promote +** products derived from this software without specific prior written +** permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef WINDOW_H +#define WINDOW_H + +#include +#include + +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 + +//! [0] +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; +}; +//! [0] + +#endif -- 2.7.4