如何在QT下执行shell或外部程序

如何在QT下执行shell或外部程序,第1张

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里的gq.avi文件

#cd /usr/local/smplayer/bin

#./mplayer /sdcard/gq.avi

#启动友善的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/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

hello_qt4app脚本如下:

#!/bin/sh

rm /root/.config/

-rf

rm /root/.mplayer/

-rf

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:${TSLIB_TSDEVICE}

MouseMan:/dev/input/mice"

if [

-e

/etc/pointercal -a !

-s

/etc/pointercal ] then

rm

/etc/pointercal

fi

else

export

QWS_MOUSE_PROTO="MouseMan:/dev/input/mice"

>/etc/pointercal

fi

export QWS_KEYBOARD=TTY:/dev/tty1

export HOME=/root

cd /opt

./hello_qt4

-qws

1>/dev/null

2>/dev/null

hotplug

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

应用程序正常初始化错误

1. VC2003、VC2005、VC2008及其后续版本,对底层最基本的CRT、MFC、ATL库都进行了重构,为了避免不同版本的库引起冲突,重构后的库文件一般放在 C:\\windows\WinSxS 文件夹中,并用特定的文件夹\文件名称进行标识;

2. 与VC6不同, VC2003、VC2005、VC2008及其后续版本,引入了manifest清单的概念,即应用程亮袭序编译后会同时生成对应的.manifest文件,并将该.manifest文件作为资源编译到dll或者exe中去。.manifest文件实际上是一个XML格式的文本文件,里面记录了dll或exe中要引用的渣裤CRT、MFC、ATL库的版本和名称。VC6编译的应用程序对CRT、MFC、ATL的dll都是直接调用,而VC2003、VC2005、VC2008编译的程序都是先查询编译到资源中的manifest中的记录,然后按照记录提供的版本和名称去搜寻对应的CRT、MFC、ATL库以及随库发布的.manifest文件,搜寻的路径包括当前目录、C:\\windows\WinSxS 等等,如果没有找到对应的库文件,则提示“应用程序正常初始化失败”;

3.因此解决这个问题的办法就是:(a)用文本编辑器打开exe或dll对应的.manifest文件,查看它引用的CRT、MFC、ATL库的版本;或者,用UltraEdit直接打开exe或者dll,从资源区中找到编译进去的.manifest信息,找到它引用的CRT、MFC、ATL库的版本;或者,运行程序,当程序d出“应用程序正常初始化失败”对话框时,在桌面上右键点击“我的电脑”-“管理”-“事件查看器”-“系统”,双击查看其中的记录,可以看到出错的原因是因为缺少了某某版本的CRT、MFC、ATL库,记录下这个版本信息;(b)记录到的库的版本信息一般类似于“Microsoft.VC90.DebugCRT”,之后到C:\\windows\WinSxS 或者VC200X的安装文件夹中搜索包含这个字符串的文件夹和文件,将搜索到的dll和.manifest文件都拷贝到应用程序所在的文件夹中,其中,.manifest文件必须重命名为“Microsoft.VC90.DebugCRT.manifest”(这里以Microsoft.VC90.DebugCRT为例),这样应用程序如键简就可以正常运行了;(c)注意:库的.manifest文件和dll要一同拷贝到应用程序根目录去,因为应用程序会将编译到内部的manifest信息与外部的.manifest文件进行对比,之后才会对库的dll进行调用。如果只拷贝库的dll文件是没有用的;

4.如果本机编译和运行程序都ok,但是将编译好的程序拿到其它机器上确无法运行,则多半也是这个原因。另外,如果提示"应用程序配置不正确",大多也是因为上面所说的CRT、MFC、ATL库版本与应用程序不匹配导致的,可以如法炮制进行解决;

qt其实就类似windows下的氏备vc,开发一般有两种方式:1、代码实现控件的排列,2、使用creater拖拽实现(对于初学者建议使用这个),只要先歼凳毁拖拽实现界面,然后再添加逻辑代码,具体网上材料很多

如果要粗镇在开发板上运行,需要在你电脑ubuntu测试通过的基础上,使用编译你的开发板内核一样版本的编译器编译qt程序,当然,你的开发板上也要有qt的库;或者如果你是使用静态编译那就不需要了。然后使用ftp下载到开发板上运行就可以了。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8273738.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-14
下一篇 2023-04-14

发表评论

登录后才能评论

评论列表(0条)

保存