由于无线鼠标忘记带回家了,想躺在床上看电视(电视机屏幕当显示器)怎么办呢?HOHO,我们的手机屏幕本来就是个触摸板,嘿嘿,那就用手机屏幕当鼠标好了。
大致的思路就是电脑和手机用Tcp通信,毕竟是都连着路由器的。主要用到的模块就是QTcpServer,QTcpSocket.

#include <QObject>
#include  <QSystemTrayIcon>
class Widget;
class QTcpServer;
class QTcpSocket;class controller : public QObject
{Q_OBJECT
public:explicit controller(QObject *parent = 0);typedef enum{mouseMove,mouseSingleClick,mouseDoubleClick,mouseRightClick} mouseAction;~controller();private:QTcpServer* tcpserver;QTcpSocket* clientSocket;quint16 blockSize;Widget* widget;QSystemTrayIcon* sysIcon;private:void TranslateMessage();public slots:void onConnected();void onReadyRead();void onDisConnected();void onSysIconActRe(QSystemTrayIcon::ActivationReason reason);
#include "controller.h"
#include <QTcpSocket>
#include <QTcpServer>
#include <QDataStream>
#include <windows.h>
#include "widget.h"
#include <QHostAddress>controller::controller(QObject *parent) : QObject(parent)
{tcpserver = new QTcpServer(this);widget = new Widget;widget->show();sysIcon = new QSystemTrayIcon(this);sysIcon->setIcon(QIcon(":/computer_16px.ico"));sysIcon->hide();sysIcon->setToolTip("工作中");//    installEventFilter(sysIcon);tcpserver->listen(QHostAddress::Any,15333);  //监听15333端口blockSize = 0;connect(tcpserver,SIGNAL(newConnection()),SLOT(onConnected()));connect(widget,SIGNAL(sg_hide()),sysIcon,SLOT(show()));connect(sysIcon,SIGNAL(activated(QSystemTrayIcon::ActivationReason)),SLOT(onSysIconActRe(QSystemTrayIcon::ActivationReason)));}
void controller::onReadyRead()
{QDataStream in(clientSocket);in.setVersion(QDataStream::Qt_5_8);while(clientSocket->bytesAvailable()>=sizeof(quint16)){if(blockSize==0) in>>blockSize;if(clientSocket->bytesAvailable()<blockSize) break;TranslateMessage();//  widget->appendLog("收到消息");blockSize=0;}
}void controller::TranslateMessage()
{QDataStream in(clientSocket);in.setVersion(QDataStream::Qt_5_8);qint16 actionType;in>>actionType;
//  DWORD dx,dy;int px,py;switch(actionType){case mouseMove:in>>px>>py;
//      dx = px*GetSystemMetrics(SM_CXSCREEN);
//      dy = py*GetSystemMetrics(SM_CYSCREEN);mouse_event(MOUSEEVENTF_MOVE,px,py,0,0);
//      qDebug()<<dx<<dy;break;case mouseSingleClick:mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);break;case mouseDoubleClick:mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);break;case mouseRightClick:mouse_event(MOUSEEVENTF_RIGHTDOWN,0,0,0,0);mouse_event(MOUSEEVENTF_RIGHTUP,0,0,0,0);break;}
}
void controller::onConnected()
{clientSocket = tcpserver->nextPendingConnection();connect(clientSocket,SIGNAL(readyRead()),SLOT(onReadyRead()));connect(clientSocket,SIGNAL(disconnected()),SLOT(onDisConnected()));widget->appendLog("建立连接!");widget->appendLog("客户IP:"+clientSocket->peerAddress().toString());widget->appendLog("客户名:"+clientSocket->peerName());}
void controller::onDisConnected()
{widget->appendLog("断开连接!");clientSocket->deleteLater();
}controller::~controller()
{widget->deleteLater();
}void controller::onSysIconActRe(QSystemTrayIcon::ActivationReason reason)
{if(reason == QSystemTrayIcon::DoubleClick){widget->show();sysIcon->hide();}
}

这是PC端的主要代码 , 界面用的是之前写的模板。
下面是安卓端的,就更简单了,主要就是一个触摸区域和鼠标左右键。

#include <QDialog>
class QTcpSocket;
class QTimer;namespace Ui {
class Dialog;
}class Dialog : public QDialog
{Q_OBJECTpublic:explicit Dialog(QWidget *parent = 0);~Dialog();enum{mouseMove,mouseSingleClick,mouseDoubleClick,mouseRightClick};
private:Ui::Dialog *ui;QTcpSocket* tcpSocket;QPoint  move_pre_position;QTimer* clickTimer;public slots:void onBtn_connectClicked();void onBtn_disconnectClicked();void onClick_TimerRunout();void onConnected();void onDisconnected();void onBtn_LeftClicked();void onBtn_RightClicked();protected:void mouseMoveEvent(QMouseEvent*);void mousePressEvent(QMouseEvent*);};
#include "dialog.h"
#include "ui_dialog.h"
#include <QTcpSocket>
#include <QHostAddress>
#include <QMouseEvent>
#include <QDataStream>
#include <QTimer>Dialog::Dialog(QWidget *parent) :QDialog(parent),ui(new Ui::Dialog)
{ui->setupUi(this);showFullScreen();tcpSocket = new QTcpSocket(this);tcpSocket->bind(ui->lineEdit_port->text().toInt());connect(ui->btn_connect,SIGNAL(clicked(bool)),SLOT(onBtn_connectClicked()));clickTimer = new QTimer(this);clickTimer->setInterval(100);clickTimer->setSingleShot(true);connect(clickTimer,SIGNAL(timeout()),SLOT(onClick_TimerRunout()));connect(tcpSocket,SIGNAL(connected()),SLOT(onConnected()));connect(tcpSocket,SIGNAL(disconnected()),SLOT(onDisconnected()));connect(ui->btn_disconnect,SIGNAL(clicked(bool)),SLOT(onBtn_disconnectClicked()));connect(ui->Btn_Left,SIGNAL(clicked(bool)),SLOT(onBtn_LeftClicked()));connect(ui->Btn_Right,SIGNAL(clicked(bool)),SLOT(onBtn_RightClicked()));}Dialog::~Dialog()
{delete ui;
}void Dialog::onBtn_connectClicked()
{tcpSocket->connectToHost(QHostAddress(ui->lineEdit_ip->text()),ui->lineEdit_port->text().toInt());}
void Dialog::onBtn_disconnectClicked()
{tcpSocket->disconnectFromHost();
}void Dialog::mouseMoveEvent(QMouseEvent* event)
{if(tcpSocket->state() == QAbstractSocket::ConnectedState){QPoint movePos = event->pos() - move_pre_position;int move_x,move_y;move_x = movePos.x();move_y = movePos.y();QByteArray  data;QDataStream out(&data,QIODevice::WriteOnly);out.setVersion(QDataStream::Qt_5_8);out<<quint16(0)<<(qint16)mouseMove<<move_x<<move_y;out.device()->seek(0);out<<(quint16)(data.size()-sizeof(quint16));tcpSocket->write(data);move_pre_position = event->pos();
//        ui->textBrowser->append(QVariant(move_x).toString()+QVariant(move_y).toString());}}
void Dialog::mousePressEvent(QMouseEvent *event)
{move_pre_position = event->pos();  //记录当前位置}void Dialog::onClick_TimerRunout()
{QByteArray  data;QDataStream out(&data,QIODevice::WriteOnly);out.setVersion(QDataStream::Qt_5_8);out<<quint16(0)<<(qint16)mouseSingleClick;out.device()->seek(0);out<<(quint16)(data.size()-sizeof(quint16));tcpSocket->write(data);
}void Dialog::onConnected()
{ui->textBrowser->append("连接电脑成功!");ui->textBrowser->append("电脑名:"+tcpSocket->peerName());}void Dialog::onDisconnected()
{ui->textBrowser->append("已断开连接");
}
void Dialog::onBtn_LeftClicked()
{if(tcpSocket->state() == QAbstractSocket::ConnectedState){QByteArray  data;QDataStream out(&data,QIODevice::WriteOnly);out.setVersion(QDataStream::Qt_5_8);if(clickTimer->isActive()){out<<quint16(0)<<(qint16)mouseDoubleClick;clickTimer->stop();out.device()->seek(0);out<<(quint16)(data.size()-sizeof(quint16));tcpSocket->write(data);}else{clickTimer->start();    //双击单击判断}}
}
void Dialog::onBtn_RightClicked()
{if(tcpSocket->state() == QAbstractSocket::ConnectedState){QByteArray  data;QDataStream out(&data,QIODevice::WriteOnly);out.setVersion(QDataStream::Qt_5_8);out<<quint16(0)<<(qint16)mouseRightClick;clickTimer->stop();out.device()->seek(0);out<<(quint16)(data.size()-sizeof(quint16));tcpSocket->write(data);}
}

由于之前写过一个仿QQ的聊天程序(也就基本的聊天功能啦),这次几乎没碰到问题。主要会发生的问题就是TcpSocket的读写,可以参考上面的onReadyRead函数。(因为Tcp可能一下接到几条消息,会粘连所以要注意)。还有就是我不知道Qt有没有自带的函数可以实现任意区域的鼠标事件,我用的是windows的函数, mouse_event.
下面贴下运行效果啦:

Qt for android手机屏幕当鼠标用相关推荐

  1. Vysor 在电脑上控制android手机屏幕 镜像

    Vysor 在电脑上控制android手机屏幕 镜像 Vysor是一款Chome浏览器的插件,首先你要去装个Google Chrome,接下来简单装一下Vysor Chrome Extensions插 ...

  2. android分辨率选择,安卓Android手机屏幕壁纸分辨率选择技巧

    大家先看看对应的壁纸分辨率: 屏幕分辨率为 480×320 的Android手机,对应的壁纸分辨率为:640x480. 屏幕分辨率为 800×480 的Android手机,对应的壁纸分辨率为:960x ...

  3. android壁纸和手机屏幕之间要怎么对应,安卓Android手机屏幕壁纸分辨率选择技巧...

    安卓Android手机屏幕壁纸分辨率选择技巧 现在使用安卓手机的人好多了,一个好的手机壁纸自然是大家的追求,那么要怎么挑选适合自己安卓手机的手机壁纸呢~登博教程小编来教你挑选吧~ 大家先看看对应的壁纸 ...

  4. android手机屏幕总是闪烁,手机屏幕闪烁是什么原因

    手机屏幕闪烁会严重影响到我们对手机的使用,那么在遇到这种情况的时候我们应该怎么解决呢?下面是小编精心为你整理的手机屏幕闪烁的原因,一起来看看. 手机屏幕闪烁的原因 其实很多时候是由于静电造成的,我们可 ...

  5. 修复Android手机屏幕的5种简单方法是黑色的

    作为Android用户,您是否遇到过以下情况: Android 设备的通知指示灯持续闪烁,但设备没有响应. 手机屏幕经常冻结. Android手机经常重新启动或崩溃. 安卓手机电池消耗得非常快. 您的 ...

  6. android 使用asm.jar将android手机屏幕投影到电脑上

    使用asm.jar将Android手机屏幕投影到电脑 有时候可能需要将手机上的一些操作投影出来,比如一些App Demo的展示等.其实,有专门的硬件设备能干这件事儿,但没必要专门为展示个Demo去花钱 ...

  7. Android开发——Android手机屏幕适配方案总结

    0. 前言 Android的屏幕适配,即使得某一元素在Android不同尺寸.不同分辨率的手机上具备相同的显示效果,这个问题一直以来都是我们Android开发者不得不面对的问题.本文参考了很多前人的博 ...

  8. Android手机屏幕RTMP推流工具

    Android手机屏幕RTMP推流工具是基于ffmpeg+opencv开发的C++(eclipse.androidstudio)程序,是一款可以将安卓手机屏幕上的任何内容推送到任意一款rtmp服务器上 ...

  9. Android 手机屏幕那些事儿

    最近公司的 Android 设备准备进行硬件升级,谈及屏幕时,大家对于相关的一些知识点具有不同的认知.因此我搜集了互联网上关于 Android 手机屏幕的相关资料,总结.记录.分享于此. 分辨率 屏幕 ...

最新文章

  1. mongo创建用户和创建数据库
  2. python:浅析python 中__name__ = '__main__' 的作用(转载)
  3. java地址传递_关于java中是地址传递还是值传递的测试
  4. linux arm mmu基础【转】
  5. 微课--Python使用tkinter和SQLite编写通信录管理程序(21分钟)
  6. Python多进程使用队列共享数据协同判断素数
  7. FairMOT: On the Fairness of Detection and Re-Identification in Multiple Object Tracking 效果展示
  8. 自定义Toast的出现样式
  9. VMRC 控制台的连接已断开
  10. 黄色量能通达信指标公式!没有未来函数,不加密的副图指标!
  11. matlab推挽用的变压器,推挽逆变+全桥整流~~~~逆变器变压器设计
  12. 新手学编程,是学c还是java呢?
  13. 计算机技术三大领域,量化投资策略的运用
  14. 服务器系统2008R2安全模式,server 2008 r2怎么进入安全模式
  15. 彩色图片在OpenCV里的表示方式
  16. Redis五大数据类型常用命令与使用场景总结
  17. 用 Python 绘制 XMind 思维导图
  18. 微信小程序014租房-房屋租赁合同系统
  19. iOS和安卓共用同一个二维码实现跳转下载链接
  20. Windows8内核模式下开发NDIS应用 NDIS Filter讲解

热门文章

  1. 上海iOS开发工资待遇如何?
  2. mysql 返回 pair_【原创】MySQL Proxy中socketpair的使用
  3. 数组Array的join方法使用
  4. dubbo和zookeeper的实现原理
  5. Tablayout标题四个字以上换行问题
  6. 大数据产品开发流程规范_大数据类项目的项目管理流程是怎样的?
  7. 三年Linux运维工作总结教训
  8. python字典查询_python查询字典
  9. 【硬核】教你如何正确配置ipv6
  10. asp.net课程在线考试平台