Qt - 上傳下載懸浮框(可編譯成Linux軟件)

用到的linux命令行: ip -s link | free -m
UI:主要使用StyleSheet構(gòu)建
聲明:代碼非完全原創(chuàng)

161753_16Tc_1587794.png

???????生活中侠驯,我們使用linux桌面做開發(fā)的情況也比較多的止,但是沒有一個好用流量及內(nèi)存監(jiān)控的軟件,總覺得心里怪怪的剩檀。哈哈采章,估計是受360以及一些其他安全衛(wèi)士的影響吧担租。下面反惕,我們就來構(gòu)建自己的懸浮流量條功能:

NO.1 首先用到的開發(fā)工具: QtCreator, 這個我就不多說了,配置還是挺簡單的狡汉。
NO.2 編寫主要的代碼程序 --- MainWindow

<b>MainWindow.h</b>

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QPainter>
#include <QPoint>
#include <QMouseEvent>
#include <QProcess>
#include <QTimer>
#include <QRegularExpression>
#include <QRegularExpressionMatchIterator>
#include <QStringList>
#include <QIcon>
#include <QPixmap>
#include <QSystemTrayIcon>
#include <QMenu>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    void mousePressEvent(QMouseEvent*);
    void mouseMoveEvent(QMouseEvent*);
    void mouseReleaseEvent(QMouseEvent*);
    void paintEvent(QPaintEvent*);
    QString GetSizeInfo(qint64);
    void GetNetInformation();
    void GetFreeMemoryInfo();
    void setSystemTray();
    ~MainWindow();
private slots:
    void GetInformation();
    void OnTrayContextMenuClick(QAction*);
private:
    Ui::MainWindow *ui;

    QPoint oldMousePos;
    bool isMousePressed = false;

    QProcess *process;
    QTimer *timer;

    qint64 uploadCount = 0,
           downloadCount = 0,
           oldUploadCount = 0,
           oldDownloadCount = 0;

    QSystemTrayIcon *trayIcon;
};

#endif // MAINWINDOW_H

<b>MainWindow.cpp</b>

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDesktopWidget>
#include <QDebug>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //設(shè)置窗口位置
    this->move(QApplication::desktop()->width()-120,QApplication::desktop()->height()-80);
    this->setWindowFlags(Qt::FramelessWindowHint //去邊框
               |Qt::WindowStaysOnTopHint //最低層顯示
               |Qt::Tool //不在任務(wù)欄顯示
             );
    this->setAttribute(Qt::WA_TranslucentBackground, true);
    setSystemTray();
    process = new QProcess(this);
    timer = new QTimer(this);
    timer->connect(timer, SIGNAL(timeout()), this, SLOT(GetInformation()));
    timer->start(1000);
    oldMousePos.setX(0);
    oldMousePos.setY(0);
}

void MainWindow::mousePressEvent(QMouseEvent *event){
    if(!isMousePressed && event->button() == Qt::LeftButton){
        isMousePressed = true;
        oldMousePos = event->globalPos() - this->pos();
        this->setCursor(Qt::ClosedHandCursor);
    }
}

void MainWindow::mouseMoveEvent(QMouseEvent *event){
    if(isMousePressed){
        this->move(event->globalPos() - oldMousePos);
        event->accept();
    }
}

void MainWindow::mouseReleaseEvent(QMouseEvent *event){
    if(isMousePressed && event->button() == Qt::LeftButton){
        int x=this->x();
        int y=this->y();
        if(this->pos().x()<0){
            x=0;
        }else if(QApplication::desktop()->width()-x<this->width()){
            x=QApplication::desktop()->width()-this->width();
        }
        if(this->pos().y()<0) {
            y=0;
        }else if(QApplication::desktop()->height()-y<this->height()){
            y=QApplication::desktop()->height()-this->height();
        }
        move(x,y);

        isMousePressed=false;
        setCursor(Qt::ArrowCursor);
        event->accept();
    }
}

void MainWindow::paintEvent(QPaintEvent *){

}

void MainWindow::OnTrayContextMenuClick(QAction*){
    timer->stop();
    QApplication::exit();
}

void MainWindow::GetInformation(){
    timer->stop();
    GetNetInformation();
    GetFreeMemoryInfo();
    timer->start(1000);
}

void MainWindow::GetNetInformation(){
    uploadCount = 0;
    downloadCount = 0;
    process->start("ip -s link");
    if(process->waitForStarted(2000) && process->waitForFinished(1000)){
        QByteArray infoBytes = process->readAllStandardOutput();
        if(!infoBytes.isEmpty()){
            QString infoResult(infoBytes);
            //計算上傳
            QRegularExpression regExpress("collsns[\\s\\S]+?\\d+");
            QRegularExpressionMatchIterator matcherIter = regExpress.globalMatch(infoResult);
            while(matcherIter.hasNext()){
                QString net = matcherIter.next().captured(0);
                net.remove(QRegularExpression("[\\s\\S]+ "));
                uploadCount += net.toInt();
            }
            qint64 tmp = uploadCount - oldUploadCount;
            if(oldUploadCount != 0)
                ui->lbUpload->setText("↑  " + GetSizeInfo(tmp));
            oldUploadCount = uploadCount;
            //計算下載
            regExpress.setPattern("mcast[\\s\\S]+?\\d+");
            matcherIter = regExpress.globalMatch(infoResult);
            while(matcherIter.hasNext()){
                QString net = matcherIter.next().captured(0);
                net.remove(QRegularExpression("[\\s\\S]+ "));
                downloadCount += net.toLongLong();
            }
            tmp = downloadCount - oldDownloadCount;
            if(oldDownloadCount != 0)
                ui->lbDownload->setText("↓  " + GetSizeInfo(tmp));
            oldDownloadCount = downloadCount;
        }
    }
}

