Browse Source

add chartView finished

runningwater 2 years ago
parent
commit
d3f6b01a70
9 changed files with 185 additions and 77 deletions
  1. 9 5
      ch02-sysinfo.pro
  2. 14 0
      cpuwidget.cpp
  3. 21 0
      cpuwidget.h
  4. 13 10
      mainwindow.cpp
  5. 14 10
      mainwindow.h
  6. 10 1
      mainwindow.ui
  7. 51 51
      sysinfolinuximpl.cpp
  8. 23 0
      sysinfowidget.cpp
  9. 30 0
      sysinfowidget.h

+ 9 - 5
ch02-sysinfo.pro

@@ -1,4 +1,4 @@
-QT       += core gui
+QT       += core gui charts
 
 greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
 
@@ -9,13 +9,17 @@ CONFIG += c++17
 #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0
 
 SOURCES += \
+    cpuwidget.cpp \
     main.cpp \
     mainwindow.cpp \
-    sysinfo.cpp
+    sysinfo.cpp \
+    sysinfowidget.cpp
 
 HEADERS += \
+    cpuwidget.h \
     mainwindow.h \
-    sysinfo.h
+    sysinfo.h \
+    sysinfowidget.h
 
 windows {
     SOURCES += sysinfowindowsimpl.cpp
@@ -23,12 +27,12 @@ windows {
 }
 
 linux {
-    SOURCES += sysinfowindowsimpl.cpp
+    SOURCES += sysinfolinuximpl.cpp
     HEADERS += sysinfolinuximpl.h
 }
 
 macx {
-    SOURCES += sysinfolinuximpl.cpp
+    SOURCES += sysinfomacimpl.cpp
     HEADERS += sysinfomacimpl.h
 }
 

+ 14 - 0
cpuwidget.cpp

@@ -0,0 +1,14 @@
+#include "cpuwidget.h"
+
+CpuWidget::CpuWidget(QWidget* parent)
+    : SysInfoWidget(parent), mSeries(new QPieSeries(this)) {
+  mSeries->setHoleSize(0.35);
+  mSeries->append("CPU LOAD", 30.0);
+  mSeries->append("CPU Free", 70.0);
+
+  QChart* chart = chartView().chart();
+  chart->addSeries(mSeries);
+  chart->setTitle("CPU average load");
+}
+
+void CpuWidget::updateSeries() { qDebug() << "updateSeries"; }

+ 21 - 0
cpuwidget.h

@@ -0,0 +1,21 @@
+#ifndef CPUWIDGET_H
+#define CPUWIDGET_H
+
+#include <QtCharts/QPieSeries>
+
+#include "sysinfowidget.h"
+
+class CpuWidget : public SysInfoWidget {
+  Q_OBJECT
+ public:
+  CpuWidget(QWidget* parent = 0);
+
+  // SysInfoWidget interface
+ protected slots:
+  void updateSeries() override;
+
+ private:
+  QPieSeries* mSeries;
+};
+
+#endif  // CPUWIDGET_H

+ 13 - 10
mainwindow.cpp

@@ -1,15 +1,18 @@
 #include "mainwindow.h"
-#include "ui_mainwindow.h"
 
-MainWindow::MainWindow(QWidget *parent)
-    : QMainWindow(parent)
-    , ui(new Ui::MainWindow)
-{
-    ui->setupUi(this);
-}
+#include <QVBoxLayout>
+
+#include "sysinfo.h"
+#include "ui_mainwindow.h"
 
-MainWindow::~MainWindow()
-{
-    delete ui;
+MainWindow::MainWindow(QWidget* parent)
+    : QMainWindow(parent), ui(new Ui::MainWindow), mCpuWidget(this) {
+  ui->setupUi(this);
+  SysInfo::instance().init();
+  qDebug() << SysInfo::instance().memoryUsed();
+  QVBoxLayout* layout = new QVBoxLayout();
+  layout->addWidget(&mCpuWidget);
+  ui->centralwidget->setLayout(layout);
 }
 
+MainWindow::~MainWindow() { delete ui; }

+ 14 - 10
mainwindow.h

@@ -3,19 +3,23 @@
 
 #include <QMainWindow>
 
+#include "cpuwidget.h"
+
 QT_BEGIN_NAMESPACE
-namespace Ui { class MainWindow; }
+namespace Ui {
+class MainWindow;
+}
 QT_END_NAMESPACE
 
-class MainWindow : public QMainWindow
-{
-    Q_OBJECT
+class MainWindow : public QMainWindow {
+  Q_OBJECT
 
-public:
-    MainWindow(QWidget *parent = nullptr);
-    ~MainWindow();
+ public:
+  MainWindow(QWidget *parent = nullptr);
+  ~MainWindow();
 
-private:
-    Ui::MainWindow *ui;
+ private:
+  Ui::MainWindow *ui;
+  CpuWidget mCpuWidget;
 };
-#endif // MAINWINDOW_H
+#endif  // MAINWINDOW_H

+ 10 - 1
mainwindow.ui

@@ -14,7 +14,16 @@
    <string>MainWindow</string>
   </property>
   <widget class="QWidget" name="centralwidget"/>
-  <widget class="QMenuBar" name="menubar"/>
+  <widget class="QMenuBar" name="menubar">
+   <property name="geometry">
+    <rect>
+     <x>0</x>
+     <y>0</y>
+     <width>800</width>
+     <height>24</height>
+    </rect>
+   </property>
+  </widget>
   <widget class="QStatusBar" name="statusbar"/>
  </widget>
  <resources/>

+ 51 - 51
sysinfolinuximpl.cpp

@@ -1,51 +1,51 @@
-#include "sysinfolinuximpl.h"
-
-#include <sys/sysinfo.h>
-#include <sys/types.h>
-
-SysInfoLinuxImpl::SysInfoLinuxImpl() : SysInfo(), mCpuLoadLastValues() {}
-
-void SysInfoLinuxImpl::init() { mCpuLoadLastValues = cpuRawData(); }
-
-double SysInfoLinuxImpl::cpuLoadAverage() {
-  QVector<qulonglong> firstSample = mCpuLoadLastValues;
-  QVector<qulonglong> secondSample = cpuRawData();
-  mCpuLoadLastValues = secondSample;
-  double overall = (secondSample[0] - firstSample[0]) +
-                   (secondSample[1] - firstSample[1]) +
-                   (secondSample[2] - firstSample[2]);
-  double total = overall + (secondSample[3] - firstSample[3]);
-  double percent = (overall / total) * 100.0;
-  return qBound(0.0, percent, 100.0);
-}
-
-double SysInfoLinuxImpl::memoryUsed() {
-  struct sysinfo memInfo;
-  sysinfo(&memInfo);
-  qulonglong totalMemory = memInfo.totalram;
-  totalMemory += memInfo.totalswap;
-  totalMemory *= memInfo.mem_unit;
-  qulonglong totalMemoryUsed = memInfo.totalram - memInfo.freeram;
-  totalMemoryUsed += memInfo.totalswap - memInfo.freeswap;
-  totalMemoryUsed *= memInfo.mem_unit;
-  double percent = (double)totalMemoryUsed / (double)totalMemory * 100.0;
-  return qBound(0.0, percent, 100.0);
-}
-
-QVector<qulonglong> SysInfoLinuxImpl::cpuRawData() {
-  QFile file("/proc/stat");
-  file.open(QIODevice::ReadOnly);
-  QByteArray line = file.readLine();
-  file.close();
-  qulonglong totalUser = 0, totalUserNice = 0, totalSystem = 0, totalIdle = 0;
-  std::sscanf(line.data(), "cpu %llu %llu %llu %llu", &totalUser,
-              &totalUserNice, &totalSystem, &totalIdle);
-
-  QVector<qulonglong> rawData;
-  rawData.append(totalUser);
-  rawData.append(totalUserNice);
-  rawData.append(totalSystem);
-  rawData.append(totalIdle);
-
-  return rawData;
-}
+// #include "sysinfolinuximpl.h"
+
+//// #include <sys/sysinfo.h>
+// #include <sys/types.h>
+
+// SysInfoLinuxImpl::SysInfoLinuxImpl() : SysInfo(), mCpuLoadLastValues() {}
+
+// void SysInfoLinuxImpl::init() { mCpuLoadLastValues = cpuRawData(); }
+
+// double SysInfoLinuxImpl::cpuLoadAverage() {
+//   QVector<qulonglong> firstSample = mCpuLoadLastValues;
+//   QVector<qulonglong> secondSample = cpuRawData();
+//   mCpuLoadLastValues = secondSample;
+//   double overall = (secondSample[0] - firstSample[0]) +
+//                    (secondSample[1] - firstSample[1]) +
+//                    (secondSample[2] - firstSample[2]);
+//   double total = overall + (secondSample[3] - firstSample[3]);
+//   double percent = (overall / total) * 100.0;
+//   return qBound(0.0, percent, 100.0);
+// }
+
+// double SysInfoLinuxImpl::memoryUsed() {
+//   struct sysinfo memInfo;
+//   sysinfo(&memInfo);
+//   qulonglong totalMemory = memInfo.totalram;
+//   totalMemory += memInfo.totalswap;
+//   totalMemory *= memInfo.mem_unit;
+//   qulonglong totalMemoryUsed = memInfo.totalram - memInfo.freeram;
+//   totalMemoryUsed += memInfo.totalswap - memInfo.freeswap;
+//   totalMemoryUsed *= memInfo.mem_unit;
+//   double percent = (double)totalMemoryUsed / (double)totalMemory * 100.0;
+//   return qBound(0.0, percent, 100.0);
+// }
+
+// QVector<qulonglong> SysInfoLinuxImpl::cpuRawData() {
+//   QFile file("/proc/stat");
+//   file.open(QIODevice::ReadOnly);
+//   QByteArray line = file.readLine();
+//   file.close();
+//   qulonglong totalUser = 0, totalUserNice = 0, totalSystem = 0, totalIdle =
+//   0; std::sscanf(line.data(), "cpu %llu %llu %llu %llu", &totalUser,
+//               &totalUserNice, &totalSystem, &totalIdle);
+
+//  QVector<qulonglong> rawData;
+//  rawData.append(totalUser);
+//  rawData.append(totalUserNice);
+//  rawData.append(totalSystem);
+//  rawData.append(totalIdle);
+
+//  return rawData;
+//}

+ 23 - 0
sysinfowidget.cpp

@@ -0,0 +1,23 @@
+#include "sysinfowidget.h"
+
+#include <QVBoxLayout>
+
+SysInfoWidget::SysInfoWidget(QWidget* parent, int startDelayMs,
+                             int updateSeriesDelayMs)
+    : QWidget(parent), mChartView(this) {
+  mRefreshTimer.setInterval(updateSeriesDelayMs);
+
+  // 时间到就触发 updateSeries 函数
+  connect(&mRefreshTimer, &QTimer::timeout, this, &SysInfoWidget::updateSeries);
+
+  QTimer::singleShot(startDelayMs, [this] { mRefreshTimer.start(); });
+
+  mChartView.setRenderHint(QPainter::Antialiasing);
+  mChartView.chart()->legend()->setVisible(false);
+
+  QVBoxLayout* layout = new QVBoxLayout(this);
+  layout->addWidget(&mChartView);
+  setLayout(layout);
+}
+
+QChartView& SysInfoWidget::chartView() { return mChartView; }

+ 30 - 0
sysinfowidget.h

@@ -0,0 +1,30 @@
+#ifndef SYSINFOWIDGET_H
+#define SYSINFOWIDGET_H
+
+#include <QTimer>
+#include <QWidget>
+#include <QtCharts/QChartView>
+
+/**
+ * @brief The SysInfoWidget class
+ *  The QChartView is the generic widget that can display
+ *  many types of chat. This class will
+ *  handle the layout and display the QChartView
+ */
+class SysInfoWidget : public QWidget {
+  Q_OBJECT
+ public:
+  explicit SysInfoWidget(QWidget* parent = 0, int startDelayMs = 500,
+                         int updateSeriesDelayMs = 500);
+
+ protected:
+  QChartView& chartView();
+ protected slots:
+  virtual void updateSeries() = 0;
+
+ private:
+  QTimer mRefreshTimer;
+  QChartView mChartView;
+};
+
+#endif  // SYSINFOWIDGET_H