Bladeren bron

update screen from network json

xuqiang 5 maanden geleden
bovenliggende
commit
6cedd09212
11 gewijzigde bestanden met toevoegingen van 190 en 3 verwijderingen
  1. 2 1
      CMakeLists.txt
  2. 3 0
      include/appcontext.h
  3. 5 0
      include/canvas.h
  4. 3 0
      include/mainwindow.h
  5. 28 0
      include/network.h
  6. 17 0
      include/utils.h
  7. 5 0
      src/appcontext.cpp
  8. 15 1
      src/canvas.cpp
  9. 53 1
      src/mainwindow.cpp
  10. 46 0
      src/network.cpp
  11. 13 0
      src/utils.cpp

+ 2 - 1
CMakeLists.txt

@@ -42,7 +42,7 @@ set(CMAKE_PREFIX_PATH
     ${QT5_DIR}/lib/cmake
 )
 
-find_package(Qt5 REQUIRED COMPONENTS Widgets UiPlugin)
+find_package(Qt5 REQUIRED COMPONENTS Widgets UiPlugin Network)
 
 set(PROJECT_SOURCE_DIR_LIST
     ${CMAKE_CURRENT_SOURCE_DIR}/include
@@ -102,6 +102,7 @@ target_link_libraries(${PROJECT_NAME}
     PRIVATE
     Qt5::Widgets
     Qt5::UiPlugin
+    Qt5::Network
 )
 
 target_link_directories(${PROJECT_NAME}

+ 3 - 0
include/appcontext.h

@@ -4,6 +4,7 @@
 #include <QObject>
 #include "pluginmanager.h"
 #include "projectmanager.h"
+#include "network.h"
 
 class AppContext : public QObject
 {
@@ -16,10 +17,12 @@ public:
     static AppContext &instance();
     PluginManager &pluginManager();
     ProjectManager &projectManager();
+    Network &network();
 
 private:
     PluginManager m_pluginMgr;
     ProjectManager m_projectMgr;
+    Network m_network;
 
 };
 

+ 5 - 0
include/canvas.h

@@ -17,11 +17,16 @@ public:
     void setBackgroundColor(const QColor &newBackgroundColor);
     bool load(const xmlNodePtr canvasNodePtr);
 
+    QList<QWidget *> widgetList() const;
+    QList<QStringList> parameterList() const;
+
 protected:
     void paintEvent(QPaintEvent *event) override;
 
 private:
     QColor m_backgroundColor;
+    QList<QWidget *> m_widgetList;
+    QList<QStringList> m_parameterList;
 
 };
 

+ 3 - 0
include/mainwindow.h

@@ -19,6 +19,9 @@ protected:
 
 private:
     QStackedWidget *m_pStackedWidget;
+
+public slots:
+    void onUpdateScreen(const QJsonObject &obj);
     
 };
 

+ 28 - 0
include/network.h

@@ -0,0 +1,28 @@
+#ifndef __NETWORK_H__
+#define __NETWORK_H__
+
+#include <QObject>
+#include <QUdpSocket>
+
+class Network : public QObject
+{
+    Q_OBJECT
+
+public:
+    explicit Network(QObject *parent = nullptr);
+    ~Network();
+
+private:
+    QUdpSocket m_udpSocket;
+
+signals:
+    void updateScreen(const QJsonObject &obj);
+
+private slots:
+    void onUdpReadyRead();
+
+};
+
+
+
+#endif  // NETWORK_H

+ 17 - 0
include/utils.h

@@ -0,0 +1,17 @@
+#ifndef __UTILS_H__
+#define __UTILS_H__
+
+#include <QObject>
+
+class Utils : public QObject
+{
+    Q_OBJECT
+
+public:
+    explicit Utils(QObject *parent = nullptr);
+    
+    static QString timestamp();
+
+};
+
+#endif  // UTILS_H

+ 5 - 0
src/appcontext.cpp

@@ -29,3 +29,8 @@ ProjectManager &AppContext::projectManager()
     return m_projectMgr;
 }
 
+Network &AppContext::network()
+{
+    return m_network;
+}
+

+ 15 - 1
src/canvas.cpp

@@ -166,12 +166,16 @@ bool Canvas::load(const xmlNodePtr canvasNodePtr)
                         QWidget *widget = customWidgets.at(i)->createWidget(this);
                         // 设置绑定参数
                         AbstractWidget *pAbstractWidget = static_cast<AbstractWidget *>(widget);
-                        if(pAbstractWidget)
+                        if(pAbstractWidget) {
                             QMetaObject::invokeMethod(pAbstractWidget,
                                                       "setParameters",
                                                       Qt::AutoConnection,
                                                       Q_ARG(QStringList, parameters));
 
+                            m_widgetList << widget;
+                            m_parameterList << parameters;
+                        }
+
 
                         //逐个设置自定义控件的属性
                         for(int j = 0; j < countProperty; j++)
