设为首页 收藏本站
查看: 807|回复: 0

(原创)如何在QT下执行shell或外部程序(QT4)(shell)(mini6410)(smplayer)

[复制链接]

尚未签到

发表于 2015-4-28 10:30:50 | 显示全部楼层 |阅读模式
  摘要:
  通常,我们运行shell程序都是在终端里进行的,而在产品中,不可能叫用户到终端里去敲命令吧;还有,当系统中的某一个计算功能,我在另一程序里已经做好了,想通过GUI程序直接调用它运行。那么,在这些情况下,如何通过GUI上的button来运行shell脚本和linux程序呢。下面将在mini6410上,通过一个范例来介绍如何在QT4 GUI程序里调用shell程序和运行应用程序。
  

通过本范例,可以测试用linux C库的函数来调用shell脚本和应用程序,也可以通过qt的函数来调用shell脚本和应用程序。还介绍了阻塞运行和非阻塞运行。
  介绍:
   范例简介:基于mini6410开发平台,用QT4设计一GUI界面HelloQt4,通过

HelloQt4界面上button->clicked来启动smplayer播放器。
      1、设计gui图形界面,创建一button,并在clicked下添加代码
      DSC0000.jpg
      第一种方法(50行)是调用linux C函数库中的system(const char *string);
     

第二

种方法(51行)和第三种方法

(53 54行)是调QT里的函数;
       需要说明的时,上面三种方法都是可以的,但前两种方法会阻塞进程,直到smplayer程序结束,而第三种方法则不会阻塞进程,可以多任务运行。
       还有,我们知道qt在运行的时候,要启动qws(qt
windows 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里的gq.avi文件
#cd /usr/local/smplayer/bin
#./mplayer /sdcard/gq.avi
#启动友善的smplayer
cd /usr/local/smplayer/bin
./smplayer
  3、修改smplayer文件
  在友善的根文件系统中,/user/local/smplayer/bin目录中的smplayer脚本是有问题的,如果直接运行它,会出现鼠标和触摸屏不能使用的情况,我们要将/bin目录下的qt4脚本复制过来,并将最后三行改为




cd /usr/local/smplayer/
exec ./smplayer #-qws  
#hotplug

  

其中qws注释掉。(前面提到过的,我们要多任务运行,不需要再开一个qws)     
  4、修改rcS文件,使之开机就运行

HelloQt4程序
  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/rc.d/init.d/netd start
echo "                        " > /dev/tty1
echo "Starting networking..." > /dev/tty1
sleep 1
/etc/rc.d/init.d/httpd start
echo "                        " > /dev/tty1
echo "Starting web server..." > /dev/tty1
sleep 1
/etc/rc.d/init.d/leds start
echo "                        " > /dev/tty1
echo "Starting leds service..." > /dev/tty1
echo "                        "
sleep 1
echo "                        " > /dev/tty1
/etc/rc.d/init.d/alsaconf start
echo "Loading sound card config..." > /dev/tty1
echo "                        "
/sbin/ifconfig lo 127.0.0.1
/etc/init.d/ifconfig-eth0
#/bin/qt4 &
#echo "                                  " > /dev/tty1
#echo "Starting Qt4 Applications, please waiting..." > /dev/tty1
#/bin/smplayer &
#echo "                                  " > /dev/tty1
#echo "Starting smplayer Applications, please waiting..." > /dev/tty1
/bin/hello_qt4app &
echo "                                  " > /dev/tty1
echo "Starting hello_qt4  Applications, please waiting..." > /dev/tty1
#运行完hellp_qt4后,再运行smplayer
#sleep 3
#cd /usr/local/smplayer/bin/
#exec ./smplayer
  hello_qt4app脚本如下:
  



#!/bin/sh
if [ -e /etc/friendlyarm-ts-input.conf ] ; then
    . /etc/friendlyarm-ts-input.conf
fi
true    ${TSLIB_TSDEVICE:=/dev/touchscreen}
TSLIB_CONFFILE=/etc/ts.conf
export TSLIB_TSDEVICE
export TSLIB_CONFFILE
export TSLIB_PLUGINDIR=/usr/lib/ts
export TSLIB_CALIBFILE=/etc/pointercal
export QWS_DISPLAY=:1
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
export PATH=/bin:/sbin:/usr/bin/:/usr/sbin:/usr/local/bin
if [ -c /dev/touchscreen ]; then
    export QWS_MOUSE_PROTO="Tslib MouseMan:/dev/input/mice"
    if [ ! -s /etc/pointercal ] ; then
        rm /etc/pointercal
        /usr/bin/ts_calibrate
    fi
else
    export QWS_MOUSE_PROTO="MouseMan:/dev/input/mice"
fi
export QWS_KEYBOARD=TTY:/dev/tty1
export HOME=/root
cd /opt/crt_app/bin
./hello_qt4 -qws
hotplug

  然后,重启开发板,hello_qt4程序运行了,再点button,播放器也弹出来了。

  结语:
   本例程简单实用,介绍了函数的用途,没有对枯燥的代码进行深入的分析;对于入门者来说,这些内容应该会让它很容易就接受并应用起来,如果您是高手,更深入的还请自行分析。
  

参考资料:
  

QT下执行Shell或启动外部程序   http://wenku.baidu.com/view/33467002bed5b9f3f90f1c5b.html
  

QT下实现对Linux Shell调用的几种方法 QProcess AND QThread
http://www.iyunv.com/Linux/2010-08/28172.htm
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-61480-1-1.html 上篇帖子: [Erlang 0050]用fun在Erlang Shell中编写尾递归 下篇帖子: java连接SSH服务器并执行shell命令
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表