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命令完成远程控制第一天】
推荐阅读
- 热闹中的孤独
- Shell-Bash变量与运算符
- JS中的各种宽高度定义及其应用
- 2021-02-17|2021-02-17 小儿按摩膻中穴-舒缓咳嗽
- 深入理解Go之generate
- 由浅入深理解AOP
- 异地恋中,逐渐适应一个人到底意味着什么()
- 【译】20个更有效地使用谷歌搜索的技巧
- 我眼中的佛系经纪人
- 《魔法科高中的劣等生》第26卷(Invasion篇)发售