Qt for android手机屏幕当鼠标用
由于无线鼠标忘记带回家了,想躺在床上看电视(电视机屏幕当显示器)怎么办呢?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手机屏幕当鼠标用相关推荐
- Vysor 在电脑上控制android手机屏幕 镜像
Vysor 在电脑上控制android手机屏幕 镜像 Vysor是一款Chome浏览器的插件,首先你要去装个Google Chrome,接下来简单装一下Vysor Chrome Extensions插 ...
- android分辨率选择,安卓Android手机屏幕壁纸分辨率选择技巧
大家先看看对应的壁纸分辨率: 屏幕分辨率为 480×320 的Android手机,对应的壁纸分辨率为:640x480. 屏幕分辨率为 800×480 的Android手机,对应的壁纸分辨率为:960x ...
- android壁纸和手机屏幕之间要怎么对应,安卓Android手机屏幕壁纸分辨率选择技巧...
安卓Android手机屏幕壁纸分辨率选择技巧 现在使用安卓手机的人好多了,一个好的手机壁纸自然是大家的追求,那么要怎么挑选适合自己安卓手机的手机壁纸呢~登博教程小编来教你挑选吧~ 大家先看看对应的壁纸 ...
- android手机屏幕总是闪烁,手机屏幕闪烁是什么原因
手机屏幕闪烁会严重影响到我们对手机的使用,那么在遇到这种情况的时候我们应该怎么解决呢?下面是小编精心为你整理的手机屏幕闪烁的原因,一起来看看. 手机屏幕闪烁的原因 其实很多时候是由于静电造成的,我们可 ...
- 修复Android手机屏幕的5种简单方法是黑色的
作为Android用户,您是否遇到过以下情况: Android 设备的通知指示灯持续闪烁,但设备没有响应. 手机屏幕经常冻结. Android手机经常重新启动或崩溃. 安卓手机电池消耗得非常快. 您的 ...
- android 使用asm.jar将android手机屏幕投影到电脑上
使用asm.jar将Android手机屏幕投影到电脑 有时候可能需要将手机上的一些操作投影出来,比如一些App Demo的展示等.其实,有专门的硬件设备能干这件事儿,但没必要专门为展示个Demo去花钱 ...
- Android开发——Android手机屏幕适配方案总结
0. 前言 Android的屏幕适配,即使得某一元素在Android不同尺寸.不同分辨率的手机上具备相同的显示效果,这个问题一直以来都是我们Android开发者不得不面对的问题.本文参考了很多前人的博 ...
- Android手机屏幕RTMP推流工具
Android手机屏幕RTMP推流工具是基于ffmpeg+opencv开发的C++(eclipse.androidstudio)程序,是一款可以将安卓手机屏幕上的任何内容推送到任意一款rtmp服务器上 ...
- Android 手机屏幕那些事儿
最近公司的 Android 设备准备进行硬件升级,谈及屏幕时,大家对于相关的一些知识点具有不同的认知.因此我搜集了互联网上关于 Android 手机屏幕的相关资料,总结.记录.分享于此. 分辨率 屏幕 ...
最新文章
- mongo创建用户和创建数据库
- python:浅析python 中__name__ = '__main__' 的作用(转载)
- java地址传递_关于java中是地址传递还是值传递的测试
- linux arm mmu基础【转】
- 微课--Python使用tkinter和SQLite编写通信录管理程序(21分钟)
- Python多进程使用队列共享数据协同判断素数
- FairMOT: On the Fairness of Detection and Re-Identification in Multiple Object Tracking 效果展示
- 自定义Toast的出现样式
- VMRC 控制台的连接已断开
- 黄色量能通达信指标公式!没有未来函数,不加密的副图指标!
- matlab推挽用的变压器,推挽逆变+全桥整流~~~~逆变器变压器设计
- 新手学编程,是学c还是java呢?
- 计算机技术三大领域,量化投资策略的运用
- 服务器系统2008R2安全模式,server 2008 r2怎么进入安全模式
- 彩色图片在OpenCV里的表示方式
- Redis五大数据类型常用命令与使用场景总结
- 用 Python 绘制 XMind 思维导图
- 微信小程序014租房-房屋租赁合同系统
- iOS和安卓共用同一个二维码实现跳转下载链接
- Windows8内核模式下开发NDIS应用 NDIS Filter讲解