王春陽(yáng),張家坤,楊海濤
(北方民族大學(xué),計(jì)算機(jī)科學(xué)與工程學(xué)院,寧夏銀川,750021)
隨著嵌入式系統(tǒng)的發(fā)展,在Linux下使用Qt開(kāi)發(fā)嵌入式圖形用戶界面是嵌入式應(yīng)用的重點(diǎn)[1]。Qt面向嵌入式系統(tǒng)圖形用戶界面的應(yīng)用程序開(kāi)發(fā)框架,其庫(kù)采用C++封裝,完全面向?qū)ο?,可移植性好[2],所以許多廠家都在使用Qt做為開(kāi)發(fā)平臺(tái),但是在從Qt4到Qt5的大版本更新中取消了QWS,使用了自己觸控模塊,導(dǎo)致Qt5無(wú)法在某些ARM平臺(tái)更改屏幕顯示方向,并且導(dǎo)致tslib作為觸控輸入的設(shè)備觸控失靈。對(duì)于工業(yè)應(yīng)用而言,人們習(xí)慣使用橫屏顯示并且使用tslib作為觸控輸入。Qt5在以上功能的改動(dòng)導(dǎo)致許多開(kāi)發(fā)人員在硬件選型上不得不更換對(duì)應(yīng)的硬件,增加開(kāi)發(fā)成本。由此可見(jiàn),使 Qt5在ARM平臺(tái)實(shí)現(xiàn)屏幕旋轉(zhuǎn)和校準(zhǔn)tslib觸控是非常重要的。
使用 Qt5中的 QGraphicsScene、QGraphicsProxyWidget、QGraphicsView類(lèi)的相應(yīng)函數(shù)實(shí)現(xiàn)屏幕翻轉(zhuǎn)。這些類(lèi)的主要功能如下:
QGraphicsScene對(duì)象是QGraphicsItem對(duì)象的容器[3],主要功能如下:
(1)提供管理大量圖元的快速接口。
(2)傳播鼠標(biāo)、鍵盤(pán)等事件給場(chǎng)景中的每個(gè)圖元。
(3)管理圖元狀態(tài),如圖元選擇和焦點(diǎn)處理。
(4)提供無(wú)變換的渲染功能,如打印。
將需要旋轉(zhuǎn)的窗口加入QGraphicsScene場(chǎng)景中,用QGraphicsProxyWidget代理QGraphicsScene,并且利用QGraphicsProxyWidget的旋轉(zhuǎn)函數(shù)旋轉(zhuǎn)90度或者270度。下面是流程圖:
圖1 屏幕翻轉(zhuǎn)流程圖
tslib 是觸摸屏應(yīng)用級(jí)的一個(gè)程序庫(kù),用來(lái)封裝底層的觸摸屏驅(qū)動(dòng)的操作[4]。因?yàn)樵赒t4中只要配置好tslib的絕對(duì)路徑與頭文件和庫(kù)的路徑就可以使用tslib,但是Qt5增加了自己的觸控模塊,所以要使用tslib必須開(kāi)啟tslib模塊并且需要額外增加tslib的一個(gè)庫(kù)才可以正常使用tslib作為觸控輸入。
(1)聲明QGraphicsScene類(lèi)的對(duì)象:
QGraphics Scene*scene = new QGraphicsScene;
(2)聲明QGraphicsProxyWidget類(lèi)對(duì)象,將要旋轉(zhuǎn)的窗口的指針作為參數(shù)加入scene中:
QGraphicsProxyWidget*w = scene->addWidget(form);
(3)設(shè)置將QGraphicsProxyWidget的對(duì)象翻轉(zhuǎn)90度:
w->setRotation(90);
(4)聲明QGraphicsView類(lèi)對(duì)象:
QGraphicsView*view = new QGraphicsView(scene);
(5)用resize函數(shù)調(diào)整view的大?。?/p>
view->resize(1200,800);
(6)用show函數(shù)將view顯示出來(lái):
view->show();
修改profile 文件,校準(zhǔn)文件的存放位置,觸摸屏設(shè)備,指定幀緩沖設(shè)備,tslib 庫(kù)文件路徑[5]。
(1)在環(huán)境變量中增加QT_QPA_FB_TSLIB=1。
因?yàn)镼t5取消了QWS增加了QPA,所以要使用tslib模塊作為觸控輸入必須使用QT_QPA_FB_TSLIB=1開(kāi)啟tslib模塊。
(2)在環(huán)境變量中增加 LD_PRELOAD=$TSLIB_ROOT/lib/libts.so,$TSLIB_ROOT。
TSLIB_ROOT是tslib所在絕對(duì)路徑。這樣就將tslib相應(yīng)的庫(kù)添加進(jìn)環(huán)境變量,然后更新環(huán)境變量。
如圖2,通過(guò)本文所使用的方法,Qt的窗口已經(jīng)實(shí)現(xiàn)順時(shí)針90度的旋轉(zhuǎn)。此時(shí)將設(shè)計(jì)好的Qt程序移植在ARM平臺(tái)則屏幕也已經(jīng)順時(shí)針旋轉(zhuǎn)90度。本文所使用方法只能旋轉(zhuǎn)加入QGraphicsScene類(lèi)的窗口以及他們的子窗口。其他未加入QGraphicsScene類(lèi)的窗口并不會(huì)旋轉(zhuǎn)。
圖2 屏幕旋轉(zhuǎn)結(jié)果
沒(méi)有使用本文方法前,觸控命中率為 10%。通過(guò)本文所使用的方法校準(zhǔn)之后觸控命中率達(dá)到99%。
本文針對(duì)當(dāng)前Qt5在ARM設(shè)備上屏幕無(wú)法旋轉(zhuǎn)以及tslib觸控失靈的問(wèn)題提出了相應(yīng)的解決方法。通過(guò)本文所使用的方法解決了ARM設(shè)備屏幕無(wú)法旋轉(zhuǎn)的問(wèn)題以及tslib在Qt5上觸控失靈的問(wèn)題。
[1]王浩南, 劉益成.基于嵌入式Linux系統(tǒng)下的Qt開(kāi)發(fā)[J].電腦開(kāi)發(fā)與應(yīng)用, 2010, 23(01): 11-13.
[2]吳燕燕, 賀鋒濤.基于ARM9平臺(tái)上Qt/Embedded的移植與開(kāi)發(fā)[J].液晶與顯示, 2013, 28(02): 261-265.
[3]陸文周.Qt5開(kāi)發(fā)及實(shí)例[M].北京: 電子工業(yè)出版社, 2015: 205.
[4]張敏, 張井崗.Linux平臺(tái)下支持觸摸屏的Qt/Embedded移植[J].計(jì)算機(jī)技術(shù)與展, 2011, 21(10): 154-156+160.
[5]舒明蕾, 華驚宇, 賴(lài)尚校.基于DM365平臺(tái)的Qt/Embedded移植[J].微型機(jī)與應(yīng)用, 2015, 34(05): 19-21.