Created
September 22, 2018 10:56
-
-
Save brandon3055/578317986e499b3ab1604ba89c9b99a0 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include "window.h" | |
#ifndef QT_NO_SYSTEMTRAYICON | |
#include <QAction> | |
#include <QCheckBox> | |
#include <QComboBox> | |
#include <QCoreApplication> | |
#include <QCloseEvent> | |
#include <QGroupBox> | |
#include <QLabel> | |
#include <QLineEdit> | |
#include <QMenu> | |
#include <QPushButton> | |
#include <QSpinBox> | |
#include <QTextEdit> | |
#include <QVBoxLayout> | |
#include <QMessageBox> | |
Window::Window() | |
{ | |
createIconGroupBox(); | |
createMessageGroupBox(); | |
iconLabel->setMinimumWidth(durationLabel->sizeHint().width()); | |
createActions(); | |
createTrayIcon(); | |
connect(showMessageButton, &QAbstractButton::clicked, this, &Window::showMessage); | |
connect(showIconCheckBox, &QAbstractButton::toggled, trayIcon, &QSystemTrayIcon::setVisible); | |
connect(iconComboBox, QOverload<int>::of(&QComboBox::currentIndexChanged), | |
this, &Window::setIcon); | |
connect(trayIcon, &QSystemTrayIcon::messageClicked, this, &Window::messageClicked); | |
connect(trayIcon, &QSystemTrayIcon::activated, this, &Window::iconActivated); | |
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) | |
{ | |
#ifdef Q_OS_OSX | |
if (!event->spontaneous() || !isVisible()) { | |
return; | |
} | |
#endif | |
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() | |
{ | |
showIconCheckBox->setChecked(true); | |
QSystemTrayIcon::MessageIcon msgIcon = QSystemTrayIcon::MessageIcon( | |
typeComboBox->itemData(typeComboBox->currentIndex()).toInt()); | |
if (msgIcon == QSystemTrayIcon::NoIcon) { | |
QIcon icon(iconComboBox->itemIcon(iconComboBox->currentIndex())); | |
trayIcon->showMessage(titleEdit->text(), bodyEdit->toPlainText(), icon, | |
durationSpinBox->value() * 1000); | |
} else { | |
trayIcon->showMessage(titleEdit->text(), bodyEdit->toPlainText(), msgIcon, | |
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.png"), tr("Bad")); | |
iconComboBox->addItem(QIcon(":/images/heart.png"), tr("Heart")); | |
iconComboBox->addItem(QIcon(":/images/trash.png"), 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->addItem(QIcon(), tr("Custom icon"), | |
QSystemTrayIcon::NoIcon); | |
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, &QAction::triggered, this, &QWidget::hide); | |
maximizeAction = new QAction(tr("Ma&ximize"), this); | |
connect(maximizeAction, &QAction::triggered, this, &QWidget::showMaximized); | |
restoreAction = new QAction(tr("&Restore"), this); | |
connect(restoreAction, &QAction::triggered, this, &QWidget::showNormal); | |
quitAction = new QAction(tr("&Quit"), this); | |
connect(quitAction, &QAction::triggered, qApp, &QCoreApplication::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); | |
} | |
#endif |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment