QT按钮socket远程控制opengl模型(1)--Apple的学习笔记

学习了3D图像后,我就像之前学习slam及opencv一样。设计一个小项目练手。

一,立项

windows端使用QT开发按键+tcpip通信。
linux端使用opengl+tcpip通信。
最终联调,可以实现QT按钮来控制三维模型的视角投影变换。
意义:可以继续扩充想象其功能。
QT变成了手机端,那么手机可以控制linux设备。
linux设备端的三维模型可以以AR形式嵌入到摄像头采集的实体中。
万丈高楼平地起,我现在练习的就是基础。只是此次设计没有用来什么复杂的设计模式进行抽象。将来可以考虑下。

二,任务拆分

  1. 建立socket通信架构,需要心跳包及重连机制。参考我之前的代码架构,进行复用及重构Vscode Linux下opencv及多进程socket(5)小结--Apple的学习笔记

  2. QT开发比较简单,将linux的tcpip的client端代码移植入即可,再添加图像button处理。

  3. 集成后联调,先在单机上使用local ip进行。即opengl+tcpip也在windows上进行,即使用VS2017开发。

三,当前进度:完成60%

  1. 已经完成:代码架构及模块功能实现,并且通过QT+VS2017(暂时linux端开发)的集成测试。

  2. 未完成:VS代码移植入linux,代码优化,集成测试,设计文档制作及小结。

四,当前的设计

当前设计.png

五,QT客户端类设计

#ifndef WIDGET_H
#define WIDGET_H

#include 
#include 
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    /* key command */
    enum dir{
        FRONT,
        BACK,
        LEFT,
        RIGHT,
        STOP
    };
    Widget(QWidget *parent = nullptr);
    ~Widget();
    /* add picture to the button */
    void bindpic(QPushButton *pbtn,QString apath);
    /* check key update flag */
    bool IsKeyUpdate();
    /* get key value */
    int getKey();
    /* reset key update flag */
    void resetKeyUpdate();
private slots:
    void on_btnFront_pressed();
    void on_btnBack_pressed();
    void on_btnLeft_pressed();
    void on_btnRight_pressed();

private:
    Ui::Widget *ui;
    bool m_bPushed[5];  /* button m_bPushed states */
    int m_nCurrentKey;  /* get current key value */
    bool m_bKeyUpdate;  /* key update flag */
};
#endif // WIDGET_H

#ifndef CLIENT_HPP
#define CLIENT_HPP
#include "Display3D.h"

/* base class */
class baseSocket
{
public:
  enum device
  {
    E_SERVER = 0,
    E_CLIENT = 1
  };
  baseSocket(){};
  ~baseSocket(){};
  /* get socket ID */
  virtual int getConnectfd(void) = 0;
  /* create socket */
  int socketCreate(int aType, int aWay, int aIp, int aPort, int aDev);
  /* Disconnet socket */
  int socketDisconnect(int fd);
  
protected:
  struct sockaddr_in clientaddr, serveraddr;
  int clientfd, serverfd;
};

class baseClient : public baseSocket
{
public:
  baseClient(){};
  ~baseClient(){};
  /* socket connect for client */
  int socketConnect(void);
  /* get socket id for client */
  int getConnectfd(void) override;

private:
};

class clientHandler
{
  enum COM_STATE
  {
    CONNECT,
    LOST
  };

public:
  clientHandler() : m_nState(CONNECT), m_bBeatConnect(FALSE){};
  ~clientHandler(){};
  /* receive heartbeat */
  int recvHeat(baseClient *pClientsocket); /* heat beat */
  /* check connection if wrong then reconnect */
  int HeartDetect(baseClient *pClientsocket);
  /* send key command to server */
  int sendkey(baseClient *pClientsocket, int aData); /* send key info */
  /* judge connect state is active or not */
  int IsConnectState();

private:
  int m_nState;
  bool m_bBeatConnect;
};


#endif

六,效果图

效果图.png

七,实现效果

GIF 2020-3-1 15-15-53.gif

你可能感兴趣的:(QT按钮socket远程控制opengl模型(1)--Apple的学习笔记)