Server в Трее 1

This commit is contained in:
2025-10-20 12:44:37 +03:00
parent edadfdf323
commit f4ffc7c393
5 changed files with 149 additions and 8 deletions

View File

@@ -2,7 +2,7 @@ project(TestServerLMS LANGUAGES CXX)
common_info_for_project(TestServerLMS) common_info_for_project(TestServerLMS)
add_executable(TestServerLMS add_executable(TestServerLMS WIN32
main.cpp main.cpp
mainwindow.cpp mainwindow.cpp
mainwindow.h mainwindow.h

View File

@@ -6,6 +6,6 @@ int main(int argc, char *argv[])
{ {
QApplication a(argc, argv); QApplication a(argc, argv);
MainWindow w; MainWindow w;
w.show(); //w.show();
return a.exec(); return a.exec();
} }

View File

@@ -6,7 +6,8 @@
MainWindow::MainWindow(QWidget *parent) : MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent), QMainWindow(parent),
ui(new Ui::MainWindow), ui(new Ui::MainWindow),
m_serverLMSWidget(nullptr) m_serverLMSWidget(nullptr),
trayIcon(nullptr)
{ {
ui->setupUi(this); ui->setupUi(this);
@@ -19,13 +20,130 @@ MainWindow::MainWindow(QWidget *parent) :
connect(this, &MainWindow::signal_LanguageChanged, m_serverLMSWidget, &ServerLMSWidget::slot_LanguageChanged); connect(this, &MainWindow::signal_LanguageChanged, m_serverLMSWidget, &ServerLMSWidget::slot_LanguageChanged);
this->move(0, 0); //this->move(0, 0);
this->showNormal(); //this->showNormal();
errorCheck(); errorCheck();
//this->showMaximized(); //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() void MainWindow::exit()
{ {
QApplication::exit(0); QApplication::exit(0);

View File

@@ -5,6 +5,10 @@
#include <QTranslator> #include <QTranslator>
#include <QEvent> #include <QEvent>
#include <QCloseEvent>
#include <QSystemTrayIcon>
#include <QAction>
#include "serverlmswidget.h" #include "serverlmswidget.h"
@@ -25,6 +29,18 @@ protected:
// В нём будет производиться проверка события смены перевода приложения // В нём будет производиться проверка события смены перевода приложения
void changeEvent(QEvent * event) override; void changeEvent(QEvent * event) override;
/* Виртуальная функция родительского класса в нашем классе
* переопределяется для изменения поведения приложения,
* чтобы оно сворачивалось в трей, когда мы этого хотим
*/
void closeEvent(QCloseEvent * event);
private slots:
/* Слот, который будет принимать сигнал от события
* нажатия на иконку приложения в трее
*/
void iconActivated(QSystemTrayIcon::ActivationReason reason);
signals: signals:
//сигнал об изменении языка интерфейса //сигнал об изменении языка интерфейса
void signal_LanguageChanged(QString language); void signal_LanguageChanged(QString language);
@@ -32,11 +48,16 @@ signals:
private slots: private slots:
void on_cmbLanguage_currentIndexChanged(const QString &arg1); void on_cmbLanguage_currentIndexChanged(const QString &arg1);
private:
void exit();
void errorCheck();
private: private:
Ui::MainWindow *ui; Ui::MainWindow *ui;
ServerLMSWidget* m_serverLMSWidget; ServerLMSWidget* m_serverLMSWidget;
QTranslator qtLanguageTranslator; QTranslator qtLanguageTranslator;
void exit();
void errorCheck(); /* Объявляем объект будущей иконки приложения для трея */
QSystemTrayIcon* trayIcon;
}; };
#endif // MAINWINDOW_H #endif // MAINWINDOW_H

View File

@@ -1,3 +1,5 @@
<RCC> <RCC>
<qresource prefix="/"/> <qresource prefix="/">
<file>resources/IcoServerRRJ.ico</file>
</qresource>
</RCC> </RCC>