C++Qt学习QT

QT按钮socket远程控制opengl模型--Apple的学习

2020-03-01  本文已影响0人  applecai

学习了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 <QWidget>
#include <QPushButton>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    enum dir{
        FRONT,
        BACK,
        LEFT,
        RIGHT,
        STOP
    };
    Widget(QWidget *parent = nullptr);
    ~Widget();
    void bindpic(QPushButton *btn,QString path);
    bool IsKeyUpdate();
    int getKey();
    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 pushed[5];
    int currentKey;
    bool KeyUpdate;
};
#endif // WIDGET_H
#ifndef CLIENT_HPP
#define CLIENT_HPP
#include "Display3D.h"


class baseSocket
{
public:
  enum device
  {
    E_SERVER = 0,
    E_CLIENT = 1
  };
  baseSocket(){};
  ~baseSocket(){};
  virtual int getConnectfd(void) = 0;
  int socketCreate(int type, int way, int ip, int port, int dev);
  int socketDisconnect(int fd);
protected:
  struct sockaddr_in clientaddr,serveraddr;
  int clientfd,serverfd;
};

class baseClient: public baseSocket
{
public:
  baseClient(){};
  ~baseClient(){};
  int socketConnect(void);
  int getConnectfd(void) override;

private:

};

class clientHandler
{
  enum COM_STATE{
    CONNECT,
    LOST
  };
  public:
  clientHandler():_state(CONNECT),_BeatConnect(FALSE){};
  ~clientHandler(){};
  int recvHeat(baseClient * client_socket); /* heat beat */
  int HeartDetect(baseClient * client_socket);
  int sendkey(baseClient * client_socket,int data); /* send key info */
  int IsConnectState();
  private:
  int _state;
  int _BeatConnect;
};


#endif

六,效果图

效果图.png

七,实现效果

GIF 2020-3-1 15-15-53.gif
上一篇 下一篇

猜你喜欢

热点阅读