赞
踩
接到最新任务,使用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的大小要调整,或者把读取的信息进行处理!!!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。