關(guān)于QT下的觸摸屏_第1頁
關(guān)于QT下的觸摸屏_第2頁
關(guān)于QT下的觸摸屏_第3頁
全文預覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

qwsmouse_qws.cpp在linuette/host/qt/embedded/qt2.3.1/src/kernel目錄下面

Qt的鼠標和觸摸屏驅(qū)動

Qt的鼠標和觸摸屏驅(qū)動主要集中在qwsmouse_qws.cpp當中.在qt中,觸摸屏作為一種特別的鼠標,具有和鼠標同等的處理方法.

在qt初始化的時候,會輸入一些環(huán)境變量,包括

QWS_KEYBORAD:設定鍵盤的類型

QWS_MOUSE_PROT設定鼠標的類型和設備.格式是:

:

protocol包括以下的幾種:MouseMan,IntelliMouse,Microsoft等,

device就是鼠標(或者觸摸屏)的設備文件,一般是/dev/mouse,還可能是/dev/ps2(ps類型的鼠標),ttyS*(串口鼠標),而對于觸摸屏,則會是/dev/Tpanel(在2.4.*的qte版本中).

為鼠標的驅(qū)動是qt的server的功能,而server關(guān)于鼠標的代碼就集中在qwsmouse_qws.cpp中.由于qtembedded是由c+

+語言寫成,所以鼠標的驅(qū)動,實際上就是一些不同的鼠標類的實現(xiàn),他們的基類就是QMouseHandle或者QAutoMouseHandle.

整個的流程是這樣的:

據(jù)環(huán)境變量QWS_MOUSE_PROTO的定義,選擇一個特定的鼠標驅(qū)動程序來完成鼠標的驅(qū)動(選擇一個特定的鼠標類來完成).在特定的鼠標驅(qū)動程序

中,首先打開設備文件,如果設備文件為空,就打開默認的設備文件,相應的默認設備文件在代碼中都有詳細的介紹.然后通過讀取設備文件的數(shù)據(jù),分析得到的數(shù)

據(jù),變換成相應的鼠標消息,通過SendMouseEvent的方式,將其發(fā)送到應用程序.

觸摸屏的不同之處在于,它需要進行調(diào)整.因為從設備得到的數(shù)據(jù)是物理屏的數(shù)據(jù),比如s3c2410的觸摸屏的ad轉(zhuǎn)換是10位精度,也就是說物理數(shù)據(jù)從0~1023,在實際的情況中一般是100~1000之間的數(shù)據(jù),而我們的液晶屏是640*480(或者是其他的,這和觸摸屏的數(shù)據(jù)沒有任何的關(guān)系),所以必須將物理數(shù)據(jù)轉(zhuǎn)換為屏幕上點的數(shù)據(jù).他們之間的轉(zhuǎn)換公式,就必須通過定標的方式來確定.

所謂的定標,就是在屏幕上依次出現(xiàn)topleft,bottomleft,bottomright,topright和center一共5個點,用戶必須依次在這5個點上點擊(在觸摸屏上點擊,觸摸屏就放在液晶屏的上方),這樣我們得到了物理的點,也得到了對應的實際的點,因此就可以計算出相應的參數(shù),計算公式是:

s=1<<16;

a=s*(screen_tl.x()-screen_br.x())/(dev_tl.x()-dev_br.x());

b=0;

c=s*screen_tl.x()-a*dev_tl.x();

d=0;

e=s*(screen_tl.y()-screen_br.y())/(dev_tl.y()-dev_br.y());

f=s*screen_tl.y()-e*dev_tl.y();

假設p是物理的數(shù)據(jù),那么轉(zhuǎn)換到屏幕上點的公式就是:

x=(a*p.x()+b*p.y()+c)/s);

y=(d*p.x()+e*p.y()+f)/s);

需要注意的是:如果物理的點特別的不合常理,比如左邊和右邊的y的差值相差太大,說明屏的線性度太差,不會通過測試.

S3c2410的觸摸屏驅(qū)動是iPAQ兼容的驅(qū)動,編譯的時候需要定義2個宏:

QWS_MOUSE_IPAQ,QWS_MOUSE_IPAQ_RAW.同時設定的是

QWS_MOUSE_PROTO=Tpanel:/dev/h3600_tsraw

上面列舉的參數(shù),會首先從文件/etc/pointercal中讀取,這個文件格式就是:

abcdefs

如果屏的質(zhì)量穩(wěn)定,我們可以將測得的數(shù)據(jù)放在這個文件當中,并取消掉定標的過程,這樣就可以每次使用默認的設置,而不需要重新計算了.

貼個源碼,大家參考一下,在qwsmouse_qws.cpp中添加:

typedefstruct

{

/*liftup:0/touchdown:0x7f*/

shortpressure;

shortxpos;

shortypos;

shorttimestamp;

}ts_sample;//檢索觸筆狀態(tài)

typedefstruct

{

intxscale;

intxtrans;

intyscale;

intytrans;

intreverse;

}ts_cal_values;//觸筆坐標校正

classQWSXscaleMouseHandlerPrivate:publicQWSMouseHandler

{

Q_OBJECT

public:

QWSXscaleMouseHandlerPrivate(MouseProtocolprotocol,QStringmouseDev);

~QWSXscaleMouseHandlerPrivate();

private:

intmouseFD;

intprevstate;

privateslots:

voidreadMouseData();

};

QWSXscaleMouseHandlerPrivate::QWSXscaleMouseHandlerPrivate(MouseProtocolprotocol,QStringmouseDev)

{

if(mouseDev.isEmpty())

mouseDev="/dev/ts";

if((mouseFD=open(mouseDev,O_RDONLY))<0){//重要的是打開特定文件設備

qWarning("Cannotopen%s(%s)",mouseDev.latin1(),strerror(errno));

return;

}else{

sleep(1);

}

prevstate=0;

QSocketNotifier*mouseNotifier;

mouseNotifier=newQSocketNotifier(mouseFD,QSocketNotifier::Read,

this);

connect(mouseNotifier,SIGNAL(activated(int)),this,SLOT(readMouseData()));

}

QWSXscaleMouseHandlerPrivate::~QWSXscaleMouseHandlerPrivate()

{

if(mouseFD>=0)

close(mouseFD);

}

voidQWSXscaleMouseHandlerPrivate::readMouseData()

{

if(!qt_screen)

return;

//YopyTPdatadata;

//unsignedintyopDat[4];

ts_sampledata;//實際設備的數(shù)據(jù)結(jié)構(gòu)

intret;

//ret=read(mouseFD,&yopDat,sizeof(yopDat));

ret=read(mouseFD,&data,sizeof(ts_sample));//讀取實際設備數(shù)據(jù)

if(ret){

//data.status=(YOPY_PRES(yopDat))?1:0;

data.pressure=data.pressure&0xFF;//取得觸筆狀態(tài)

//data.xpos=yopDat.xpos;

//data.ypos=yopDat.ypos;

QPointq;

q.setX(data.xpos);

q.setY(data.ypos);

//if(data.status&&!prevstate){

if(data.pressure==0x01&&!prevstate){//判斷觸筆狀態(tài)

emitmouseChanged(q,Qt::LeftButton);//轉(zhuǎn)換為鼠標左鍵壓下事件

}

//elseif(!data.status&&prevstate){

elseif(!data.pressure&&prevstate){

emitmouseChanged(q,0);

}

prevstate=data.pressure;

}

else{

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論