qte流程分析,鍵盤的掛載和鍵盤訊息的傳遞

2021-06-03 19:07:00 字數 2778 閱讀 8062

initialize()      qwsserver::startup(flags)——init_display()

1.1                             1.2  

1.1 startup

new qwsserver(flags)

new qwsserverdata

opendisplay————qt_init_display

new qwsclient        init_display

openmouse                         1.2

openkeyboard

screenregion

1.2 init_display

qt_fbdpy=new qwsdisplay()——d=new data

qcolor::initialize                    init()

qfont::initialize                      qt_get_screen()

qpainter::initialize

2.1 鍵盤

2.2 滑鼠

2.3 lcd (framebuffer)

2.4 時鐘

2.5 qthread(使用linux執行緒庫)

2.6 qsocketdevice

2.7 qfile,使用檔案操作  ::open

::close :: read ::write  定義於qplatformdefs.h

2.8 記憶體分配 malloc

2.9 管道 pipe

2.10 mmap

2.11 訊號量

kbdfd = ::open(device.isempty()?"/dev/tty0":device.latin1(), o_rdwr|o_ndelay, 0);

if ( kbdfd >= 0 )

qsocketnotifier *notifier;

notifier = newqsocketnotifier( kbdfd, qsocketnotifier::read, this );

connect( notifier,signal(activated(int)), this, slot(readkeyboarddata()) );

qsocketnotifier::qsocketnotifier( int socket, type type, qobject *parent,

const char *name )

: qobject( parent, name )

#if defined(qt_check_range)

if ( socket < 0 )

qwarning( "qsocketnotifier: invalid socket specified" );

#  if defined(q_os_unix)

if ( socket >= fd_setsize )

qwarning( "qsocketnotifier: socket descriptor too large for select()" );

#  endif

#endif

sockfd = socket;

sntype = type;

snenabled = true;

// 主迴圈中第二個是檢測哪個裝置描述符出現了錯誤

nsel = select( highest + 1,

&d->sn_vec[0].select_fds,

&d->sn_vec[1].select_fds,

&d->sn_vec[2].select_fds,

tm );

activatesocketnotifiers();

——default:

res = internalnotify( receiver, e );     //一路沒處理,跑到最後

break;

——consumed = receiver->event( e );  //一路沒處理,跑到最後

——qsocketnotifier::event(qevent::sockact)

——emit activated(sockfd)  // 激發訊號

注:在activatesocketnotifiers();中指定了receiver和event,具體詳看**如下:

int qeventloop::activatesocketnotifiers()

if ( d->sn_pending_list.isempty() )

return 0;

// activate entries

int n_act = 0;

qevent event( qevent::sockact );

qptrlistiteratorit( d->sn_pending_list );

qsocknot *sn;

while ( (sn=it.current()) ) {

++it;

d->sn_pending_list.removeref( sn );

if ( fd_isset(sn->fd, sn->queue) ) {

fd_clr( sn->fd, sn->queue );

n_act++;

return n_act;

Qt E中的鍵盤裝置管理

font face p.msonormal,li.msonormal,div.msonormal p.msocaption,li.msocaption,div.msocaption p.a,li.a,div.a page page section1 div.section1 鍵盤裝置在 qt中表現為...

基於Linux和QT E的軟鍵盤設計

隨著對嵌入式系統體積小型化和操作人性化的要求,以及大尺寸觸控式顯示屏的廣泛應用,在嵌入式系統中採用軟鍵盤實現字元的輸入,已經成為目前的發展主流。qt是乙個跨平台的c 圖形介面庫,是由挪威trolltech公司推出的產品。它採用的是物件導向的程式設計思想,因此,具有良好的可擴充套件性和可移植性,同時支...

鍵盤的彈出和隱藏

第一種 彈出時判斷是哪個控制項下,收起時判斷焦點 protected void hidesoftkeyboard protected void showsoftkeyboard view v 第二種 和第一種相反 protected void hidesoftkeyboard view v prot...