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()<<str;
ui->currentDeviceName->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的大小要调整,或者把读取的信息进行处理!!!


猜你喜欢

转载自blog.csdn.net/u014525494/article/details/80512340
今日推荐