From 0b9642a705dd57c826395fb8f2710e532fc00652 Mon Sep 17 00:00:00 2001 From: "Cai.MY" Date: Thu, 24 May 2018 17:20:09 +0800 Subject: [PATCH] add traffic warning --- maintray.cpp | 67 ++++++++++++++++++++++++++++++++++++++--------- maintray.h | 6 ++++- netcontroller.h | 2 ++ optionswindow.cpp | 12 +++++++-- optionswindow.h | 6 +++-- 5 files changed, 76 insertions(+), 17 deletions(-) diff --git a/maintray.cpp b/maintray.cpp index 83b0e3a..d9e5304 100644 --- a/maintray.cpp +++ b/maintray.cpp @@ -8,7 +8,7 @@ MainTray::MainTray(QByteArray username, QByteArray password, QObject *parent): Q //初始化settings settings(QSettings::IniFormat, QSettings::UserScope, "Cai.MY", "NEU-Monitor"), //初始化optionswindow - opWindow(settings.value("id", "").toByteArray(), settings.value("password", "").toByteArray()), + opWindow(settings.value("id", "").toByteArray(), settings.value("password", "").toByteArray(), settings.value("total traffic", 60).toInt()), user(username), passwd(password) { @@ -16,8 +16,12 @@ MainTray::MainTray(QByteArray username, QByteArray password, QObject *parent): Q setIcon(QIcon(tr(":/icon/favicon.ico"))); netctrl = new NetController(user,passwd,this); - netctrl->setUsername(settings.value("id",0).toByteArray()); - netctrl->setPassword(settings.value("password", 0).toByteArray()); + user = settings.value("id",0).toByteArray(); + passwd = settings.value("password", 0).toByteArray(); + totalTraffic = settings.value("total traffic", 60).toInt(); + netctrl->setUsername(user); + netctrl->setPassword(passwd); + netctrl->setTotalTraffic(totalTraffic); connect(&opWindow, OptionsWindow::saveSettings, this, updateUserInfo); //连接controller状态改变信号 @@ -96,6 +100,7 @@ MainTray::MainTray(QByteArray username, QByteArray password, QObject *parent): Q connect(loginAction, QAction::triggered, this,[this](){ isForceLogin = true; netctrl->sendLogoutRequest(); + hasWarned = false; netctrl->sendLoginRequest(); isForceLogout = false; }); @@ -174,28 +179,44 @@ MainTray::~MainTray() void MainTray::showToolTip(NetController::State state) { + QString tooltipString; switch (state) { case NetController::Online: - setToolTip(tr("当前状态:连接\n自动重连:") + (autoLogin->isChecked()? tr("开启"):tr("关闭"))); + tooltipString += tr("当前状态:连接"); break; case NetController::Offline: - setToolTip(tr("当前状态:断开\n自动重连:") + (autoLogin->isChecked()? tr("开启"):tr("关闭"))+tr("\n双击以登陆")); + tooltipString += tr("当前状态:断开 (双击登陆)"); break; case NetController::Disconnected: - setToolTip(tr("当前状态:无法连接\n自动重连:") + (autoLogin->isChecked()? tr("开启"):tr("关闭"))); + tooltipString += tr("当前状态:无法连接"); break; case NetController::Unknown: - setToolTip(tr("当前状态:正在识别\n自动重连:") + (autoLogin->isChecked()? tr("开启"):tr("关闭"))); + tooltipString += tr("当前状态:正在识别"); break; case NetController::Owed: - setToolTip(tr("当前状态:已欠费\n自动重连:") + (autoLogin->isChecked()? tr("开启"):tr("关闭"))); + tooltipString += tr("当前状态:已欠费"); break; case NetController::WrongPass: - setToolTip(tr("当前状态:密码错误\n自动重连:") + (autoLogin->isChecked()? tr("开启"):tr("关闭"))); + tooltipString += tr("当前状态:密码错误"); break; default: break; } + tooltipString += tr("\n自动重连:"); + tooltipString += autoLogin->isChecked()? tr("开启"):tr("关闭"); + if(state == NetController::Online){ + switch (trafficstate) { + case Over: + tooltipString += tr("\n流量已超额"); + break; + case Nearly: + tooltipString += tr("\n剩余流量不足"); + break; + default: + break; + } + } + setToolTip(tooltipString); } void MainTray::handleActivated(QSystemTrayIcon::ActivationReason reason) @@ -247,19 +268,27 @@ void MainTray::setAutoStart(bool set) delete settings; } -void MainTray::updateUserInfo(QByteArray id, QByteArray pass) +void MainTray::updateUserInfo(QByteArray id, QByteArray pass, int traffic) { netctrl->setUsername(id); netctrl->setPassword(pass); + netctrl->setTotalTraffic(traffic); + user = id; + passwd = pass; + totalTraffic = traffic; opWindow.hide(); netctrl->sendLoginRequest(); + hasWarned = false; settings.setValue("id", id); settings.setValue("password", pass); + settings.setValue("total traffic", traffic); } -void MainTray::handleInfo(QString mb, QString sec, QString balance, QString ip) +void MainTray::handleInfo(QString byte, QString sec, QString balance, QString ip) { - QString mbString = QString::number(mb.toDouble()/1000000.0, 'f', 2); + QString mbString = QString::number(byte.toDouble()/1000000.0, 'f', 2); + QString gbString = QString::number(byte.toDouble()/1000000000.0, 'f', 2); + QString leftoverString = QString::number(totalTraffic - byte.toDouble()/1000000000.0, 'f',2 ); int totalSec = sec.toInt(); int hour = (totalSec/3600); int min = ((totalSec-hour*3600)/60); @@ -268,5 +297,19 @@ void MainTray::handleInfo(QString mb, QString sec, QString balance, QString ip) timeAction->setText(tr("已用时长:\t") + QString::number(hour) + ":" +QString::number(min) + ":" + second); balanceAction->setText(tr("账户余额:\t") + balance); ipAction->setText(tr("IP地址:\t") + ip); + if(!hasWarned){ + hasWarned = true; + if(byte.toDouble() / 1000000.0 > totalTraffic * 1024){//流量已超 + trafficstate = Over; + if(!muteAction->isChecked()) + showMessage(tr("流量警告"), tr("本月流量已超"), QSystemTrayIcon::Warning); + } + else if(byte.toDouble() / 1000000.0 + 5000 > totalTraffic * 1024){//流量将超 + trafficstate = Nearly; + if(!muteAction->isChecked()) + showMessage(tr("流量预警"), tr("剩余流量:") + leftoverString + tr("G")); + } + showToolTip(currentState); + } } diff --git a/maintray.h b/maintray.h index 3e3dc0b..4eca657 100644 --- a/maintray.h +++ b/maintray.h @@ -18,6 +18,7 @@ class MainTray: public QSystemTrayIcon public: MainTray(QByteArray username, QByteArray password, QObject *parent = Q_NULLPTR); ~MainTray(); + enum TrafficState{Normal, Over, Nearly }; private: QMenu *menu, *infoMenu, *settingsMenu; @@ -30,8 +31,10 @@ private: bool isForceLogout = false; bool isForceLogin = false; + bool hasWarned = false; NetController::State currentState = NetController::Unknown; //当前状态 + TrafficState trafficstate = Normal; void showToolTip(NetController::State state); void handleActivated(QSystemTrayIcon::ActivationReason reason);//处理左键单击、双击 @@ -40,6 +43,7 @@ private: void setAutoStart(bool set); QByteArray user, passwd; + int totalTraffic; int msgDur = 500; //通知持续时间 int checkInterval = 1000; //查询状态定时器周期 @@ -48,7 +52,7 @@ signals: void exit(); private slots: - void updateUserInfo(QByteArray id, QByteArray pass); + void updateUserInfo(QByteArray id, QByteArray pass, int traffic); void handleInfo(QString mb, QString sec, QString balance, QString ip); }; diff --git a/netcontroller.h b/netcontroller.h index 7523ef2..7bc3ea4 100644 --- a/netcontroller.h +++ b/netcontroller.h @@ -19,6 +19,7 @@ public: void setUsername(QByteArray newName) { username = newName; } void setPassword(QByteArray newPass) { password = newPass; } + void setTotalTraffic(int newTraffic) { traffic = newTraffic; } enum State {Unknown, Offline, Online, Disconnected, Owed, WrongPass}; @@ -27,6 +28,7 @@ private: QString loginUrl = "http://ipgw.neu.edu.cn/srun_portal_pc.php?ac_id=1&"; QString offlineString = "not_online"; QByteArray checkParam, username, password; + int traffic; State NEUState = Unknown, lastState = Unknown; int offlineCount = 0, disconnectCount = 0; diff --git a/optionswindow.cpp b/optionswindow.cpp index 6667c7a..ab638e7 100644 --- a/optionswindow.cpp +++ b/optionswindow.cpp @@ -1,6 +1,6 @@ #include "optionswindow.h" -OptionsWindow::OptionsWindow(QByteArray id, QByteArray pass, QWidget *parent) : QMainWindow(parent) +OptionsWindow::OptionsWindow(QByteArray id, QByteArray pass, int traffic, QWidget *parent) : QMainWindow(parent) { setWindowTitle(tr("选项")); @@ -17,8 +17,13 @@ OptionsWindow::OptionsWindow(QByteArray id, QByteArray pass, QWidget *parent) : passwordEdit->setEchoMode(QLineEdit::Password); passwordEdit->setText(pass); + trafficSpin = new QSpinBox(this); + trafficSpin->setValue(traffic); + trafficSpin->setToolTip(tr("在流量将要用尽时进行提醒")); + layout->addRow(tr("用户名"), idEdit); layout->addRow(tr("密码"), passwordEdit); + layout->addRow(tr("流量(G)"), trafficSpin); layout->setSpacing(20); saveButton = new QPushButton("确定", this); @@ -35,6 +40,9 @@ OptionsWindow::OptionsWindow(QByteArray id, QByteArray pass, QWidget *parent) : tabWidget->addTab(page1, tr("常规")); setCentralWidget(tabWidget); - connect(saveButton, QPushButton::clicked, this, [this](){emit saveSettings(idEdit->text().toUtf8(), passwordEdit->text().toUtf8());}); + connect(saveButton, QPushButton::clicked, this, [this](){emit saveSettings(idEdit->text().toUtf8(), + passwordEdit->text().toUtf8(), + trafficSpin->value()); + }); connect(cancleButton, QPushButton::clicked, this, hide); } diff --git a/optionswindow.h b/optionswindow.h index f40e4a8..9ebe253 100644 --- a/optionswindow.h +++ b/optionswindow.h @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include @@ -14,19 +15,20 @@ class OptionsWindow : public QMainWindow { Q_OBJECT public: - explicit OptionsWindow(QByteArray id, QByteArray pass, QWidget *parent = nullptr); + explicit OptionsWindow(QByteArray id, QByteArray pass, int traffic, QWidget *parent = nullptr); private: QTabWidget *tabWidget; QWidget *page1; QLineEdit *idEdit, *passwordEdit; + QSpinBox *trafficSpin; QPushButton *saveButton, *cancleButton; QFormLayout *layout; QVBoxLayout *vlayout; QHBoxLayout *hlayout; signals: - void saveSettings(QByteArray id, QByteArray pass); + void saveSettings(QByteArray id, QByteArray pass, int traffic); public slots: };