@@ -200,6 +204,16 @@ bool Canvas::load(const xmlNodePtr canvasNodePtr)
     }
 }
 
+QList<QWidget *> Canvas::widgetList() const
+{
+    return m_widgetList;
+}
+
+QList<QStringList> Canvas::parameterList() const
+{
+    return m_parameterList;
+}
+
 void Canvas::paintEvent(QPaintEvent *event)
 {
     // 绘制背景颜色

+ 53 - 1
src/mainwindow.cpp

@@ -1,9 +1,12 @@
 #include "mainwindow.h"
 #include <QVBoxLayout>
 #include <QDir>
+#include <QElapsedTimer>
 #include "appcontext.h"
 #include "canvas.h"
 #include "logger.h"
+#include "utils.h"
+#include "abstractwidget.h"
 
 MainWindow::MainWindow(QWidget *parent)
     : QMainWindow(parent)
@@ -11,6 +14,11 @@ MainWindow::MainWindow(QWidget *parent)
 {
     setWindowFlags(Qt::FramelessWindowHint | Qt::Window);
     init_ui();
+
+    Network &network = AppContext::instance().network();
+    connect(&network, &Network::updateScreen, this, &MainWindow::onUpdateScreen);
+
+
 }
 
 MainWindow::~MainWindow()
@@ -39,4 +47,48 @@ void MainWindow::init_ui()
     }
 
     m_pStackedWidget->setCurrentIndex(0);
-}
+}
+
+void MainWindow::onUpdateScreen(const QJsonObject &obj)
+{
+    QElapsedTimer timer;
+    timer.start(); // 开始计时
+
+    Canvas *pCanvas = static_cast<Canvas *>(m_pStackedWidget->currentWidget());
+    if(!pCanvas) {
+        LOG_ERROR("error current canvas");
+        return;
+    }
+
+    QList<QWidget *> widgets = pCanvas->widgetList();
+    QList<QStringList> parameters = pCanvas->parameterList();
+
+    if(widgets.count() != parameters.count()) {
+        LOG_ERROR("error widget count and parameters count");
+        return;
+    }
+
+    int count = widgets.count();
+
+    for(int i = 0; i < count; i++)
+    {
+        AbstractWidget *pAbstractWidget = static_cast<AbstractWidget *>(widgets[i]);
+        QStringList widgetParameters;
+        QMetaObject::invokeMethod(pAbstractWidget, "parameters",
+                                      Qt::DirectConnection, Q_RETURN_ARG(QStringList, widgetParameters));
+
+        for(auto parameter : widgetParameters)
+        {
+            QMetaObject::invokeMethod(
+                pAbstractWidget,
+                "setValue",
+                Qt::DirectConnection,
+                Q_ARG(QString, parameter),
+                Q_ARG(QVariant, obj[parameter].toVariant()),
+                Q_ARG(QString, Utils::timestamp()));
+        }
+    }
+
+    qint64 duration = timer.elapsed(); // 获取经过的毫秒数
+    LOG_DEBUG("update screen duration: {}ms", duration);
+}

+ 46 - 0
src/network.cpp

@@ -0,0 +1,46 @@
+#include "network.h"
+#include "logger.h"
+#include <QJsonObject>
+#include <QJsonArray>
+#include <QJsonDocument>
+
+Network::Network(QObject *parent)
+    : QObject{parent}
+{
+    bool ok = m_udpSocket.bind(QHostAddress::AnyIPv4, 18000);
+
+    if (!ok) {
+        LOG_ERROR("udp bind failed: {}", m_udpSocket.errorString().toUtf8().data());
+        return;
+    }
+
+    connect(&m_udpSocket, &QUdpSocket::readyRead, this, &Network::onUdpReadyRead);
+}
+
+Network::~Network()
+{
+
+}
+
+void Network::onUdpReadyRead()
+{
+    QByteArray datagram;
+    QHostAddress addr;
+    quint16 port;
+    QJsonDocument doc;
+    QJsonParseError jsonError;
+    while (m_udpSocket.hasPendingDatagrams()) 
+    {
+        datagram.resize(int(m_udpSocket.pendingDatagramSize()));
+        m_udpSocket.readDatagram(datagram.data(), datagram.size(), &addr, &port);
+
+        LOG_DEBUG("receive from {}:{}", addr.toString().toUtf8().data(), port);
+
+        doc = QJsonDocument::fromJson(datagram, &jsonError);
+        if(jsonError.error == QJsonParseError::NoError && doc.isObject())
+        {
+            LOG_INFO("{}", doc.toJson().data());
+            emit updateScreen(doc.object());
+        }
+    }
+}

+ 13 - 0
src/utils.cpp

@@ -0,0 +1,13 @@
+#include "utils.h"
+#include <QDateTime>
+
+Utils::Utils(QObject *parent)
+    : QObject{parent}
+{
+
+}
+
+QString Utils::timestamp()
+{
+    return QString("%1").arg(QDateTime::currentMSecsSinceEpoch());
+}