qt|QT中使用QProcess调用adb命令完成远程控制第一天

接到最新任务,使用QT界面集成ADB命令,因为在dos内部输入adb shell以及其他命令太麻烦了,如果能够做成一个可视化工具将会很有帮助。
QT界面制作比较快速并且跨平台,于是选择QT作为开发工具,调用外部命令使用QProcess类。
这一切都很快完成。

QProcess *process = new QProcess(this); process->start("adb devices"); QString str = QString::fromLocal8Bit(process->readAll()); 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,如下(第一种方法):
timer = new QTimer(this); connect(timer,SIGNAL(timeout()),this,SLOT(onSearchFinished())); timer->start(1000); onSearchFinished SLOT: this->repaint(); ui->currentDeviceName->clear(); QString str = QString::fromLocal8Bit(process->readAll()); qDebug()setText(str); ui->currentDeviceName->setStyleSheet("color:red; "); timer->stop();




根据需要自己改装即可,思想就是等待命令运行获得结果后再更新界面,其实QProcess内部有定义finished这种信号,不过这是搜索资料得到的答案,如下(第二种方法):
process->start("adb devices"); 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的大小要调整,或者把读取的信息进行处理!!!


【qt|QT中使用QProcess调用adb命令完成远程控制第一天】

    推荐阅读