void MainWindow::GetFreeMemoryInfo(){
    process->start("free -m");
    if(process->waitForStarted(2000) && process->waitForFinished(1000)){
        QByteArray infoResult = process->readAllStandardOutput();
        if(!infoResult.isEmpty()){
            QRegularExpression regExpress("\\d+.+");
            QString value = regExpress.match(infoResult).captured(0);
            QStringList infoList = value.split(QRegExp(" +"));
            QString totalStr = infoList.at(0), availableStr = infoList.at(5);
            qint64 totalCount = totalStr.toLongLong(),
                   availableCount = availableStr.toLongLong();
            qint64 used = totalCount - availableCount;
            int usedPercent = (int)(used * 100.0 / totalCount);
            ui->pbMemory->setValue(usedPercent);
        }
    }
}

QString MainWindow::GetSizeInfo(qint64 value){
    if(value >= 1024*1024){
        return QString().setNum(value/1024/1024) + "m/s";
    }else if(value >= 1024){
        return QString().setNum(value/1024)+"k/s";
    }else{
        return QString().setNum(value)+"b/s";
    }
}

void MainWindow::setSystemTray(){
    trayIcon = new QSystemTrayIcon(QIcon(":/icon.png"), this);
    trayIcon->setToolTip("流量監(jiān)控懸浮框");
    QMenu *exitMenuItem = new QMenu();
    QAction *exitAction = new QAction("退出應(yīng)用");
    exitMenuItem->addAction(exitAction);
    connect(exitMenuItem, SIGNAL(triggered(QAction*)), SLOT(OnTrayContextMenuClick(QAction*)));
    trayIcon->setContextMenu(exitMenuItem);
    trayIcon->show();
}

MainWindow::~MainWindow()
{
    delete ui;
}
 
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末揖铜,一起剝皮案震驚了整個濱河市峦椰,隨后出現(xiàn)的幾起案子物邑,更是在濱河造成了極大的恐慌色解,老刑警劉巖钟病,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件屹徘,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機夺荒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進店門剿吻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來魔招,“玉大人杆逗,你說我怎么就攤上這事蠕蚜。” “怎么了邪蛔?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵匠抗,是天一觀的道長著蛙。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮芍殖,結(jié)果婚禮上肯适,老公的妹妹穿的比我還像新娘赎婚。我一直安慰自己纬凤,他們只是感情好恋技,可當(dāng)我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著抠璃,像睡著了一般搏嗡。 火紅的嫁衣襯著肌膚如雪彻况。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天,我揣著相機與錄音悍赢,去河邊找鬼货徙。 笑死痴颊,一個胖子當(dāng)著我的面吹牛蠢棱,可吹牛的內(nèi)容都是我干的泻仙。 我是一名探鬼主播量没,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼殴蹄,長吁一口氣:“原來是場噩夢啊……” “哼袭灯!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起怠李,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎髓介,沒想到半個月后筋现,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體一膨,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡豹绪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年蝉衣,在試婚紗的時候發(fā)現(xiàn)自己被綠了病毡。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片屁柏。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡前联,死狀恐怖扒披,靈堂內(nèi)的尸體忽然破棺而出妙真,到底是詐尸還是另有隱情每聪,我是刑警寧澤齿风,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布救斑,位于F島的核電站童本,受9級特大地震影響脸候,放射性物質(zhì)發(fā)生泄漏运沦。R本人自食惡果不足惜泵额,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望携添。 院中可真熱鬧,春花似錦薪寓、人聲如沸澜共。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至匹摇,卻和暖如春甲葬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背坡垫。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工冰悠, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人搬泥。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓休溶,卻偏偏與公主長得像,于是被迫代替她去往敵國和親芭碍。 傳聞我的和親對象是個殘疾皇子鸳吸,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,828評論 2 345

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,510評論 25 707
  • Ubuntu的發(fā)音 Ubuntu逐虚,源于非洲祖魯人和科薩人的語言,發(fā)作 oo-boon-too 的音谆膳。了解發(fā)音是有意...
    螢火蟲de夢閱讀 99,157評論 9 467
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件撮躁、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,025評論 4 62
  • 回家路上音樂再次響起樸樹的no fear in my heart漱病,眼淚再一次不由自主的滑落。伴隨著哭泣把曼,從腹部一股...
    在云端01閱讀 157評論 0 2
  • 葉綠花紅雨敲枝杨帽, 榮枯相伴景怡然。 一怒一羞葉拱嬈嗤军, 云雨共歡蓮并蒂注盈!
    紫雨true閱讀 266評論 0 4