本文介绍,在Linux环境下,使用Qt中的 QProcess 类执行shell命令并获取输出。
头文件: #include <QProcess>
一、函数接口
QProcess 类提供了三个函数
二、执行命令
这里主要介绍 execute() 和 start() :
execute() 会将命令输出直接打印到控制台,调用程序无法捕获。
调用程序可通过 readAllStandardOutput() 捕获shell命令的输出
三、管 道
对于shell命令中的 | ,直接传入参数是不行的。
以上的方式是无法执行的。
可以将整个命令作为 sh 的参数传入 或 使用 QProcess::setStandardOutputProcess(QProcess destination) 即将一个进程的标准输出流传入目标进程的标准输入流
对于需要sudo权限的命令,需要使用sudo权限打开qtcreator,或者直接在命令前加上sudo(不建议)。
当然, QProcess 不仅仅可以执行shell命令,也可以用于执行调用外部程序。
1、设计gui图形界面,创建一button,并在clicked下添加代码
第一种方法(50行)是调用linux C函数库中的system(const char string);
第二种方法(51行)和第三种方法(53 54行)是调QT里的函数;
需要说明的时,上面三种方法都是可以的,但前两种方法会阻塞进程,直到smplayer程序结束,而第三种方法则不会阻塞进程,可以多任务运行。
还有,我们知道qt在运行的时候,要启动qws(qtwindows server),如果用前面两种方法,则smplayer运行的时候,要新开启一个qws,否则不能运行;而用第三种方法,则不需要再开启qws,它和HelloQt4共用一个qws,这样,在一个窗口里可以看到这两个程序。
2、新建运行脚本,用来启动smplayer播放器
在上一步中,qt程序执行了
/opt/run_smplayer脚本,但这个脚本是不存在的,我们要新建它,打开开发板的/opt目录,新建一个run_smplayer文件,添加如下内容
#!/bin/sh
#测试用
#cd /opt/
#rm qt_create/
-rf
#sleep 3
#mkdir qt_create
#cd qt_create
#mkdir qt_create1
#cd qt_create1
#mkdir qt_create2
#cd qt_create2
#mkdir ok
#直接调用mplayer播放sdcard里的gqavi文件
#cd /usr/local/smplayer/bin
#/mplayer /sdcard/gqavi
#启动友善的smplayer
cd /usr/local/smplayer/bin
/smplayer
3、修改smplayer文件
在友善的根文件系统中,/user/lical/smplayer/bin目录中的smplayer脚本是有问题的,如果直接运行它,会出现鼠标和触摸屏
不能使用的情况,我们要将/bin目录下的smplayer脚本复制过来,并将最后两行中的qws去掉。(前面提到过的,我们要多任务运行,不需要再开一
个qws)
export HOME=/root
cd /usr/local/smplayer/
exe__c /smplayer #-qws 1>/dev/null
2>/dev/null
// 此处有屏蔽字,真实没有下划线
#hotplug
4、修改rcS文件,使之开机就运行HelloQt4i程序
rcS文件如下:
#!
/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:
runlevel=S
prevlevel=N
umask 022
export PATH runlevel prevlevel
#
# Trap CTRL-C &c
only in
this shell so we
can interrupt subprocesses
#
trap ":" INT QUIT TSTP
/bin/hostname Crt
[ -e /proc/1 ]
||
/bin/mount -n -t proc none
/proc
[ -e /sys/class ] ||
/bin/mount -n -t sysfs none /sys
[ -e /dev/tty ]
||
/bin/mount
-t ramfs
none /dev
/bin/mount -n -t usbfs none
/proc/bus/usb
echo /sbin/mdev >
/proc/sys/kernel/hotplug
/sbin/mdev -s
/bin/hotplug
# mounting file system specified in
/etc/fstab
mkdir -p /dev/pts
mkdir -p /dev/shm
/bin/mount -n -t devpts none
/dev/pts -o mode=0622
/bin/mount -n -t tmpfs tmpfs /dev/shm
/bin/mount
-n
-t ramfs
none /tmp
/bin/mount -n -t ramfs none
/var
mkdir -p /var/empty
mkdir -p /var/log
mkdir -p /var/lock
mkdir -p /var/run
mkdir -p /var/tmp
/sbin/hwclock -s
syslogd
/etc/rcd/initd/netd start
echo "
"
>
/dev/tty1
echo "Starting networking"
>
/dev/tty1
sleep 1
/etc/rcd/initd/>
你试试作为一个资源来运行看行不行,或者将exe作为一个资源,然后运行时以二进制的形式读取,再将读取到的二进制信息写入到临时文件中,运行临时文件。或者直接将资源中得exe保存到系统临时文件夹中进行运行。
只是个思路,没试过,你试试
#include<Qprocess>
void MainWindow2::program() //打开外部程序
{
this->hide(); //隐藏当前界面
QProcess::execute("……\\xxexe"); //外部程序所在路径
}
以上就是关于Qt QProcess全部的内容,包括:Qt QProcess、如何在QT下执行shell或外部程序、qt调用外部exe程序并且将exe程序一起打包等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)