/* * Copyright (C) 2013 ~ 2018 National University of Defense Technology(NUDT) & Tianjin Kylin Ltd. * * Authors: * Kobe Lee xiangli@ubuntukylin.com/kobe24_lixiang@126.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "systemmonitor.h" #include "util.h" #include #include #include #include #include #include #include #include #include #include SystemMonitor::SystemMonitor(QWidget *parent) : QFrame(parent) , mousePressed(false) { // this->setStyleSheet("QFrame{border: 1px solid #121212;border-radius:1px;background-color:#1f1f1f;}"); // this->setAttribute(Qt::WA_DeleteOnClose); // this->setWindowFlags(this->windowFlags() | Qt::FramelessWindowHint | Qt::WindowCloseButtonHint);//去掉边框 // this->setAttribute(Qt::WA_TranslucentBackground);//背景透明 //kobe:如果不加Qt::WindowMinimizeButtonHint,则调用setFixedSize()之后,调用窗口最小化函数将会没有效果 this->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowCloseButtonHint | Qt::WindowMinimizeButtonHint); // this->setWindowFlags(Qt::FramelessWindowHint); // this->setWindowFlags(Qt::Window | Qt::FramelessWindowHint | Qt::WindowMinimizeButtonHint);//Attention: Qt::WindowCloseButtonHint make showMinimized() valid this->setAutoFillBackground(true); this->setMouseTracking(true); // installEventFilter(this); this->setWindowTitle(tr("Kylin System Monitor")); this->setWindowIcon(QIcon(":/model/res/plugin/processmanager.png")); this->resize(900, 600); setMinimumSize(640, 480); proSettings = new QSettings(KYLIN_COMPANY_SETTING, KYLIN_SETTING_FILE_NAME_SETTING); proSettings->setIniCodec("UTF-8"); this->initTitleWidget(); this->initPanelStack(); this->initConnections(); //边框阴影效果 QGraphicsDropShadowEffect *shadow_effect = new QGraphicsDropShadowEffect(this); shadow_effect->setBlurRadius(5); shadow_effect->setColor(QColor(0, 0, 0, 127)); shadow_effect->setOffset(2, 4); this->setGraphicsEffect(shadow_effect); this->moveCenter(); } SystemMonitor::~SystemMonitor() { if (m_sysMonitorStack) { foreach (QObject *child, m_sysMonitorStack->children()) { QWidget *widget = static_cast(child); widget->deleteLater(); } delete m_sysMonitorStack; } if (m_titleWidget) { delete m_titleWidget; m_titleWidget = nullptr; } if (process_dialog) { delete process_dialog; process_dialog = nullptr; } if (resources_dialog) { delete resources_dialog; resources_dialog = nullptr; } if (filesystem_dialog) { delete filesystem_dialog; filesystem_dialog = nullptr; } if (proSettings != NULL) { delete proSettings; proSettings = NULL; } } void SystemMonitor::resizeEvent(QResizeEvent *e) { if (m_titleWidget) { m_titleWidget->resize(width() - 2, MONITOR_TITLE_WIDGET_HEIGHT); if (e->oldSize() != e->size()) { emit m_titleWidget->updateMaxBtn(); } } if (m_sysMonitorStack) { m_sysMonitorStack->resize(width() - 2, this->height() - MONITOR_TITLE_WIDGET_HEIGHT - 2); m_sysMonitorStack->move(1, MONITOR_TITLE_WIDGET_HEIGHT + 1); } } void SystemMonitor::recordProcessVisibleColumn(int, bool, QList columnVisible) { QList m_visibleColumns; m_visibleColumns << "name"; if (columnVisible[1]) { m_visibleColumns << "user"; } if (columnVisible[2]) { m_visibleColumns << "status"; } if (columnVisible[3]) { m_visibleColumns << "cpu"; } if (columnVisible[4]) { m_visibleColumns << "pid"; } if (columnVisible[5]) { m_visibleColumns << "command"; } if (columnVisible[6]) { m_visibleColumns << "memory"; } if (columnVisible[7]) { m_visibleColumns << "priority"; } QString displayedColumns = ""; for (int i = 0; i < m_visibleColumns.length(); i++) { if (i != m_visibleColumns.length() - 1) { displayedColumns += QString("%1,").arg(m_visibleColumns[i]); } else { displayedColumns += m_visibleColumns[i]; } } proSettings->beginGroup("PROCESS"); proSettings->setValue("DisplayedColumns", displayedColumns); proSettings->endGroup(); proSettings->sync(); } void SystemMonitor::recordSortStatus(int index, bool isSort) { QList columnNames = { "name", "user", "status", "cpu", "pid", "command", "memory", "priority"}; proSettings->beginGroup("PROCESS"); proSettings->setValue("CurrentSortColumn", columnNames[index]); proSettings->setValue("IsSort", isSort); proSettings->endGroup(); proSettings->sync(); } void SystemMonitor::recordFileSysVisibleColumn(int, bool, QList columnVisible) { QList m_visibleColumns; m_visibleColumns << "device"; if (columnVisible[1]) { m_visibleColumns << "directory"; } if (columnVisible[2]) { m_visibleColumns << "type"; } if (columnVisible[3]) { m_visibleColumns << "total"; } if (columnVisible[4]) { m_visibleColumns << "free"; } if (columnVisible[5]) { m_visibleColumns << "available"; } if (columnVisible[6]) { m_visibleColumns << "used"; } QString displayedColumns = ""; for (int i = 0; i < m_visibleColumns.length(); i++) { if (i != m_visibleColumns.length() - 1) { displayedColumns += QString("%1,").arg(m_visibleColumns[i]); } else { displayedColumns += m_visibleColumns[i]; } } proSettings->beginGroup("FileSystem"); proSettings->setValue("DisplayedColumns", displayedColumns); proSettings->endGroup(); proSettings->sync(); } void SystemMonitor::initPanelStack() { m_sysMonitorStack = new QStackedWidget(this); m_sysMonitorStack->setStyleSheet("QStackedWidget{background: rgb(255, 255, 255);}"); m_sysMonitorStack->setObjectName("SystemMonitorStack"); m_sysMonitorStack->resize(width() - 2, this->height() - TITLE_WIDGET_HEIGHT); m_sysMonitorStack->move(1, TITLE_WIDGET_HEIGHT); m_sysMonitorStack->setMouseTracking(false); m_sysMonitorStack->installEventFilter(this); process_dialog = new ProcessDialog(getReadyDisplayProcessColumns(), getCurrentSortColumnIndex(), isSortOrNot(), proSettings); process_dialog->getProcessView()->installEventFilter(this); connect(process_dialog, &ProcessDialog::changeColumnVisible, this, &SystemMonitor::recordProcessVisibleColumn); connect(process_dialog, &ProcessDialog::changeSortStatus, this, &SystemMonitor::recordSortStatus); resources_dialog = new ResouresDialog; filesystem_dialog = new FileSystemDialog(getReadyDisplayFileSysColumns(), proSettings); filesystem_dialog->getFileSysView()->installEventFilter(this); connect(filesystem_dialog, SIGNAL(changeColumnVisible(int,bool,QList)), this, SLOT(recordFileSysVisibleColumn(int,bool,QList))); m_sysMonitorStack->addWidget(process_dialog); m_sysMonitorStack->addWidget(resources_dialog); m_sysMonitorStack->addWidget(filesystem_dialog); m_sysMonitorStack->setCurrentWidget(process_dialog); } void SystemMonitor::initTitleWidget() { m_titleWidget = new MonitorTitleWidget(proSettings, this); m_titleWidget->resize(width() - 2, MONITOR_TITLE_WIDGET_HEIGHT); m_titleWidget->move(1, 1); } void SystemMonitor::initConnections() { connect(m_titleWidget, SIGNAL(changePage(int)), this, SLOT(onChangePage(int))); connect(m_titleWidget, SIGNAL(canelSearchEditFocus()), process_dialog, SLOT(focusProcessView())); connect(m_titleWidget, SIGNAL(searchSignal(QString)), process_dialog, SLOT(onSearch(QString)), Qt::QueuedConnection); } void SystemMonitor::onChangePage(int index) { if (m_sysMonitorStack) { m_sysMonitorStack->setCurrentIndex(index); if (index == 1) { //start time resources_dialog->startCpuTimer(); } else { //stop time resources_dialog->stopCpuTimer(); } } } int SystemMonitor::getCurrentSortColumnIndex() { proSettings->beginGroup("PROCESS"); QString currentSortColumn = proSettings->value("CurrentSortColumn").toString(); proSettings->endGroup(); QList columnNames = {"name", "user", "status", "cpu", "pid", "command", "memory", "priority"}; return columnNames.indexOf(currentSortColumn); } bool SystemMonitor::isSortOrNot() { proSettings->beginGroup("PROCESS"); bool value = proSettings->value("IsSort", true).toBool(); proSettings->endGroup(); return value; } QList SystemMonitor::getReadyDisplayProcessColumns() { proSettings->beginGroup("PROCESS"); QString displayedColumns = proSettings->value("DisplayedColumns", "name,user,status,cpu,pid,command,memory,priority").toString(); proSettings->endGroup(); if (displayedColumns.isEmpty()) { proSettings->beginGroup("PROCESS"); displayedColumns = "name,user,status,cpu,pid,command,memory,priority"; proSettings->setValue("DisplayedColumns", displayedColumns); proSettings->endGroup(); proSettings->sync(); } QList m_shows; m_shows << displayedColumns.contains("name"); m_shows << displayedColumns.contains("user"); m_shows << displayedColumns.contains("status"); m_shows << displayedColumns.contains("cpu"); m_shows << displayedColumns.contains("pid"); m_shows << displayedColumns.contains("command"); m_shows << displayedColumns.contains("memory"); m_shows << displayedColumns.contains("priority"); return m_shows; } QList SystemMonitor::getReadyDisplayFileSysColumns() { proSettings->beginGroup("FileSystem"); QString displayedColumns = proSettings->value("DisplayedColumns", "device,directory,type,total,free,available,used").toString(); proSettings->endGroup(); if (displayedColumns.isEmpty()) { proSettings->beginGroup("FileSystem"); displayedColumns = "device,directory,type,total,free,available,used"; proSettings->setValue("DisplayedColumns", displayedColumns); proSettings->endGroup(); proSettings->sync(); } QList m_shows; m_shows << displayedColumns.contains("device"); m_shows << displayedColumns.contains("directory"); m_shows << displayedColumns.contains("type"); m_shows << displayedColumns.contains("total"); m_shows << displayedColumns.contains("free"); m_shows << displayedColumns.contains("available"); m_shows << displayedColumns.contains("used"); return m_shows; } void SystemMonitor::moveCenter() { QPoint pos = QCursor::pos(); QRect primaryGeometry; for (QScreen *screen : qApp->screens()) { if (screen->geometry().contains(pos)) { primaryGeometry = screen->geometry(); } } if (primaryGeometry.isEmpty()) { primaryGeometry = qApp->primaryScreen()->geometry(); } this->move(primaryGeometry.x() + (primaryGeometry.width() - this->width())/2, primaryGeometry.y() + (primaryGeometry.height() - this->height())/2); } void SystemMonitor::closeEvent(QCloseEvent *event) { event->accept(); } /*void SystemMonitor::paintEvent(QPaintEvent *event) { QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing, true); //绘制背景色 // QPainterPath path; // path.addRect(QRectF(rect())); // painter.setOpacity(1); // painter.fillPath(path, QColor("#FFFFFF")); painter.setPen(QPen(QColor("#0d87ca"), 0));//边框颜色 #3f96e4 painter.setBrush(QColor("#e9eef0"));//背景色 painter.setRenderHint(QPainter::Antialiasing, true); painter.setOpacity(1); QRectF r(0 / 2.0, 0 / 2.0, width() - 0, height() - 0);//左边 上边 右边 下边 painter.drawRoundedRect(r, 4, 4); QFrame::paintEvent(event); }*/ void SystemMonitor::mousePressEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) { this->dragPosition = event->globalPos() - frameGeometry().topLeft(); this->mousePressed = true; } QFrame::mousePressEvent(event); } void SystemMonitor::mouseReleaseEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) { this->mousePressed = false; } QFrame::mouseReleaseEvent(event); } void SystemMonitor::mouseMoveEvent(QMouseEvent *event) { if (this->mousePressed) { move(event->globalPos() - this->dragPosition); } QFrame::mouseMoveEvent(event); }