Black 학습 Qt+ 원격 데스크톱 공유

2205 단어
# 데스크톱 공유 # 호스트 A와 호스트 B 간의 통신을 위한 소프트웨어 구현, 호스트 A는 데스크톱을 호스트 B에 공유

분석

  • 호스트 A는 호스트 B와 통신하고 호스트 A는 서버이며 호스트 B는 클라이언트이며 A는 B에게 실시간으로 A 자신의 데스크톱을 보낸다
  • 서버에 인터페이스가 없습니다
  • 클라이언트는 디스플레이 인터페이스가 있고 디스플레이 인터페이스는 서버가 보낸 데스크톱 데이터를 표시합니다
  • 클라이언트는 가능한 한 유창하게 보여야 하며 중간에 비교적 큰 정체와 반짝임이 존재하지 않는다

  • 대략적인 사고방식:

  • 두 호스트 간의 통신을 실현하고 TCP 방법을 이용한다
  • 데스크톱 가져오기
  • 데스크톱을 보냅니다

  • 희망

  • 이 소프트웨어를 깊이 있게 연구하여 TIM의'원격 데스크톱'처럼 호스트 A가 데스크톱을 호스트 B에게 보내면 호스트 B는 자신의 데스크톱에서 호스트 A를 제어할 수 있다

  • 구체적 과정

  • Day_0 데스크톱을 캡처하여 데스크톱 그림을 얻을 수 있습니다
  • Day_1 두 기기 간의 통신을 실현한다
  • Day_이
  • Day_삼
  • Day_사
  • Day_오
  • Day_육
  • Day_칠
  • Day_팔
  • Day_구
  • Day_십

  • 당면한 문제

  • QPixmap 파일을 파일에 저장하는 방법
     QPixmap m_pixmap = QPixmap::grabWindow(QApplication::desktop()->winId());// 
     m_pixmap.save("myDesktop.bmp","BMP");// , .bmp
    
  • QPixmap 파일을 바이너리 데이터로 변환하는 방법
     QPixmap m_pixmap = QPixmap::grabWindow(QApplication::desktop()->winId());
     m_pixmap.save("m_pixmap","BMP");
    
     QByteArray myArray;
     QBuffer buffer(&myArray);
     buffer.open(QIODevice::WriteOnly);
     m_pixmap.save(&buffer,"BMP");
    
     QFile picture("picture.bmp");
     picture.open(QIODevice::WriteOnly | QIODevice::ReadOnly);
     picture.flush();
     QDataStream out(&picture);
     for(int i = 0;i
  • QPixmap에서 캡처한 화면 캡처는 3M에 달하고 TcpSocket을 사용하여 보내는 데 과거 2s가 넘게 걸려서 비교적 정체가 생겼다. 실제 디스플레이는 한 장 한 장의 이미지 업데이트로 바뀌었다. 해결 방법을 고려한다. 1. QuaZip을 사용하여 이미지를 압축하여 전송하고 수신단이 수신한 후에 압축 해제 디스플레이를 하는 것을 고려한다.2. 그림 자체의 크기를 변경하지만 이렇게 하면 그림의 선명도를 뚜렷하게 바꿀 수 있다.3. 다른 네트워크 전송 프로토콜을 사용하여 가능한 한 데이터의 전송 속도를 높인다.또한 Windows 10의 그림판에서는.bmp 형식의 그림이 로 바뀝니다.jpg 형식의 그림은 실제적으로 3M의 크기를 100여 KB 바이트 크기로 바꿀 수 있다. 이렇게 그림 메모리의 크기를 대폭 낮추는 상황에서 선명도에 큰 파괴를 초래하지 않았으니 그 실현 메커니즘을 찾아볼 필요가 있다
  • 디스플레이 인터페이스와 백그라운드 데이터의 수신 간의 충돌로 인해 백그라운드 데이터의 끊임없는 수신은 디스플레이 인터페이스의 단추가 실시간으로 응답하지 못하고 창 자체도 즉시 닫을 수 없다.다중 스레드 사용을 고려하여 해결하다
  • 좋은 웹페이지 즐겨찾기