QT按钮socket远程控制opengl模型--Apple的学习
2020-03-01 本文已影响0人
applecai
学习了3D图像后,我就像之前学习slam及opencv一样。设计一个小项目练手。
一,立项
windows端使用QT开发按键+tcpip通信。
linux端使用opengl+tcpip通信。
最终联调,可以实现QT按钮来控制三维模型的视角投影变换。
意义:可以继续扩充想象其功能。
QT变成了手机端,那么手机可以控制linux设备。
linux设备端的三维模型可以以AR形式嵌入到摄像头采集的实体中。
万丈高楼平地起,我现在练习的就是基础。只是此次设计没有用来什么复杂的设计模式进行抽象。将来可以考虑下。
二,任务拆分
-
建立socket通信架构,需要心跳包及重连机制。参考我之前的代码架构,进行复用及重构Vscode Linux下opencv及多进程socket(5)小结--Apple的学习笔记
-
QT开发比较简单,将linux的tcpip的client端代码移植入即可,再添加图像button处理。
-
集成后联调,先在单机上使用local ip进行。即opengl+tcpip也在windows上进行,即使用VS2017开发。
三,当前进度:完成60%
-
已经完成:代码架构及模块功能实现,并且通过QT+VS2017(暂时linux端开发)的集成测试。
-
未完成: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