【工控機開發】如何在QT下執行shell或外部程式
通常,我們執行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下新增程式碼
第一種方法(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
#sleep3
#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
#./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 #-qws1>/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
umask022
export PATH runlevel prevlevel
#
# Trap CTRL-C&c onlyin
thisshell 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 specifiedin
/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
sleep1
/etc/rc.d/init.d/httpd start
echo"
"
>
/dev/tty1
echo"Starting web server..."
>
/dev/tty1
sleep1
/etc/rc.d/init.d/leds start
echo"
"
>
/dev/tty1
echo"Starting leds service..."
>
/dev/tty1
echo"
"
sleep1
echo"
"
>
/dev/tty1
/etc/rc.d/init.d/alsaconf start
echo"Loading sound card config..."
>
/dev/tty1
echo"
"
/sbin/ifconfig lo127.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
相關推薦
【工控機開發】如何在QT下執行shell或外部程式
摘要: 通常,我們執行shell程式都是在終端裡進行的,而在產品中,不可能叫使用者到終端裡去敲命令吧;還有,當系統中的某一個計算功能,我在另一程式裡已經做好了,想通過GUI程式直接呼叫它執行。那麼,在這些情況下,如何通過GUI上的button來執行shell指令碼和linu
【Linux開發】Linux下jpeglib庫的安裝詳解
echo "please add following lines in you /etc/profile" echo "(" echo " tip:" echo " you can add these lines in a file named /etc/profile.jpeg," echo
【Python開發】Pycharm下的Anaconda配置
我的系統是Win 64位的,用的Python 3.5.1 ,最近在學機器學習,用到了Numpy這個科學計算庫,網上查了之後,看到很多裝Numpy出問題的情況,所以決定裝Anaconda,簡單一些,並且裡面包含了Numpy在內的眾多第三方庫。 首先你電腦得裝了Pychar
【VS開發】組播(多播)的C程式實戰
每個人都有不同的認知規律和習慣, 有的人喜歡搞一套嚴密的大理論, 論述起來滔滔不絕, 不管自己懂不懂, 反正讀者/聽者是沒搞懂。 有的人喜歡從實踐出發, 沒看到程式碼, 不執行一下, 不看到結果, 就不太舒服。 我感覺, 我偏向後者, 必須有一個結果作用於我, 我才有感觸
【DSP開發】TMS320C66x DSP SPI Nor Flash的程式燒寫
經過一段時間的研究終於把TMS320C6657單核和雙核的SPI Nor Flash的程式燒寫調通了。工具都是前輩的工作,有需要的可以留下郵箱,我有空可以發。 原理參考錢豐的《TI c66x 系列DSP 多核BOOT 的研究》論文。 通過Nor flash 燒寫載入程
【解決方案】vue不是內部或外部命令
第一步 輸入兩行命令(注意這兩個命令的先後順序) npm install webpack -g npm install vue-cli -g 點選上面的藍色文字,就可以實現安裝。 第二步 如果進行完上面那些操作之後,你發現,在命令列下
【golang-GUI開發】qt之signal和slot(一)
類型 取消 htm return 所在 turn hang nbsp type 想了很久,我決定還是先從signal和slot(信號槽)開始講起。 signal和slot大家一定不陌生,先看一段示例(選自文檔): 1 class Counter : public QOb
【Android開發】:在任意目錄執行NDK編譯
本文以簡單的例子講述如何在任意目錄把自己寫的C程式碼使用NDK提供的交叉編譯該工具來編譯成Android可使用的靜態庫/動態庫。 1. 準備環境 首先,你得安裝了Android的NDK編譯工具,假設你的NDK的根目錄在 /opt/android/ndk . 當然
【Qt:語法】Qt 的執行緒與事件迴圈
週末天冷,索性把電腦抱到床上上網,這幾天看了 dbzhang800 部落格關於 Qt 事件迴圈的幾篇 Blog,發現自己對 Qt 的事件迴圈有不少誤解。從來只看到現象,這次借 dbzhang800 的部落格,就程式碼論事,因此瞭解到一些 Qt 深層的實現,
【Qt開發】QT中顯示影象資料
一般影象資料都是以RGBRGBRGB……位元組流的方式(解碼完成後的原始影象流),我說成位元組流,那就表明R,G,B的值各佔一個位元組,在程式設計時表示的就是unsigned char * data。 我們先來看一下QT中的QImage物件。在載入data資料
【Qt】Qt的執行緒(兩種QThread類的詳細使用方式)
Qt提供QThread類以進行多工處理。與多工處理一樣,Qt提供的執行緒可以做到單個執行緒做不到的事情。例如,網路應用程式中,可以使用執行緒處理多種聯結器。 QThread繼承自QObject類,且提供QMutex類以實現同步。執行緒和程序共享全域性變數,可以使用互斥體對改變後的全域性變數值
【Qt開發】Qt中顯示影象的兩種方法對比
在Qt中處理圖片一般都要用到QImage類,但是QImage的物件不能夠直接顯示出來,要想能看到圖片,初步發現有兩種方法。 一、QImage轉QPixmap,然後用QLabel::setPixmap() image=new QImage("D:/Temp/XX.jpg
【VS開發】MFC執行時庫與debug、release版本之間的配置關係
參考內容: 前段時間從網上下來一個有意思的程式碼,用VS2010開啟時需要將工程轉換為2010的工程,轉化後卻出現了編譯不通過的問題,類似這樣的錯誤:c:\program files\microsoft visual studio 10.0\vc\atlmfc\inc
【Ogre開發】之一:Ogre sdk的安裝以及示例程式碼的編譯和執行
Ogre sdk的安裝以及示例程式碼的編譯和執行 本章由cowboylym(酒劍仙採葡萄)編寫,轉載請註明出處。 作者:酒劍仙採葡萄 郵箱: [email protected] Ogre是什麼? 首先看下Ogre的全稱(Object-orient
【VS開發】程序執行緒及堆疊關係的總結
二、堆和棧的理論知識 2.1申請方式 stack: 由系統自動分配。例如,宣告在函式中一個區域性變數 int b; 系統自動在棧中為b開闢空間 heap: 需要程式設計師自己申請,並指明大小,在c中malloc函式 如p1 = (char *)malloc(10); 在C++中用new運算子 如p2 = (c
【ARM-Linux開發】【CUDA開發】【視訊開發】關於Linux下利用GPU對視訊進行硬體加速轉碼的方案
最近一直在研究Linux下利用GPU進行硬體加速轉碼的方案,折騰了很久,至今沒有找到比較理想的硬加速轉碼方案。似乎網上討論這一方案的文章也特別少,這個過程中也進行了各種嘗試,遇到很多具體問題,以下便對之前所作的一些工作做一些總結和分享,省的時間長了自己也忘記了,也希望後來
【樹莓派開發】 Qt Creator中,include路徑包含過程(或如何找到對應的標頭檔案)
在使用QUdpSocket類時,包含標頭檔案include<QUdpSocket>出現找不到檔案或目錄 解決辦法:1)新增 QT += network 2)在.pro檔案中直接新增標頭檔案的絕對路徑
【C/C++開發】【VS開發】win32位與x64位下各型別長度對比
64 位的優點:64 位的應用程式可以直接訪問 4EB 的記憶體和檔案大小最大達到4 EB(2 的 63 次冪);可以訪問大型資料庫。本文介紹的是64位下C語言開發程式注意事項。 1. 32 位和 64 位C資料型別 32和64位C語言內建資料型別,如下表所示:
【android開發】使用PopupWindow實現頁面點選頂部彈出下拉選單
沒有太多花樣,也沒有很複雜的技術,就是簡單的PopupWindow的使用,可以實現點選彈出一個自定義的view,view裡可以隨便設計,常用的可以放一個listview。 demo中我只是一個點選展示,簡單的使用了fade in out的動畫效果,也沒有精美的圖片資源,
【VS開發】【OpenGL開發】OpenGL---Windows下配置與第一個OpenGL程式
面記錄一下Windows下配置OpenGL與我的第一個OpenGL程式。 第一步:選擇一個編譯環境 現在Windows系統的主流編譯環境有Visual Studio,Broland C++ Builder,Dev-C++等,它們都是支援OpenGL的。但這裡我選擇的是V