当前位置:   article > 正文

QT中使用QProcess调用adb命令完成远程控制第一天_adbclient qt site:csdn.net

adbclient qt site:csdn.net

接到最新任务,使用QT界面集成ADB命令,因为在dos内部输入adb shell以及其他命令太麻烦了,如果能够做成一个可视化工具将会很有帮助。

QT界面制作比较快速并且跨平台,于是选择QT作为开发工具,调用外部命令使用QProcess类。

这一切都很快完成。

  1. QProcess *process = new QProcess(this);
  2. process->start("adb devices");
  3. QString str = QString::fromLocal8Bit(process->readAll());
  4. ui->currentDeviceName->setText(str);


但是界面中的文字并没有显示,查阅资料,有的资料说start是异步,execute是同步,异步的时候要设置信号槽,在设置以后还是没有任何显示,在调用execute这种同步方法后,也没有结果显示。

经过一个多小时的思考,找到了原因(个人观点),我的adb虽然设置了环境变量但是在E盘下面,我在调用adb命令的时候也没有指定adb的路径,虽然从dos的cmd中调用adb devices没有问题,但是在QProcess中还是要指明路径,除非你的adb就在你当前的工程目录下。

解决方案:把adb.exe复制到C:\Windows\SysWOW64下面(64位操作系统),然后就可以了。

因为运行的时候需要1-2秒的时间,所以需要设置定时器QTimer,如下(第一种方法):

  1. timer = new QTimer(this);
  2. connect(timer,SIGNAL(timeout()),this,SLOT(onSearchFinished()));
  3. timer->start(1000);
  4. onSearchFinished SLOT:
  5. this->repaint();
  6. ui->currentDeviceName->clear();
  7. QString str = QString::fromLocal8Bit(process->readAll());
  8. qDebug()<<str;
  9. ui->currentDeviceName->setText(str);
  10. ui->currentDeviceName->setStyleSheet("color:red;");
  11. timer->stop();



根据需要自己改装即可,思想就是等待命令运行获得结果后再更新界面,其实QProcess内部有定义finished这种信号,不过这是搜索资料得到的答案,如下(第二种方法):

  1. process->start("adb devices");
  2. connect(process,SIGNAL(finished(int,QProcess::ExitStatus)),this,SLOT(onSearchFinished(int,QProcess::ExitStatus)));

这里的onSearchFinished SLOT与上面基本一致,只是参数不同。


PS:细节很重要,我显示adb devices结果使用的是一个label,这个label很小,而process->readAll()获取的信息第一个字符就是换行符,这样一来,label中没有任何内容显示,如果不是我前面打印了str还以为命令有误!!!所以label的大小要调整,或者把读取的信息进行处理!!!


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/184727?site
推荐阅读
相关标签
  

闽ICP备14008679号