1. 程式人生 > >【工控機開發】如何在QT下執行shell或外部程式

【工控機開發】如何在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
#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 #-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
umask
022
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 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 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開發Linuxjpeglib庫的安裝詳解

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資料

QtQt執行緒(兩種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