From f4ffc7c3931e4b5370a6305ea3fa88b495987562 Mon Sep 17 00:00:00 2001 From: krivoshein Date: Mon, 20 Oct 2025 12:44:37 +0300 Subject: [PATCH] =?UTF-8?q?Server=20=D0=B2=20=D0=A2=D1=80=D0=B5=D0=B5=201?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TestServerLMS/CMakeLists.txt | 2 +- TestServerLMS/main.cpp | 2 +- TestServerLMS/mainwindow.cpp | 124 +++++++++++++++++++++++++++++++- TestServerLMS/mainwindow.h | 25 ++++++- TestServerLMS/testServerLMS.qrc | 4 +- 5 files changed, 149 insertions(+), 8 deletions(-) diff --git a/TestServerLMS/CMakeLists.txt b/TestServerLMS/CMakeLists.txt index 97bcfea..125bdb8 100644 --- a/TestServerLMS/CMakeLists.txt +++ b/TestServerLMS/CMakeLists.txt @@ -2,7 +2,7 @@ project(TestServerLMS LANGUAGES CXX) common_info_for_project(TestServerLMS) -add_executable(TestServerLMS +add_executable(TestServerLMS WIN32 main.cpp mainwindow.cpp mainwindow.h diff --git a/TestServerLMS/main.cpp b/TestServerLMS/main.cpp index fd3e533..33d8ea6 100644 --- a/TestServerLMS/main.cpp +++ b/TestServerLMS/main.cpp @@ -6,6 +6,6 @@ int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; - w.show(); + //w.show(); return a.exec(); } diff --git a/TestServerLMS/mainwindow.cpp b/TestServerLMS/mainwindow.cpp index 7879250..6452b0d 100644 --- a/TestServerLMS/mainwindow.cpp +++ b/TestServerLMS/mainwindow.cpp @@ -6,7 +6,8 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow), - m_serverLMSWidget(nullptr) + m_serverLMSWidget(nullptr), + trayIcon(nullptr) { ui->setupUi(this); @@ -19,13 +20,130 @@ MainWindow::MainWindow(QWidget *parent) : connect(this, &MainWindow::signal_LanguageChanged, m_serverLMSWidget, &ServerLMSWidget::slot_LanguageChanged); - this->move(0, 0); - this->showNormal(); + //this->move(0, 0); + //this->showNormal(); errorCheck(); //this->showMaximized(); + + /* Инициализируем иконку трея, устанавливаем иконку из набора системных иконок, + * а также задаем всплывающую подсказку + * */ + trayIcon = new QSystemTrayIcon(this); + //trayIcon->setIcon(this->style()->standardIcon(QStyle::SP_ComputerIcon)); + trayIcon->setIcon(QPixmap(":/resources/IcoServerRRJ.ico")); + trayIcon->setToolTip(tr("Server LMS")); + + /* После чего создаем контекстное меню из двух пунктов*/ + QMenu * menu = new QMenu(this); + QAction * viewWindow = new QAction(trUtf8("Развернуть окно"), this); + QAction * hideWindow = new QAction(trUtf8("Свернуть окно"), this); + QAction * quitAction = new QAction(trUtf8("Выход"), this); + + /* подключаем сигналы нажатий на пункты меню к соответсвующим слотам. + * Первый пункт меню разворачивает приложение из трея, + * а второй пункт меню завершает приложение + * */ + connect(viewWindow, SIGNAL(triggered()), this, SLOT(show())); + connect(hideWindow, SIGNAL(triggered()), this, SLOT(hide())); + connect(quitAction, SIGNAL(triggered()), this, SLOT(close())); + + menu->addAction(viewWindow); + menu->addAction(hideWindow); + menu->addAction(quitAction); + + /* Устанавливаем контекстное меню на иконку + * и показываем иконку приложения в трее + * */ + trayIcon->setContextMenu(menu); + trayIcon->show(); + + /* Также подключаем сигнал нажатия на иконку к обработчику + * данного нажатия + * */ + connect(trayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), + this, SLOT(iconActivated(QSystemTrayIcon::ActivationReason))); + + //this->hide(); + //this->close(); + //this->showEvent(); + + QSystemTrayIcon::MessageIcon icon = QSystemTrayIcon::MessageIcon(QSystemTrayIcon::Information); + trayIcon->showMessage(tr("Server LMS"), + tr("Приложение свернуто в трей. Для того чтобы, " + "развернуть окно приложения, щелкните по иконке приложения в трее"), + icon, + 2000); } +/* Метод, который обрабатывает событие закрытия окна приложения + * */ +void MainWindow::closeEvent(QCloseEvent * event) +{ + /* Если окно видимо и чекбокс отмечен, то завершение приложения + * игнорируется, а окно просто скрывается, что сопровождается + * соответствующим всплывающим сообщением + */ + if(this->isVisible() /*&& ui->trayCheckBox->isChecked()*/) + { + //flFirstShow = false; + + event->ignore(); + this->hide(); + QSystemTrayIcon::MessageIcon icon = QSystemTrayIcon::MessageIcon(QSystemTrayIcon::Information); + + trayIcon->showMessage(tr("Server LMS"), + tr("Приложение свернуто в трей. Для того чтобы, " + "развернуть окно приложения, щелкните по иконке приложения в трее"), + icon, + 2000); + } +} + +/* +void MainWindow::showEvent(QShowEvent *event) +{ + QMainWindow::showEvent(event); + + if(flFirstShow) + this->close(); +}*/ + +/* Метод, который обрабатывает нажатие на иконку приложения в трее + * */ +void MainWindow::iconActivated(QSystemTrayIcon::ActivationReason reason) +{ + switch (reason){ + case QSystemTrayIcon::Trigger: + /* Событие игнорируется в том случае, если чекбокс не отмечен + * */ + //if(ui->trayCheckBox->isChecked()) + { + /* иначе, если окно видимо, то оно скрывается, + * и наоборот, если скрыто, то разворачивается на экран + * */ + if(!this->isVisible()){ + this->show(); + } else + { + this->hide(); + + QSystemTrayIcon::MessageIcon icon = QSystemTrayIcon::MessageIcon(QSystemTrayIcon::Information); + + trayIcon->showMessage(tr("Server LMS"), + tr("Приложение свернуто в трей. Для того чтобы, " + "развернуть окно приложения, щелкните по иконке приложения в трее"), + icon, + 2000); + } + } + break; + default: + break; + } +} + + void MainWindow::exit() { QApplication::exit(0); diff --git a/TestServerLMS/mainwindow.h b/TestServerLMS/mainwindow.h index 3e396b4..055fc63 100644 --- a/TestServerLMS/mainwindow.h +++ b/TestServerLMS/mainwindow.h @@ -5,6 +5,10 @@ #include #include +#include +#include +#include + #include "serverlmswidget.h" @@ -25,6 +29,18 @@ protected: // В нём будет производиться проверка события смены перевода приложения void changeEvent(QEvent * event) override; + /* Виртуальная функция родительского класса в нашем классе + * переопределяется для изменения поведения приложения, + * чтобы оно сворачивалось в трей, когда мы этого хотим + */ + void closeEvent(QCloseEvent * event); + +private slots: + /* Слот, который будет принимать сигнал от события + * нажатия на иконку приложения в трее + */ + void iconActivated(QSystemTrayIcon::ActivationReason reason); + signals: //сигнал об изменении языка интерфейса void signal_LanguageChanged(QString language); @@ -32,11 +48,16 @@ signals: private slots: void on_cmbLanguage_currentIndexChanged(const QString &arg1); +private: + void exit(); + void errorCheck(); + private: Ui::MainWindow *ui; ServerLMSWidget* m_serverLMSWidget; QTranslator qtLanguageTranslator; - void exit(); - void errorCheck(); + + /* Объявляем объект будущей иконки приложения для трея */ + QSystemTrayIcon* trayIcon; }; #endif // MAINWINDOW_H diff --git a/TestServerLMS/testServerLMS.qrc b/TestServerLMS/testServerLMS.qrc index 4d8ed66..f15c590 100644 --- a/TestServerLMS/testServerLMS.qrc +++ b/TestServerLMS/testServerLMS.qrc @@ -1,3 +1,5 @@ - + + resources/IcoServerRRJ.ico +