zoukankan      html  css  js  c++  java
  • 手机控制PPT good

    以前做了一个小东西,通过手机来控制PPT的翻页,最大化和最小化,东西很简单,近期整理电脑发现了拿来和大家分享一下 
    主要分为两个部分,客户端和服务器 
    客户端实现 
    当初考虑到跨平台的特性就选择了qt来写的,代码很简单,主要是通过socket连接运行在电脑上的server,发送不同的指令完成不同的操作。由于Qt的跨平台性可以将其移植到安卓iOS上,安卓上使用完全没问题,ios也应该是没问题,我不是土豪,没法用苹果手机测试,有兴趣的大家可以试试 
    Control_PPT.pro

    #-------------------------------------------------
    #
    # Project created by QtCreator 2016-06-20T09:20:20
    #
    #-------------------------------------------------
    
    QT       += core gui
    QT += network
    
    greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
    
    TARGET = Control_PPT
    TEMPLATE = app
    
    
    SOURCES += main.cpp
            mainwidget.cpp
    
    HEADERS  += mainwidget.h

    mainwidget.h

    #ifndef MAINWIDGET_H
    #define MAINWIDGET_H
    
    #include <QWidget>
    #include <QtNetwork/QtNetwork>
    #include <QLabel>
    #include <QPushButton>
    #include <QLineEdit>
    #include <QVBoxLayout>
    #include <QHBoxLayout>
    #include <QGridLayout>
    #include <QMessageBox>
    #include <QMouseEvent>
    #include <QStatusBar>
    
    class MainWidget : public QWidget
    {
        Q_OBJECT
    
    public:
        MainWidget(QWidget *parent = 0);
        ~MainWidget();
        void initIpLayout();
        void initControlBtnLayout();
    //    void mouseMoveEvent(QMouseEvent *event);
    private:
        QLabel *ipLbl;
        QLineEdit *ipLineEdit;
        QPushButton *connectBtn;
        /*
        控制按钮  上一页、写一页等
        */
        QPushButton *upBtn;
        QPushButton *downBtn;
        QPushButton *leftBtn;
        QPushButton *rightBtn;
        QPushButton *f5Btn;
        QPushButton *escBtn;
        /*
        布局
        */
        QHBoxLayout *ipHLayout;
        QGridLayout *controlBtnLayout;
        QVBoxLayout *mainVLayout;
    
        QTcpSocket *client;
        QStatusBar *statusBar;
        QLabel *msgLabel;
    
        bool flag;
    
    public slots:
        void conncSlot();
        void upSlot();
        void downSlot();
        void leftSlot();
        void rightSlot();
        void f5Slot();
        void escSlot();
    
        void displayError(QAbstractSocket::SocketError);
    };
    
    #endif // MAINWIDGET_H

    main.widget.cpp

    #include "mainwidget.h"
    
    MainWidget::MainWidget(QWidget *parent)
        : QWidget(parent)
    {
        flag = true;
    
        msgLabel = new QLabel;
        //msgLabel->setMinimumSize(msgLabel->sizeHint());
        msgLabel->setAlignment(Qt::AlignHCenter);
        statusBar = new QStatusBar(this);
        statusBar->setFixedHeight(30);
        statusBar->setFixedWidth(this->width());
        statusBar->addWidget(msgLabel); //头文件要添加include<QStatusBar>才不会报错
    
        initIpLayout();
        initControlBtnLayout();
    
        mainVLayout = new QVBoxLayout;
        mainVLayout->addLayout(ipHLayout);
        mainVLayout->addLayout(controlBtnLayout);
        this->setLayout(mainVLayout);
        connect(connectBtn,SIGNAL(clicked()),this, SLOT(conncSlot()));
        connect(upBtn,SIGNAL(clicked()),this, SLOT(upSlot()));
        connect(downBtn,SIGNAL(clicked()),this, SLOT(downSlot()));
        connect(f5Btn,SIGNAL(clicked()),this, SLOT(f5Slot()));
        connect(leftBtn,SIGNAL(clicked()),this, SLOT(leftSlot()));
        connect(rightBtn,SIGNAL(clicked()),this, SLOT(rightSlot()));
        connect(escBtn,SIGNAL(clicked()),this, SLOT(escSlot()));
    
    
    }
    /*
        设置获取ip连接的布局
    */
    void MainWidget::initIpLayout()
    {
        ipLbl = new QLabel(tr("IP:"));
        ipLineEdit = new QLineEdit();
        ipLineEdit->setPlaceholderText(tr("127.0.0.1"));
        connectBtn = new QPushButton(tr("连接"));
    
        ipHLayout = new QHBoxLayout;
        ipHLayout->addWidget(ipLbl);
        ipHLayout->addWidget(ipLineEdit);
        ipHLayout->addWidget(connectBtn);
    
    //    ipHLayout->setMargin(10);
    }
    
    void MainWidget::initControlBtnLayout()
    {
        upBtn = new QPushButton(tr("上"));
        leftBtn = new QPushButton(tr("左"));
        f5Btn = new QPushButton(tr("f5"));
        rightBtn = new QPushButton(tr("右"));
        downBtn = new QPushButton(tr("下"));
        escBtn = new QPushButton(tr("esc"));
    
        controlBtnLayout = new QGridLayout();
        controlBtnLayout->addWidget(upBtn,0,1);
    
        controlBtnLayout->addWidget(leftBtn, 1, 0);
        controlBtnLayout->addWidget(f5Btn,1,1);
        controlBtnLayout->addWidget(rightBtn, 1, 2);
        controlBtnLayout->addWidget(downBtn, 2, 1);
        controlBtnLayout->addWidget(escBtn, 3, 1);
    }
    
    //void MainWidget::mouseMoveEvent(QMouseEvent *event)
    //{
    
    
    //    int x = event->x();
    //    int y = event->y();
    //    QPoint point = cursor().pos();
    //    int x = point.x();
    //    int y = point.y();
    //    QString xy;
    //    xy.clear();
    //    xy = tr("%1%2%3").arg(x).arg("#").arg(y);
    //    qDebug() << xy;
    //    char* chxy;
    //    QByteArray ba = xy.toLatin1();
    
    //    chxy=ba.data();
    //    if(flag)
    //        client->write(chxy);
    
    //}
    void MainWidget::displayError(QAbstractSocket::SocketError)
    {
        flag = false;
        qDebug() << client->errorString(); //输出错误信息
    }
    
    void MainWidget::conncSlot()
    {
        QString ip = ipLineEdit->text();
    
        QString pattern("^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])[.](\d{1,2}|1\d\d|2[0-4]\d|25[0-5])[.](\d{1,2}|1\d\d|2[0-4]\d|25[0-5])[.](\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$");
        QRegExp rx(pattern);
    
        if(ip.isEmpty())
        {
            QMessageBox::information(this,"请输入IP","请输入服务器的IP地址!");
            return ;
        }
        else if(!(rx.exactMatch(ip)))
        {
            QMessageBox::information(this,"格式错误","请输入正确的IP地址!");
            return ;
        }
        client = new QTcpSocket(this);
        client->connectToHost(QHostAddress(ip), 5588);
        //connect(client, SIGNAL(connected()),this, SLOT(is_connect_ok()));
        connect(client,SIGNAL(error(QAbstractSocket::SocketError)),this,SLOT(displayError(QAbstractSocket::SocketError)));
        if(flag)
        {
            msgLabel->setText(tr("连接成功!"));
            QMessageBox::information(this,tr("连接提示"),tr("恭喜你连接成功"));
            flag = false;
        }
        else
        {
            msgLabel->setText(tr("连接失败!"));
            QMessageBox::information(this,tr("连接提示"),tr("连接失败,请检查ip是否正确"));
        }
    
        ipLineEdit->clear();
    }
    
    
    void MainWidget::escSlot()
    {
        client->write("esc");
        msgLabel->setText(tr("退出全屏显示"));
        //client->write("100#100");
    }
    void MainWidget::upSlot()
    {
        client->write("up");
        msgLabel->setText(tr("上一页!"));
    
    }
    
    void MainWidget::downSlot()
    {
        msgLabel->setText(tr("下一页!"));
    
        client->write("down");
    }
    
    void MainWidget::leftSlot()
    {
        msgLabel->setText(tr("上一页!"));
        client->write("left");
    }
    
    void MainWidget::rightSlot()
    {
        msgLabel->setText(tr("下一页!"));
    
        client->write("right");
    }
    
    void MainWidget::f5Slot()
    {
        msgLabel->setText(tr("全屏显示!"));
    
        client->write("f5");
    }
    
    MainWidget::~MainWidget()
    {
    
    }

    main.cpp

    #include "mainwidget.h"
    #include <QApplication>
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        MainWidget w;
        w.show();
    
        return a.exec();
    }

    服务器端 
    服务器端是Python写的,当然用c++也是可以的,考虑到代码的简洁就选择了python,正好当时刚学了几点的python就用了它,代码写的很烂。服务器的作用主要是调用微软提供的PPT接口完成操作。 
    server.py

    # Echo server program
    
    from socket import*
    from time import ctime
    import win32com.client
    import win32api
    import win32con
    import time
    import pythoncom
    from ctypes import *
    
    class PowerPointControler:
    
        def __init__(self):
            pythoncom.CoInitialize()
            self.app = win32com.client.Dispatch("PowerPoint.Application")
        def fullScreen(self):
            #全屏播放
            if self.hasActivePresentation():
                #使用Run方法创建一个新的幻灯片放映窗口并将其添加到SlideShowWindows集合
                self.app.ActivePresentation.SlideShowSettings.Run()#该方法用于运行指定演示文稿的幻灯片放映。
                return self.getActivePresentationSlideIndex()
        def closeFull(self):#结束第一个幻灯片放映窗口中的幻灯片放映
            if self.app.ActivePresentation.SlideShowSettings.Run():
                self.app.SlideShowWindows(1).View.Exit()
        def gotoSlide(self,index):
            #跳转到指定的页面
            if self.hasActivePresentation():
                    try:
                        self.app.ActiveWindow.View.GotoSlide(index)
                        return self.app.ActiveWindow.View.Slide.SlideIndex
                    except:
                        self.app.SlideShowWindows(1).View.GotoSlide(index)
                        return self.app.SlideShowWindows(1).View.CurrentShowPosition
        def nextPage(self):#下一页ppt
            if self.hasActivePresentation():
                count = self.getActivePresentationSlideCount()
                index = self.getActivePresentationSlideIndex()
                return count if index >= count else self.gotoSlide(index+1)
        def prePage(self):#上一页ppt
            if self.hasActivePresentation():
                index =  self.getActivePresentationSlideIndex()
                return index if index <= 1 else self.gotoSlide(index-1)
        def drawLine(self, x, y):
            index =  self.getActivePresentationSlideIndex()
            windll.user32.SetCursorPos(x, y)
            #参数1位x的起点  第二个参数是y的起点   这两个参数决定了起始的位置
            #参数3是x的终点位置      第四个参数是 y的终点位置
            self.app.SlideShowWindows(index).View.DrawLine(x, y, x + 500, y)
        def getActivePresentationSlideIndex(self):
            #得到活跃状态的PPT当前的页数
            if self.hasActivePresentation():
                try:
                    index = self.app.ActiveWindow.View.Slide.SlideIndex
                except:
                    index = self.app.SlideShowWindows(1).View.CurrentShowPosition
            return index
        def getActivePresentationSlideCount(self):
            #返回处于活跃状态的PPT的页面总数
            return self.app.ActivePresentation.Slides.Count
        def getPresentationCount(self):
            #返回打开的PPT数目
            return self.app.Presentations.Count
        def hasActivePresentation(self):
            #判断是否有打开PPT文件
            return True if self.getPresentationCount() > 0 else False
    if __name__ == '__main__':
    
        HOST = ''                 
        PORT = 5588              
        BUFSIZE = 1024
        ADDR = (HOST, PORT)
    
        tcpSerSock = socket(AF_INET, SOCK_STREAM)
        tcpSerSock.bind(ADDR)
        tcpSerSock.listen(5)
        ppt = PowerPointControler()
    
        while True:
            print('waiting for connection...')
            tcpCliSock, addr = tcpSerSock.accept()
            print('...connected from:', addr)
    
            while True:
                data = tcpCliSock.recv(BUFSIZE).decode()
                print(data)
                if not data:
                    break
                if ppt.hasActivePresentation():
                    if data == "f5":
                        ppt.fullScreen()
                    elif data == "up":
                        ppt.prePage()
                    elif data == "down":
                        ppt.nextPage()
                    elif data == "left":
                        ppt.prePage()
                    elif data == "right":
                        ppt.nextPage()
                    elif data == "esc":
                        ppt.closeFull()
    
                    #else:未完成画线操作,只能话简单的直线
                        #xy = data.split('#')
                        #print(xy[0],xy[1])
                        #ppt.drawLine(int(xy[0]), int(xy[1]))
                        #xy.clear();
                else:
                    tcpCliSock.send("close")
        tcpCliSock.close()
        tcpSerSock.close()

    吾还年轻,写的代码比较烂,希望大家指正。 
    项目下载地址:https://github.com/gqqcode/Mobile-phone-control-ppt

    http://blog.csdn.net/guoqianqian5812/article/details/52627502

  • 相关阅读:
    UVa 10474
    UVa 1339
    UVa 1368
    UVa 1585
    UVa 1586
    ACM中Java高效输入输出封装
    Ajax中Get请求与Post请求的区别
    AJAX——核心XMLHttpRequest对象
    PHP面向对象编程之深入理解方法重载与方法覆盖(多态)
    PHP类方法重写原则
  • 原文地址:https://www.cnblogs.com/findumars/p/6375727.html
Copyright © 2011-2022 走看看