Implement system tray context menu.

This commit is contained in:
Hork 2019-04-17 23:28:32 +08:00
parent 1f9d763958
commit fbdae71a2c
3 changed files with 52 additions and 9 deletions

View File

@ -23,9 +23,9 @@ MainWindow::MainWindow(QWidget *parent) :
connect(ui->configTable, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(showMenu(QPoint))); connect(ui->configTable, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(showMenu(QPoint)));
this->v2Inst = new v2Instance(); this->v2Inst = new v2Instance();
hTray = new QSystemTrayIcon(); hTray = new QSystemTrayIcon();
hTray->setToolTip("Hv2ray system tray"); hTray->setToolTip("Hv2ray");
hTray->setIcon(QIcon("Himeki.ico")); hTray->setIcon(QIcon("Himeki.ico"));
hTray->show(); connect(hTray, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(on_activatedTray(QSystemTrayIcon::ActivationReason)));
createTrayAction(); createTrayAction();
} }
@ -133,6 +133,7 @@ void MainWindow::updateLog()
void MainWindow::on_startButton_clicked() void MainWindow::on_startButton_clicked()
{ {
ui->logText->clear();
this->v2Inst->start(this); this->v2Inst->start(this);
} }
@ -173,21 +174,56 @@ void MainWindow::closeEvent(QCloseEvent *event)
void MainWindow::createTrayAction() void MainWindow::createTrayAction()
{ {
QAction actionShow(this); QAction *actionShow = new QAction(this);
QAction actionQuit(this); QAction *actionQuit = new QAction(this);
QAction actionStart(this); QAction *actionStart = new QAction(this);
QAction actionRestart(this); QAction *actionRestart = new QAction(this);
QObject::connect(hTray, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(on_activatedTray(QSystemTrayIcon::ActivationReason))); QAction *actionStop = new QAction(this);
actionShow->setText("Show main widget");
actionQuit->setText("Quit");
actionStart->setText("Start v2ray");
actionRestart->setText("Restart v2ray");
actionStop->setText("Stop v2ray");
trayMenu->addAction(actionShow);
trayMenu->addAction(actionStart);
trayMenu->addAction(actionStop);
trayMenu->addAction(actionRestart);
trayMenu->addAction(actionQuit);
connect(actionShow, SIGNAL(triggered()), this, SLOT(showMainWindow()));
connect(actionStop, SIGNAL(triggered()), this, SLOT(on_stopButton_clicked()));
connect(actionQuit, SIGNAL(triggered()), this, SLOT(quit()));
connect(actionRestart, SIGNAL(triggered()), this, SLOT(on_restartButton_clicked()));
connect(actionStart, SIGNAL(triggered()), this, SLOT(on_startButton_clicked()));
hTray->setContextMenu(trayMenu);
hTray->show();
} }
void MainWindow::on_activatedTray(QSystemTrayIcon::ActivationReason reason) void MainWindow::on_activatedTray(QSystemTrayIcon::ActivationReason reason)
{ {
switch (reason) { switch (reason) {
case QSystemTrayIcon::Trigger: case QSystemTrayIcon::Trigger:
this->show(); if(this->isHidden()) {
this->show();
}
break; break;
case QSystemTrayIcon::DoubleClick: case QSystemTrayIcon::DoubleClick:
this->show(); if(this->isHidden()) {
this->show();
}
break;
case QSystemTrayIcon::MiddleClick:
break;
case QSystemTrayIcon::Unknown:
break; break;
} }
} }
void MainWindow::showMainWindow()
{
if(this->isHidden()) {
this->show();
}
}
void MainWindow::quit()
{
QCoreApplication::quit();
}

View File

@ -5,6 +5,7 @@
#include <QMainWindow> #include <QMainWindow>
#include "confedit.h" #include "confedit.h"
#include <QSystemTrayIcon> #include <QSystemTrayIcon>
#include <QMenu>
class v2Instance; class v2Instance;
namespace Ui namespace Ui
@ -21,6 +22,7 @@ public:
ConfEdit *e; ConfEdit *e;
v2Instance *v2Inst; v2Instance *v2Inst;
QSystemTrayIcon *hTray; QSystemTrayIcon *hTray;
QMenu *trayMenu = new QMenu(this);
~MainWindow(); ~MainWindow();
@ -40,6 +42,8 @@ private slots:
void geneConf(int idIntable); void geneConf(int idIntable);
void on_actionVmess_triggered(); void on_actionVmess_triggered();
void on_activatedTray(QSystemTrayIcon::ActivationReason reason); void on_activatedTray(QSystemTrayIcon::ActivationReason reason);
void showMainWindow();
void quit();
private: private:
Ui::MainWindow *ui; Ui::MainWindow *ui;

View File

@ -42,6 +42,9 @@ v2Instance::~v2Instance()
void v2Instance::start(MainWindow *parent) void v2Instance::start(MainWindow *parent)
{ {
if(this->v2Process->state() == QProcess::Running) {
this->v2Process->close();
}
if (QFileInfo("v2ray").exists() && QFileInfo("geoip.dat").exists() && QFileInfo("geosite.dat").exists() ) { if (QFileInfo("v2ray").exists() && QFileInfo("geoip.dat").exists() && QFileInfo("geosite.dat").exists() ) {
QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
env.insert("V2RAY_LOCATION_ASSET", QDir::currentPath()); env.insert("V2RAY_LOCATION_ASSET", QDir::currentPath());